2017-05-08 4 views
1

J'essaye d'effacer le contenu de la table et de le remplacer par du nouveau contenu dans une feuille Excel.Comment CREER TABLE en utilisant sql/VBA dans Excel avec ADO

Le code ne soulève aucune erreur mais chaque fois que je l'exécute, il insère quelques cellules vides avant la table source.

La feuille de table « » base.xlsx ressemble à ceci:

base

Si target.xlsx est vide avant d'exécuter le code que je ce que je veux si je le lance à nouveau je reçois ceci:

target

Voici le code:

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 

Répondre

1

Après quelques recherches, j'ai découvert ce qui se passe avec le code. Lorsque Drop Table est exécuté, Excel conserve la "plage active" et INSERT INTO insère les données après la plage active.

Pour contrer cela, nous devons spécifier une plage avec le nom de la 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 --- 

Notez le [feuille $ A1: ZZ1] dans l'instruction SQL.