Optimisation temps d'exécution VBA

Bonjour à tous,

Je viens de récupérer un projet et je souhaite optimiser le temps d'exécution de la macro, actuellement son temps d'exécution totale est d'environ 30 minutes.

Pour vous expliquer la situation, je dois extraire les données de 120 fichiers et environ 240 données par fichier que je dois mettre dans un unique fichier reparti en 12 onglets.

Pour cela, je vous joint un fichier avec une macro simplifiée pour avoir l'idée de la façon dont est structurée la macro actuellement.

Pour l'optimiser j'ai 2 pistes :

- essayer de ne plus avoir de boucle for, mais cela me parait compliquer, voir infaisable.

- ou alors copier les données de chaque fichier dans un onglet et ensuite utiliser cet onglet pour renseigner mes autres onglets. Mais première question est-ce possible de copier coller des données dans ouvrir les fichiers sources ? Et deuxième question, est ce que cela me fera réellement gagner du temps ?

Merci par avance pour toutes vos pistes.

Bonsoir

Concernant votre demande sur la possibilité de travailler sur des classeurs fermé : Oui c'est possible et voici la macro à adapter :

' Ouverture de la base de données
Dim CNN As ADODB.Connection
Dim texte_SQL: Dim rs
Dim répertoire, fichier, NomFeuille As String
répertoire = "Votre répertoire\"
'##########################################################
' Facturation
'##########################################################
fichier = "Votre fichier Excel"
Sheets("votre feuille excel").Activate: Sheets("votre feuille excel").Cells.ClearContents: Sheets("votre feuille excel").Cells.UnMerge
NomFeuille = "votre feuille excel"
Set CNN = New ADODB.Connection
CNN.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & répertoire & "\" & fichier & ";Extended Properties='Excel 12.0;HDR=Yes'"
Set rs = CNN.Execute("SELECT * FROM [" & NomFeuille & "$] ")
Sheets("votre feuille excel").[A2].CopyFromRecordset rs
' Recopie des titres de colonnes
Dim i
For i = 0 To rs.Fields.Count - 1
Sheets("votre feuille excel").[A1].Offset(0, i) = rs.Fields(i).Name
Next i
rs.Close
CNN.Close
Set rs = Nothing
Set CNN = Nothing

Ceci aura pour effet de copier toutes les cellules de la feuille "votre feuille excel", du classeur fermé "Votre fichier Excel", dans votre page "votre feuille excel" de votre classeur actuel.

N'hésitez pas à revenir vers moi en cas de besoin.

Bonjour ISRI,

Merci pour ta réponse.

Dans la ligne 10, le Sheets("votre feuille excel"), la feuille en question c'est celle du fichier fermé ou du fichier ouvert ? D'après ce que je comprends c'est celle du fichier ouvert, mais j'ai un doute.

Dans la ligne suivante qui définit le NomFeuille, je suppose donc que c'est celle du classeur fermé ?

De plus, je n'ai pas besoin de copier les titres des colonnes, mais juste une plage de données fixes, qui est la même pour tous les fichiers. Est-il possible de passer outre la boucle for ?

Bonsoir

Vous avez tout compris.

Concernant la boucle For, effectivement vous pouvez l'ignorer, mais les donnés seront insérées en A2.

Si vous voulez vos données en A1, il faudra mettre le parametre HDR à No (HDR pour Header)

CNN.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & répertoire & "\" & fichier & ";Extended Properties='Excel 12.0;HDR=No'"

Tenez moi informé si vous arrivez à implémenter ce code.

Cordialement

Rechercher des sujets similaires à "optimisation temps execution vba"