• Initiateur de la discussion Initiateur de la discussion etigi
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

E

etigi

Guest
Bonjour à tous,
je me régale depuis quelques temps sur ce site, et grâce à vous j'ai pu établir une macro qui me permet d'enregistrer les données d'une feuille vers une autre feuille, mais je rencontre un soucis de temps. Cette macro enregistre en fait, non seulement les données de ma feuille et en même temps tout le classeur.
Et le classeur comporte une vingtaine de feuille, c'est une bdd assez lourde.
Si quelqu'un pouvait m'aider !!!
Ce serait le top.
merci d'avance

Etienne


Ma macro ressemble à çà

Sub vince644()
L = Sheets("Enregistr").Range("A65530").End(xlUp).Row + 1
With Sheets("Enregistr")
.Range("A" & L) = Application.CountA(Sheets("Enregistr").Range("B:B"))
.Range("B" & L) = Sheets("Quittances").Range("N21").Value
.Range("C" & L) = Sheets("Quittances").Range("O19").Value
.Range("D" & L) = Sheets("Quittances").Range("Q2").Value
.Range("E" & L) = Sheets("Quittances").Range("V32").Value
.Range("F" & L) = Sheets("Quittances").Range("V33").Value
.Range("G" & L) = Sheets("Quittances").Range("V34").Value
.Range("H" & L) = Sheets("Quittances").Range("V35").Value
.Range("I" & L) = Sheets("Quittances").Range("V36").Value
.Range("J" & L) = Sheets("Quittances").Range("V37").Value
.Range("K" & L) = Sheets("Quittances").Range("V38").Value
.Range("L" & L) = Sheets("Quittances").Range("V39").Value
.Range("M" & L) = Sheets("Quittances").Range("V40").Value
.Range("N" & L) = Sheets("Quittances").Range("U42").Value
.Range("O" & L) = Sheets("Quittances").Range("U44").Value
.Range("P" & L) = Sheets("Quittances").Range("V52").Value
.Range("Q" & L) = Sheets("Quittances").Range("V53").Value
.Range("R" & L) = Sheets("Quittances").Range("V54").Value
.Range("S" & L) = Sheets("Quittances").Range("V55").Value
.Range("T" & L) = Sheets("Quittances").Range("V56").Value
.Range("U" & L) = Sheets("Quittances").Range("V57").Value
.Range("V" & L) = Sheets("Quittances").Range("V58").Value
.Range("W" & L) = Sheets("Quittances").Range("U60").Value
.Range("X" & L) = Sheets("Quittances").Range("U62").Value
.Range("Y" & L) = Sheets("Quittances").Range("S52").Value
End With
Application.DisplayAlerts = False
ActiveWorkbook.Save
End Sub
 
Dernière modification par un modérateur:
Re : macro trop lente

Bonsoir et bienvenu sur la forum Etigi,

N'ayant pas ton fichier, difficile de pouvoir réduire le temps d'exécution, faute de pouvoir tester nos réalisations.

Il y a déjà surement moyen de raccourcir, simplifier, rendre plus rapide ta macro si tu modifié ton fichier excel!

Au vu de ta macro, il semble que ton tableau ait une présentation pas très pratique et optimal!

En tout cas voici comment tu peux raccourcir légèrement ton code (mais je doute que le temps d'exécution y gagne beaucoup).

Code:
Sub vince644()

Application.ScreenUpdating = False

Sheets("Enregistr").select

L = Range("A65530").End(xlUp).Row + 1

With Sheets("Quittances")
    Range("A" & L) = Application.CountA(Range("B:B"))
    Range("B" & L) = .Range("N21")
    Range("C" & L) = .Range("O19")
    Range("D" & L) = .Range("Q2")
    Range("E" & L) = .Range("V32")
    Range("F" & L) = .Range("V33")
    Range("G" & L) = .Range("V34")
    Range("H" & L) = .Range("V35")
    Range("I" & L) = .Range("V36")
    Range("J" & L) = .Range("V37")
    Range("K" & L) = .Range("V38")
    Range("L" & L) = .Range("V39")
    Range("M" & L) = .Range("V40")
    Range("N" & L) = .Range("U42")
    Range("O" & L) = .Range("U44")
    Range("P" & L) = .Range("V52")
    Range("Q" & L) = .Range("V53")
    Range("R" & L) = .Range("V54")
    Range("S" & L) = .Range("V55")
    Range("T" & L) = .Range("V56")
    Range("U" & L) = .Range("V57")
    Range("V" & L) = .Range("V58")
    Range("W" & L) = .Range("U60")
    Range("X" & L) = .Range("U62")
    Range("Y" & L) = .Range("S52")
End With

Application.DisplayAlerts = False
Application.ScreenUpdating = True

ActiveWorkbook.Save

End Sub

Tiens nous au courant pour savoir le temps gagné par cette macro (et si elle fonctionne 😀).

Bon test
 
Re : macro trop lente

Bonsoir,

Une autre proposition plus courte encore, mais plus rapide????

Code:
Sub vince644()

Dim Colonne As Long
Dim Ligne As Long

Application.ScreenUpdating = False

Sheets("Enregistr").Select

L = Range("A65530").End(xlUp).Row + 1

With Sheets("Quittances")
    Range("A" & L) = Application.CountA(Range("B:B"))
    Range("B" & L) = .Range("N21")
    Range("C" & L) = .Range("O19")
    Range("D" & L) = .Range("Q2")
    
  Ligne = 32
  For Colonne = 5 To 13
    Cells(L, Colonne) = .Range("V" & Ligne)
    Ligne = Ligne + 1
  Next Colonne
  
    Range("N" & L) = .Range("U42")
    Range("O" & L) = .Range("U44")
    
  Ligne = 52
  For Colonne = 17 To 23
    Cells(L, Colonne) = .Range("V" & Ligne)
    Ligne = Ligne + 1
  Next Colonne
   
    Range("W" & L) = .Range("U60")
    Range("X" & L) = .Range("U62")
    Range("Y" & L) = .Range("S52")
End With

Application.DisplayAlerts = False
Application.ScreenUpdating = True

ActiveWorkbook.Save

End Sub

Bonne fin de soirée
 
Re : macro trop lente

Bonjour etigi, bienvenue sur XLD,
salut Excel-lent 😉,

Voici une autre proposition par transposition des plages pour certain cas:

Code:
Sub vince644()

Application.ScreenUpdating = False

Sheets("Enregistr").Select

L = Range("A65530").End(xlUp).Row + 1

With Sheets("Quittances")
    Range("A" & L) = Application.CountA(Range("B:B"))
    Range("B" & L) = .Range("N21")
    Range("C" & L) = .Range("O19")
    Range("D" & L) = .Range("Q2")
    [COLOR=Blue][B]Range("E" & L & ":M" & L).Value = [/B][B]Application.Transpose(.Range("V32:V40").Value)[/B][/COLOR]
    Range("N" & L) = .Range("U42")
    Range("O" & L) = .Range("U44")
    [B][COLOR=Blue]Range("P" & L & ":V" & L).Value = [/COLOR][COLOR=Blue]Application.Transpose(.Range("V52:V58").Value)[/COLOR][/B]
    Range("W" & L) = .Range("U60")
    Range("X" & L) = .Range("U62")
    Range("Y" & L) = .Range("S52")
End With

Application.DisplayAlerts = False
Application.ScreenUpdating = True

ActiveWorkbook.Save

End Sub

Et le classeur comporte une vingtaine de feuille, c'est une bdd assez lourde.
Il peut même en comporter une 100ène, cela ne va pas ralentir le code que tu nous donnes. Ah si, lors de la sauvegarde mais là la durer de cette sauvegarde ne pourra pas être réduite.
Mais peut-être veux-tu garder uniquement ces 2 feuilles?
Bref, soit plus précis dans ta demande.
 
Re : macro trop lente

Salut Skoobi,

Etigi à dit:
Et le classeur comporte une vingtaine de feuille

Il devra rajouter a sa macro une boucle du genre

Code:
[COLOR="Blue"]For[/COLOR] Feuille = [COLOR="Red"]2[/COLOR] [COLOR="Blue"]To[/COLOR] Sheet.Count

   la macro

[COLOR="Blue"]Next[/COLOR] Feuille

En partant du principe que la 1ère feuille est la feuille récap nommé "enregistr"?

ou la boucle For Each ou ...

Il faut savoir que plus tu auras de feuilles, évidement, plus la macro sera longue! (mais c'est un peu normal, elle aura plus de boulot à faire 😀).

Bonne fin de soirée à tous
 
Re : macro trop lente

la 2eme macro est moins efficace, mais je n'ai pas pris le temps de comprendre le fonctionnement, merci encore,
je me suis contenté d'un copier/coller et adaptation
mais je trouve la 1er version plus rapide,
cordialement,
Étienne
 
Re : macro trop lente

Effectivement on en apprend tous les jours, et aujourd'hui je viens d'apprendre comment modifier une macro trop lente, l'amélioration est sensible. C'est un gain de temps énorme.
Merci à vous, je comprends bien votre passion, j'aimerais un jour rendre les services que vous offrez.
Merci encore,
je retourne à mon fichier et j'adapte,
cordialement,
Étienne
 
Re : macro trop lente

Bonsoir Etigi,

Une "boucle" permet de faire gagner du temps, simplifier un programme, éviter les répétitions.

Tu trouvera ici une liste non exhaustive de boucle avec le rôle de chacune et la façon de les utiliser.

-----------------------------------------------------------------------
=> Concrètement

Voici ton code initial :
Code:
    Range("[COLOR="Red"]E[/COLOR]" & L) = .Range("V[COLOR="Blue"]32[/COLOR]")
    Range("[COLOR="Red"]F[/COLOR]" & L) = .Range("V[COLOR="Blue"]33[/COLOR]")
    Range("[COLOR="Red"]G[/COLOR]" & L) = .Range("V[COLOR="Blue"]34[/COLOR]")
    Range("[COLOR="Red"]H[/COLOR]" & L) = .Range("V[COLOR="Blue"]35[/COLOR]")
    Range("[COLOR="Red"]I[/COLOR]" & L) = .Range("V[COLOR="Blue"]36[/COLOR]")
    Range("[COLOR="Red"]J[/COLOR]" & L) = .Range("V[COLOR="Blue"]37[/COLOR]")
    Range("[COLOR="Red"]K[/COLOR]" & L) = .Range("V[COLOR="Blue"]38[/COLOR]")
    Range("[COLOR="Red"]L[/COLOR]" & L) = .Range("V[COLOR="Blue"]39[/COLOR]")
    Range("[COLOR="Red"]M[/COLOR]" & L) = .Range("V[COLOR="Blue"]40[/COLOR]")

On cherche la partie qui se répète :
-> E -> F -> G -> H -> I -> ... la colonne de cette cellule se décale de 1 colonne vers la droite à chaque fois
-> 32 -> 33 -> 34 -> 35 -> 36 -> ... la ligne de cette cellule se décale d'1 ligne vers le bas à chaque fois


on cherche la boucle la mieux adapté et/ou qu'on maîtrise le mieux :
Code:
  [COLOR="Blue"]Ligne = 32[/COLOR]
  [COLOR="Gray"][B]For[/B][/COLOR] [COLOR="Red"]Colonne[/COLOR] = [COLOR="Red"][I]5[/I][/COLOR] To [COLOR="Red"][U]13[/U][/COLOR]
    Cells(L, Colonne) = .Range("V" & Ligne)
    [COLOR="Blue"]Ligne = Ligne + 1[/COLOR]
  [COLOR="DarkOrange"]Next[/COLOR] Colonne

A = 1
B = 2
E = 5
...
M = 13

For Colonne = 5 To 13 'signifie que la variable "Colonne", va prendre la valeur 5, la partie de code en dessous jusqu'à Next va s'éxécuter.

Puis va retourner à For, et la valeur Colonne va prendre la valeur précédente (5) et rajouter 1 puis le code en dessous jusqu'à Next va s'éxécuter.

et il va faire cela jusqu'à ce que la valeur colonne atteigne la valeur 13

Il aurait été possible d'imbriquer deux boucles pour gérer également l'incrémentation (augmenter un chiffre de façon régulière) pour le numéro de la ligne, mais j'ai préféré faire ainsi car plus simple à comprendre pour un néophite.

C'est plus clair ainsi?

Bonne fin de semaine
 
Dernière édition:
Re : macro trop lente

Re,

Mais si tu veux, nous pouvons raccourcir le code :
Code:
Ligne = 32
  For Colonne = 5 To 13
    Cells(L, Colonne) = .Range("V" & Ligne)
    Ligne = Ligne + 1
  Next Colonne

encore plus, par exemple ainsi :
Code:
For Colonne = 5 To 13
    Cells(L, Colonne) = .Range("V" & Colonne + 27)
Next Colonne
j'utilise la même variable pour deux choses à la fois! Plus court, plus concis, mais difficilement compréhensible pour un non initié 😉

Le code Range("A15") et le code cells(15, 1)
le numéro ou lettre représentant la colonne
le numéro indiquant le numéro de la ligne

Tu as remarqué que pour range() tu as dans l'ordre : colonne puis ligne
pour cells() tu as dans l'ordre : la ligne puis la colonne (l'inverse).

Avantage de cells() lorsqu'on débute et quand a besoin de faire bouger le numéro de la colonne, c'est le code le plus facile à utiliser.

Mais évidement, il existe de nombreuses autres méthodes comme par exemple : offset()

Tu vois, il existe des tonnes de solution pour faire la même chose.

L'important c'est que dans un premier temps, ça fonctionne et soit utilisable!
Et seulement après, en fonction de tes connaissance, tu essaye de simplifier ton code en rajoutant des boucles, des ...

Si tu as d'autres questions, n'hésite pas, il y aura toujours quelqu'un pour te répondre.

A+
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

X
Réponses
10
Affichages
976
Xyzka
X
D
  • Résolu(e)
Réponses
3
Affichages
713
débutantplus
D
D
  • Question Question
Réponses
9
Affichages
1 K
N
Réponses
1
Affichages
963
B
Réponses
5
Affichages
5 K
B
C
  • Question Question
3 4 5
Réponses
68
Affichages
6 K
M
Réponses
6
Affichages
2 K
M
Retour