Améliorer la rapidité d'une macro

Hello les génies d'Excel !

Ca fait un petit moment que je ne suis pas venue vous voir !

Je suis en train de chercher à "accélérer" l'exécution d'une macro que j'ai dans un de mes fichiers. Je pense que cela vient de la construction de ma macro.

Ce que je lui demande c'est de me copier plusieurs onglets dans un onglet (dans chaque onglet il y a un tableau et je copie ces données pour les mettre dans un seul onglet) puis je lui demande de modifier le nom des lignes.

16chats.xlsm (23.39 Ko)

Au moment où elle passe à l'exécution du changement des lignes ; elle met un temps super long. Je me dis que peut-être au niveau de la transition il manque peut-être une écriture ou une déclaration (ou alors pas du tout). Ce qui me fait dire ceci ; c'est que j'utilise la même exécution de nom de ligne seule dans un autre fichier sans qu'il y ait d'autres commandes et elle va beaucoup plus vite.

Dans le fichier joint ; vous trouverez la macro comme elle est écrite : alors je l'ai simplifié donc elle va super méga vite ! lol Mais dans mon fichier d'origine j'ai 15 onglets et j'ai au moins 23 milles lignes donc je sais qu'elle met un peu de temps mais je pense qu'il manque quelque chose.

Merci pour votre aide !

Bonsoir,

vos feuilles à importer sur l'onglet base, ont elles toutes la même structure ?
A priori au niveau des tableaux ils ont tous 23 colonnes, avec les données ordonnées de la même manière, non ?

Solution première, mettre ne début de votre code ces trois lignes de commandes :

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual

Bon je sais la deuxième n'est pas utile vous pouvez ne pas la mettre.
En fin de code vous faites l'inverse :

    Application.EnableEvents = True
    Application.Calculation =xlCalculationAutomatic

Là encore la première ligne est à mettre que si vous avez mis la seconde dans la partie du haut. Pour le ScreenUpdating, vous pouvez le passer à True mais ce n'est pas nécessaire c'est automatique avec le End Sub (tout comme pour un On Error Resume Next s'il faut l'annuler juste avant de sortir de la sub...)

Et principalement, au lieu de faire des copier/coller de sheets à sheets, il vaut mieux passer par des tableaux "VBA". Je ne connais pas leur limites mais ils permettraient peut-être de créer un tableau unique qu'il suffit d'injecter une seule fois sur la feuille base une fois toutes les données récoltées.

Et s'ils ne sont pas assez grand alors passer par de tel tableau sous VBA vous permettra de faire "l'échange" de données beaucoup plus rapidement que de travailler directement sur la feuille : en effet les accès feuilles par VBA sont chronophages.

Pour votre fichier test, il aurait été intéressant d'avoir trois ou 4 feuilles représentatives pour les tests.

@ bientôt

LouReeD

Merci LouReeD !
Les tableaux ont tous la même structure en colonne, en revanche ils varient en nombre de ligne. Je les copie colle dans un onglet "base" l'un en dessous de l'autre puis modifie dans une colonne le nom des lignes.

Penses-tu que l'on peut récolter et stocker les données dans un tableau VBA comme tu le décris ? Après dans l'exécution de la macro c'est pas tellement ça qui pose problème car cela va très vite, c'est juste au moment du passage où je demande à ce que la colonne doit modifier le nom des lignes qui met du temps et qui arrive à la fin de l'exécution de ma commande (de tout ce que je lui demande de faire dans ma macro).

Bonjour,

Le problème est que tu l'a tellement simplifié ta macro que maintenant elle ne veut plus rien dire !

Donc pour l'instant je t'ai fait une macro qui copie la feuille Export dans la feuille base.

Maintenant pour les autres feuilles, il faut voir la composition exacte du classeur : Est-ce qu'il faut copier toutes les feuilles autre que base.

Et quelle modification doit on faire ?

3chats-vg.xlsm (27.33 Ko)

A+

Bonsoir,

si c'est la partie de renommage vous pouvez essayer ceci :

    ' dernière ligne de la colonne AQ
    derligne = Range("AQ" & Rows.Count).End(xlUp).Row
    ' avec la plage de la colonne AQ de la ligne 13 à derligne
    Range("AQ13:AQ" & derligne).Value = "CHAT"

En partant du principe que cela commence en ligne 13 et que TOUTES les valeurs sont à remplacer par "CHAT". Maintenant si ce n'est que le mot Export à remplacer par CHAT et qu'il n'y a pas que Export d'inscrit dans la colonne...et bien utilisez votre code mais en remplaçant
SearchOrder:=xlByRows
par : SearchOrder:=xlByColumns
En effet, en ROWS cela "oblige" Excel à parcourir les plus de 16000 colonne pour passer à la cellule du dessous ! Enfin je crois, non ?

@ bientôt

LouReeD

Bonjour à tous!

MjEmStras, si tous les onglets ou feuilles sont pareilles tu peux utiliser ce petit code

Sub Copier_Coller_2()
X = InputBox("Quel onglet voulez-vous copier vers BASE?")
Dim F1, F2 As Worksheet
Set F1 = Worksheets("Base")
Set F2 = Worksheets(X)
Application.ScreenUpdating = False
F2.Range("A5:W10000").Copy Destination:=F1.Range("A" & Rows.Count).End(xlUp).Offset(1, 0)

'FACULTATIF SI VOUS VOULEZ EFFACER LE CONTENU DE L'ONGLET SÉLECTIONNÉ
'F2.Cells.ClearContents
F1.Range("A13:A40000").Copy F1.Range("AQ13")
F1.Range("AQ13:AQ40000").Replace What:="EXPORT", Replacement:="CHAT", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
MsgBox ("Copier et coller les données" & Chr(13) & Chr(10) & "Réussite Totale")
Application.ScreenUpdating = True
End Sub

Bonne journée!

Bonsoir,

Le dernier code fourni par Nordik_Nation a t il était satisfaisant ? Une semaine après les tests ont du être effectués, non ?

@ bientôt

LouReeD

Rechercher des sujets similaires à "ameliorer rapidite macro"