2017-05-08 149 views
1

我试图擦除表格内容并将其替换为Excel表格中的新内容。如何在ADO excel中使用sql/VBA创建表格

但是每次运行代码都不会产生任何错误,它会在源表之前插入一些空白单元格。

的“base.xlsx”表表如下:

base

如果target.xlsx正在运行的代码,我才把无效但是我想,如果我再次运行它,我得到这个:

target

下面是代码:

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 

回答

1

经过一番研究后,我发现代码中发生了什么。当执行Drop Table时,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 --- 

注意[表$ A1:ZZ1]在SQL语句。