Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 替换工作表内容而不打开它_Excel_Vba_Ado - Fatal编程技术网

Excel 替换工作表内容而不打开它

Excel 替换工作表内容而不打开它,excel,vba,ado,Excel,Vba,Ado,我使用ADO模型从各种工作簿中收集数据。这很有效 我现在想将此数据放入另一个已关闭的工作簿中,但我希望能够在之前删除工作表内容 如何在不使用VBA打开工作簿的情况下删除工作表内容? 如何将记录集传输到已关闭的wb?/使用ADO将一个表复制到另一个表? 编辑: 我能够在新的工作表中从一个工作簿向另一个工作簿插入一些数据,但无法在现有工作表中输出数据 当我尝试INSERT INTO语句时,出现了一个错误。无法更新,数据库或对象为只读 代码如下: Sub tranfert() Dim Exc

我使用ADO模型从各种工作簿中收集数据。这很有效

我现在想将此数据放入另一个已关闭的工作簿中,但我希望能够在之前删除工作表内容

如何在不使用VBA打开工作簿的情况下删除工作表内容?

如何将记录集传输到已关闭的wb?/使用ADO将一个表复制到另一个表?

编辑:

我能够在新的工作表中从一个工作簿向另一个工作簿插入一些数据,但无法在现有工作表中输出数据

当我尝试INSERT INTO语句时,出现了一个错误。无法更新,数据库或对象为只读

代码如下:

Sub tranfert()

    Dim ExcelCn As ADODB.Connection
    Dim ExcelRst As ADODB.Recordset
    Dim Cn As New ADODB.Connection
    Dim Rst As New ADODB.Recordset
    Dim maBase As String, maFeuille As String
    Dim maTable As String, NomClasseur As String
    Dim nbEnr As Long

    maBase = "C:\Users\Lichar\Documents\Base.xlsx"
    maTable = "[table$]"
    NomClasseur = "C:\Users\Lichar\Documents\Target.xlsx"
    maFeuille = "Sheet2"


    'Connection to base file
    Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                   "Data Source=" & maBase & ";" & _
                   "Extended Properties=""Excel 12.0;HDR=NO;"""
    'Requète dans la table Access
    Rst.Open "SELECT * FROM " & maTable, Cn

    'Connection to target file
    Set ExcelCn = New ADODB.Connection
    ExcelCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                   "Data Source=" & NomClasseur & ";" & _
                   "Extended Properties=""Excel 12.0;HDR=NO;"""

    '-----------------------------------------
    'Create a new sheet and output data
    Cn.Execute "SELECT * INTO [Excel 12.0;" & _
        "Database=" & NomClasseur & "].[" & maFeuille & "] FROM " & maTable, nbEnr

    '-----------------------------------------
    'Trying to ouput data in existing sheet
    'Cn.Execute "INSERT INTO [sheet$] IN '' [Excel 12.0;" & _
    '    "Database='" & NomClasseur & "'] SELECT * FROM " & maTable, nbEnr


    Rst.Close
    Cn.Close
    Set ExcelRst = Nothing
    Set ExcelCn = Nothing
**编辑2**

我已经找到了使用INSERT-INTO的部分解决方案。下面是一个工作代码,它从表工作表中的source.xlsx获取数据,并将其输出(或追加)到工作表中的target.xlsx中:

Sub SQLQUERY()
    Dim Cn As ADODB.Connection
    Dim QUERY_SQL As String
    Dim Rst As ADODB.Recordset
    Dim ExcelCn As ADODB.Connection
    Dim ExcelRst As ADODB.Recordset

    SourcePath = "C:\Users\BVR\Documents\Source.xlsx"
    TargetPath = "C:\Users\BVR\Documents\Target.xlsx"

    CHAINE_HDR = "[Excel 12.0 MACRO;Provider=Microsoft.ACE.OLEDB.12.0;Mode=Read;Extended Properties='HDR=YES;'] "


    Set Cn = New ADODB.Connection

    STRCONNECTION = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source='" & SourcePath & "';" & _
    "Mode=Read;" & _
    "Extended Properties=""Excel 12.0 Macro;"";"


    QUERY_SQL = _
    "SELECT * FROM [table$] "


    Cn.Open STRCONNECTION

    Set ExcelCn = New ADODB.Connection
    ExcelCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                   "Data Source=" & TargetPath & ";" & _
                   "Extended Properties=""Excel 12.0;HDR=NO;"""

    Cn.Execute "INSERT INTO [sheet$] IN '" & TargetPath & "' 'Excel 12.0;' " & QUERY_SQL


    '--- Fermeture connexion ---
    Cn.Close

End Sub
我注意到两个问题。首先,如果我的一个字段名中包含“.”,代码将生成一个错误,说明INSERT INTO包含未知字段名。这是有问题的。
其次,我不能只选择我想要的列。如果我“选择[F1],[F2]…”将出现一个错误,指出存在循环引用。(不过,我可以使用字段名来选择我想要的列)

这种问题以前已经被问过很多次了,到目前为止,我还没有看到任何能够在不打开文件的情况下写入文件的答案。我只是想澄清一下:我所说的“打开它”并不一定是指“视觉上打开它”,而是至少要锁定文件。我知道这是可能的。这里有一个从access数据库传输到电子表格的示例。我想做同样的事情,但以工作表作为源。(法语)尽管法语介绍(在链接中)表明代码没有打开Excel文件,但您可以自己看到,其中有一个
ExcelCn.open
命令,它将
NomClasseur
(或Excel文件名)作为连接字符串传递,从而打开文件(在某种意义上,文件上被锁定)。因此,这里有一种情况,即数据被写入(现有)文件,而Excel不向您显示打开过程。在后台打开文件写入文件时,仍然会对文件加锁。代码结束时,使用
Set ExcelCn=Nothing
关闭文件。我现在明白你的意思了。当我从关闭的工作簿中获取数据时,会发生相同的过程吗?对我来说,它看起来像ExcelCn。打开到文件的连接,而不是文件本身,这会产生很大的不同。我错了吗?如果代码/解决方案对您来说足够好,那么您可以将
ExcelCn.Execute“create table”&maFeuille&“(“&listedable&”)行交换为
ExcelCn.Execute“delete*from[YourTableName$]”
以删除某个表/工作表中的所有记录/行。但是,您只能从该工作表中删除行。要从基础Excel文件中删除整个工作表/表格,必须将其打开。