如何在excel中用sql/VBA和ADO创建表格

如何在excel中用sql/VBA和ADO创建表格,sql,excel,vba,ado,Sql,Excel,Vba,Ado,我正在尝试删除表格内容,并用excel工作表中的新内容替换它 代码不会引发任何错误,但是每次我运行它时,它都会在源表前面插入一些blank单元格 “base.xlsx”表格表如下所示: 如果target.xlsx在运行代码之前无效,我会得到我想要的,但是如果我再次运行它,我会得到以下结果: 代码如下: Sub SQLQUERY() Dim Cn As ADODB.Connection Dim QUERY_SQL As String Dim ExcelCn As AD

我正在尝试删除表格内容,并用excel工作表中的新内容替换它

代码不会引发任何错误,但是每次我运行它时,它都会在源表前面插入一些blank单元格

“base.xlsx”表格表如下所示:

如果target.xlsx在运行代码之前无效,我会得到我想要的,但是如果我再次运行它,我会得到以下结果:

代码如下:

Sub SQLQUERY()

    Dim Cn As ADODB.Connection
    Dim QUERY_SQL As String
    Dim ExcelCn As ADODB.Connection

    SourcePath = "C:\Path\to\base.xlsx"
    TargetPath = "C:\Path\to\target.xlsx"

    CHAINE_HDR = "[Excel 12.0;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;"";"

    Colonnes = "[Col#1], Col2"

    QUERY_SQL = _
    "SELECT " & Colonnes & " FROM [base$] " & _
    "IN '" & SourcePath & "' " & CHAINE_HDR

    MsgBox (QUERY_SQL)

    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=YES;"""

    ExcelCn.Execute "DROP TABLE [sheet$]"

    ExcelCn.Execute "CREATE TABLE [sheet$] ([C1] Float, [C2] Float, [C3] Float)"

    Cn.Execute "INSERT INTO [sheet$] (C1, C3) IN '" & TargetPath & "' 'Excel 12.0;' " & QUERY_SQL

    '--- Fermeture connexion ---

    Cn.Close
    ExcelCn.Close


End Sub

经过一番研究,我发现了代码的情况。当执行
拖放表时,Excel保留“活动范围”,因此INSERT INTO将在活动范围后插入数据

要解决此问题,我们需要使用表名指定一个范围:

ExcelCn.Execute "DROP TABLE [sheet$]"

ExcelCn.Execute "CREATE TABLE [sheet$] ([C1] Float, [C2] Float, [C3] Float)"

Cn.Execute "INSERT INTO [sheet$A1:ZZ1] (C1, C3) IN '" & TargetPath & "' 'Excel 12.0;' " & QUERY_SQL

'--- Fermeture connexion ---
注意sql语句中的[表$A1:ZZ1]