Comment accélérer l'exécution d'une commande ADODB.Command.Execute sur un fichier Excel fermé ?
Bonjour,
J'ai une question certainement facile pour des experts comme ceux présents sur ce site.
Je veux depuis un fichier Excel 2010 ".xlsb" récupérer les données d'un autre Fichier Excel 2010 ".xlsb" qui se trouvent dans une feuille nommée.
Pour cela, j'utilise le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
Sub Test()
'déclarations
Dim Cn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim ADOCommand As ADODB.Command
Dim NomFeuille, Cellule, texte_SQL As String
'Nom de la feuille dans le classeur fermé
NomFeuille = "La feuille"
'Adresse de la cellule contenant la donnée à récupérer
Cellule = "A:D"
'Création de la connexion sur le fichier source
Set Cn = New ADODB.Connection
'Connection aux données source
With Cn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& "C:\Le_Fichier.xlsb" _
& ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With
'Définit la requête.
Set ADOCommand = New ADODB.Command
With ADOCommand
.ActiveConnection = Cn
.CommandText = "SELECT * FROM [" & NomFeuille & "$" & Cellule & "]"
End With
'récupération des données de la source
Set Rst = New ADODB.Recordset
Debug.Print "avant .Execute " & Now()
Set Rst = ADOCommand.Execute
Debug.Print "après .Execute " & Now()
'libération de la mémoire
Set Cn = Nothing
Set Rst = Nothing
Set ADOCommand = Nothing
End Sub |
Mon problème est que mon code VBA est très lent au moment où il effectue le ".Execute".
A titre de comparaison, la mise à jour des données :
- avec VBA ADO (code fourni) => 1minute30secondes
- sans VBA mais avec une feuille connectée à la source Excel => 32secondes
Non seulement c'est lent, mais en plus j'ai plus de 300M de mémoire occupée car il semble que mon code lance l'ouverture en mémoire du fichier Excel source fermé certainement pour effectuer la requête demandée.
Question : existe-t-il un moyen d'optimiser ce code pour au moins atteindre celui sans VBA qui n'est pas pratique à maintenir dans le temps.
Merci.