optimiser une macro

nicho

XLDnaute Occasionnel
salut à vous tous,

j'ai créé une macro qui copie les cellules(a4:ae4) de la feuil1 dans la dernière ligne vide de la feuil B.D.
je joint un la macro en pièce jointe

mon but svp est de la rendre plus vite (chez moi elle prend environ 10 secondes pour s’exécuter car le contenu des cellule et grand en plus il y a plusieurs macro enregistré)

merci
 

Pièces jointes

  • copier dans la dernière ligne vide.xls
    31.5 KB · Affichages: 58

camarchepas

XLDnaute Barbatruc
Re : optimiser une macro

Bonjour Nicho, carcharodon-carcharias, le forum et toutes les paires d'yeux passant par ici

Presque la même, en un peu plus compact, avec quelques commentaires en plus

et no_ligne passé en long car en byte ou en integer si nombre de lignes totales supérieur à 255 ou 32767 alors badaboum , dépassement de capacité

Code:
Private Sub CommandButton1_Click()

'COPIER DANS LA BASE DE DONNEE

Dim no_ligne As Long
        
 'no_ligne = N° de ligne de la dernière cellule non vide de la colonne +1
  no_ligne = Sheets("B.D.").Range("A" & Rows.Count).End(xlUp).Row + 1
        
 'Désactive le rafraichissement écran Excel
 Application.ScreenUpdating = False
  ' Mode le calcul sur déclenchement manuel
  Application.Calculation = xlCalculationManual
   'Copie de l'ensemble de la ligne
   Sheets("Feuil1").Range("A4:AE4").Copy Destination:=Sheets("B.D.").Range("A" & no_ligne & ":AE" & no_ligne)
  'Réactive le rafraichissement
  Application.ScreenUpdating = True
 'Réactive le mode de calcul automatique
 Application.Calculation = xlCalculationAutomatic
End Sub
 

laetitia90

XLDnaute Barbatruc
Re : optimiser une macro

bonjour nicho ,carcharodon-carcharias:) :),camarchepas :):)
une autre facon en utilisant... SET

Code:
Private Sub CommandButton1_Click()
 Dim c As Range
 With Application
 .Calculation = xlCalculationManual: .ScreenUpdating = False: .DisplayAlerts = False
 With Sheets("Feuil1")
 Set c = .Range("a4:ae4")
 End With
 c.Copy Destination:=Sheets("B.D.").Range("a" & Rows.Count).End(xlUp)(2)
 .Calculation = xlCalculationAutomatic: .ScreenUpdating = True: .DisplayAlerts = True
 End With
End Sub
 

Efgé

XLDnaute Barbatruc
Re : optimiser une macro

Bonjour nicho, C.C :) , camarchepas :), laetitia90 :),
Une version sans copie donc sans Application. .... .
VB:
Private Sub CommandButton1_Click()
With Sheets("B.D.")
    .Rows(.Range("a" & Rows.Count).End(xlUp)(2).Row).Value = Sheets("Feuil1").Rows(4).Value
End With
End Sub

Cordialement
 

laurent950

XLDnaute Accro
Re : optimiser une macro

Bonjour,

J'ai compressé le code mais je ne l'est obtimisé : (La methode est L'objet les deux feuilles)

VB:
Private Sub Test()

' COPIER DANS LA BASE DE DONNEE
' Code compressé

Dim no_ligne As Integer
        
       'no_ligne = N° de ligne de la dernière cellule non vide de la colonne +1
        no_ligne = Sheets("B.D.").Range("A65536").End(xlUp).Row + 1
        
        For i = 1 To 31
        Sheets("B.D.").Cells(no_ligne, i) = Sheets("Feuil1").Range(Sheets("Feuil1").Cells(4, i), Sheets("Feuil1").Cells(4, i))
        Next i
        
        ' Sheets("Feuil1").Select  (Inutile car la méthode est l'objet)
End Sub

Laurent
 
Dernière édition:

laetitia90

XLDnaute Barbatruc
Re : optimiser une macro

re, bonjour tous, bonjour Laurent
pour l'ami Fred dans ce cas la tu recopie uniquement les valeurs
mais bon c'est peut être le but recherche vu que nicho ne le precise pas dans ce cas il est peut être mieux de passer par un "tablo" plus rapide entre 3 & 4 fois plus rapide
ce type de code

Code:
Dim t()
 t = Sheets("Feuil1").Range("a4:ae4").Value
 Sheets("B.D.").Range("a" & Rows.Count).End(xlUp)(2).Resize(UBound(t, 1), UBound(t, 2)) = t

ou encore vu que l'on c'est pas si son fichier est plein de formule

Code:
Dim t()
 With Application
 .Calculation = xlCalculationManual: .ScreenUpdating = False: .DisplayAlerts = False
 t = Sheets("Feuil1").Range("a4:ae4").Value
 Sheets("B.D.").Range("a" & Rows.Count).End(xlUp)(2).Resize(UBound(t, 1), UBound(t, 2)) = t
 .Calculation = xlCalculationAutomatic: .ScreenUpdating = True: .DisplayAlerts = True
 End With

d'ailleurs un peu surprise que le code initial dure 10 secondes
tres gros fichier.... pc un peu lent ???
il parle de macros enregistree que cela veut t'il dire pour lui mystere???
 

Efgé

XLDnaute Barbatruc
Re : optimiser une macro

Re à tous
@ laetitia90 :)
Il est exact que je ne "recopie" que les valeurs.
Si tu utilise un tableau tu ne fais rien d'autre, et je ne pense pas que cela soi réellement plus rapide dans ce cas.
En plus si il y a des données en ligne 5 tu vas les embarquer.
En fait, et pour répondre au problème d'origine, je pense que le "secret" réside dans
VB:
Application.EnableEvents = False
:)

Cordialement
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : optimiser une macro

Re à tous, Je voulais remercier laetitia90, qui m'a fait découvrir quelque chose. Ma proposition de déplacer la ligne entière est effectivement 4X plus lente que sa proposition par tableau. Pour arriver au meême niveau de rapidité, il ne faut déplacer que le range nécessaire, ce que je ferai désormais. Cordialement
 

Pièces jointes

  • Test(1).xls
    48.5 KB · Affichages: 42
  • Test(1).xls
    48.5 KB · Affichages: 50
  • Test(1).xls
    48.5 KB · Affichages: 42

Si...

XLDnaute Barbatruc
Re : optimiser une macro

salut

Si... on veut garder des formules, avec .Copy
Code:
Private Sub CommandButton15_Click() 'bouton dans la feuille
  Application.Calculation = xlCalculationManual: Application.ScreenUpdating = False: Application.DisplayAlerts = False
  With Sheets("B.D.")
    .Cells.Clear
    Range("A4:AE1003").Copy .Cells(.Cells(Rows.Count, 1).End(xlUp)(2).Row, 1)
  End With
  Application.Calculation = xlCalculationAutomatic: Application.DisplayAlerts = True
End Sub
 

Efgé

XLDnaute Barbatruc
Re : optimiser une macro

Re, C'est exact mon cher C.C :). J'aime bien ce genre de fil; nous sommes pas pressés par un déluge de précisions, le sujet ne change pas toute les demis heures, nous avons le temps de deviser courtoisement en bonne compagnie sur tel ou tel point... Non vraiment, je pense que pour moi, ce sera le fil de la semaine : ) ) Cordialement
 

laetitia90

XLDnaute Barbatruc
Re : optimiser une macro

re tous :):):)
Fred je viens de voir ton fichier "range" bien suffisant tres rapide pourquoi faire simple quand on peut faire compliquer :)
Application.EnableEvents = False enfin de compte peut être la solution tu as encore raison
comme dit notre requin préfere :):) si nicho as disparu on saura jamais mais bon tout cela peut servir a d'autres
 

nicho

XLDnaute Occasionnel
Re : optimiser une macro

salut a vous tous, je vous dois des excuses pour mon absence sur ce poste (en raison de mon déplacement)

alors je vous présente mes excuses les plus sincère et je vous remercie infiniment pour toute les proposition faites

merci carcharodon-carcharias pour ta réponse rapide (et qui est excellente car je vois une grande rapidité d'execution par rapport a la mienne.

merci camarchepas mais ton code vba ne copie pas les valeurs comme souhaité

merci laetitia90 mais ton code ne copie pas les valeurs comme souhaité,
ma macro dure 10 seconde car j'ai mis beaucoup de bouton et de macros sans parlé des formules simple et formules matricielles,
mieux vaut tard que jamais, re désolé pour mon retard

merci Efgé ton code marche a merveille en plus d'être court, ton fichier est très intéressant pour mois le teste est plus rapide avec le Range(" ")

merci laurent950 au moin j'aurais apris a faire une boucle (chose que doit apprendre)

merci Si... mon but c'est de remplire la base de donnée pas de la réinitialiser a chaque fois je suis obligé d'enlever le .clear

en espèrent avoir répondu à chacun d'entre vous, je vous supplie :D d’accepter mes remercient et de m'avoir pardonné

merciiiiiiiiiiiiiiiiiiiiiiiiiiii

Yanis
 

Si...

XLDnaute Barbatruc
Re : optimiser une macro

Salut

en fait ma proposition correspondait plutôt au test de rapidité. Il me semble qu'elle est plus rapide que les autres.
Si... tu n'as qu'une ligne à copier, le code suivant devrait suffire :
Code:
Private Sub CommandButton1_Click() 'bouton dans la feuille
 With Application
   .Calculation = xlCalculationManual:  .ScreenUpdating = False:  .DisplayAlerts = False
   Range("A4:AE4").Copy Sheets("B.D.").Cells(Sheets("B.D.").Cells(Rows.Count, 1).End(xlUp)(2).Row, 1)
  .Calculation = xlCalculationAutomatic: .DisplayAlerts = True
  End With
End Sub
 

Discussions similaires

Réponses
3
Affichages
197

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin