如何使用 ADO 在 excel 中使用 sql/VBA 创建 TABLE

How to CREATE TABLE using sql/VBA in excel with ADO

我正在尝试删除 table 内容并将其替换为 excel sheet 中的新内容。

代码不会引发任何错误,但是每次我 运行 它时, 它都会在源 table 之前插入一些空白单元格。

'base.xlsx' table sheet 看起来像这样:

如果 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

经过一番研究,我发现了代码的问题所在。当执行 Drop Table 时,Excel 保留 "active range",因此 INSERT INTO 将在活动范围后插入数据。

为了解决这个问题,我们需要用 table 名称指定一个范围:

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 语句中的 [sheet$A1:ZZ1]