Compréhension de latence VBA

bonjour,

alors voila j'aurais une question car la sa me turlupine et j'arrive pas a comprendre pourquoi, donc je viens a des professionnels.

alors voila j'ai un VBA qui de base a été fait par une personne du forum, je les modifier plusieurs fois et le problème qui me viens ces:

j'ai ce code il peux être simplifier je l accorde mais je m'y connais pas assez mais j'essayerais de le faire ultérieurement.

quand j appuie sur le bouton le temp de copier ma feuille 1 sur les 3 autre feuille, il met beaucoup de temps 30sec au moins

Private Sub CommandButton1_Click()
  Dim ws1 As Worksheet, ws2 As Worksheet   'déclaration des variables feuilles
 Dim i As Long, j As Long, dl As Long     'déclaration des variables lignes
 Dim x As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws2 = Sheets("pointage")        'définit la feuille ws2

dl = ws2.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws2 en colonne A

 For i = 9 To dl                          'boucle de la ligne 9 à la dernière ligne utilisée (feuille ws2)
  For j = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For x = 1 To 39                        'boucle de la colonne 1 à la colonne 39 (feuille ws2 de A à AM)
       If ws2.Cells(i, x) Like ws1.Range("G" & j) Then  'si la date de la feuille ws2 correspond à la date de la feuille ws1
          ws2.Cells(i, x + 1) = ws1.Range("K" & j)      'le type de ws2 = type de ws1 (+1 car on se décale vers la droite)
          ws2.Cells(i, x + 2) = ws1.Range("Q" & j)       'le NB.H de ws2 = NB.H de ws1 (+2 car on se décale vers la droite)
       End If                             'fin de la condition
   Next x                                 'fin de la boucle sur les colonnes de ws2
  Next j                                  'fin de la boucle sur les lignes de ws1
 Next i                                   'fin de la boucle des lignes de ws2

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

 Dim ws3 As Worksheet   'déclaration des variables feuilles
 Dim a As Long, b As Long, da As Long     'déclaration des variables lignes
 Dim c As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws3 = Sheets("heure supp sem")        'définit la feuille ws3

da = ws3.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws2 en colonne A

 For a = 2 To da                          'boucle de la ligne 2 à la dernière ligne utilisée (feuille ws3)
  For b = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For c = 1 To 2                       'boucle de la colonne 1 à la colonne 2 (feuille ws3 )
       If ws3.Cells(a, c) Like ws1.Range("O" & 14) Then   'si la date de la feuille ws2 correspond à la date de la feuille ws1
          ws3.Cells(a, c + 2) = ws1.Range("Q" & 24) 'le type de ws2 = type de ws1 (+2 car on se décale vers la droite)

       End If                             'fin de la condition
   Next c                                 'fin de la boucle sur les colonnes de ws3
  Next b                                  'fin de la boucle sur les lignes de ws1
 Next a                                   'fin de la boucle des lignes de ws3

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

 Dim ws6 As Worksheet   'déclaration des variables feuilles
 Dim u As Long, v As Long, du As Long     'déclaration des variables lignes
 Dim w As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws6 = Sheets("heure declare")        'définit la feuille ws2

du = ws6.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws2 en colonne A

 For u = 9 To du                          'boucle de la ligne 9 à la dernière ligne utilisée (feuille ws2)
  For v = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For w = 1 To 39                        'boucle de la colonne 1 à la colonne 39 (feuille ws2 de A à AM)
       If ws6.Cells(u, w) Like ws1.Range("G" & v) Then  'si la date de la feuille ws2 correspond à la date de la feuille ws1
          ws6.Cells(u, w + 1) = ws1.Range("M" & v)      'le type de ws2 = type de ws1 (+1 car on se décale vers la droite)
          ws6.Cells(u, w + 2) = ws1.Range("O" & v)       'le NB.H de ws2 = NB.H de ws1 (+2 car on se décale vers la droite)
       End If                             'fin de la condition
   Next w                                 'fin de la boucle sur les colonnes de ws2
  Next v                                  'fin de la boucle sur les lignes de ws1
 Next u                                   'fin de la boucle des lignes de ws2

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

 Dim ws4 As Worksheet   'déclaration des variables feuilles
 Dim l As Long, dk As Long     'déclaration des variables lignes
 Dim y As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws4 = Sheets("annualisation")                  'définit la feuille ws3

dk = ws4.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws3 en colonne A

For l = 9 To dk                          'boucle de la ligne 9 à la dernière ligne utilisée (feuille ws3)
  For j = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For y = 1 To 39                        'boucle de la colonne 1 à la colonne 39 (feuille ws3 de A à AM)
          If ws4.Cells(l, y) Like ws1.Range("G" & j) Then  'si la date de la feuille ws3 correspond à la date de la feuille ws1
          ws4.Cells(l, y + 2) = ws1.Range("S" & j)       'le ANNU de ws3 = ANNU de ws1 (+2 car on se décale vers la droite)
       End If                             'fin de la condition
          Next y                                 'fin de la boucle sur les colonnes de ws3
  Next j                                  'fin de la boucle sur les lignes de ws1
 Next l                                   'fin de la boucle des lignes de ws3

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws3 = Sheets("heure supp sem")        'définit la feuille ws3

da = ws3.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws2 en colonne A

 For a = 2 To da                          'boucle de la ligne 2 à la dernière ligne utilisée (feuille ws3)
  For b = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For c = 1 To 2                       'boucle de la colonne 1 à la colonne 2 (feuille ws3 )
       If ws3.Cells(a, c) Like ws1.Range("O" & 14) Then   'si la date de la feuille ws2 correspond à la date de la feuille ws1
          ws3.Cells(a, c + 5) = ws1.Range("S" & 24) 'le type de ws2 = type de ws1 (+2 car on se décale vers la droite)

       End If                             'fin de la condition
   Next c                                 'fin de la boucle sur les colonnes de ws3
  Next b                                  'fin de la boucle sur les lignes de ws1
 Next a                                   'fin de la boucle des lignes de ws3

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

  Set ws1 = Sheets("pointage semaine")
ws1.Range("K17:P23,S17:T23").ClearContents 'à chaque changement du n° de semaine, on vide le tableauEnd Sub

End Sub

par contre j'ai se code qui fait l inverse il va chercher les donnée dans les 3 feuilles pour y coller sur la premiere, mais lui il met une seconde a copié

le code est casi identique ces pour ça que je comprend pas le problème.

Private Sub CommandButton3_Click()
Dim ws1 As Worksheet, ws2 As Worksheet   'déclaration des variables feuilles
 Dim i As Long, j As Long, dl As Long     'déclaration des variables lignes
 Dim x As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws2 = Sheets("pointage")        'définit la feuille ws2

dl = ws2.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws2 en colonne A

 For i = 9 To dl                          'boucle de la ligne 9 à la dernière ligne utilisée (feuille ws2)
  For j = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For x = 1 To 39                        'boucle de la colonne 1 à la colonne 39 (feuille ws2 de A à AM)
       If ws2.Cells(i, x) Like ws1.Range("G" & j) Then  'si la date de la feuille ws2 correspond à la date de la feuille ws1
          ws1.Range("K" & j) = ws2.Cells(i, x + 1)      'le type de ws2 = type de ws1 (+1 car on se décale vers la droite)

       End If                             'fin de la condition
   Next x                                 'fin de la boucle sur les colonnes de ws2
  Next j                                  'fin de la boucle sur les lignes de ws1
 Next i                                   'fin de la boucle des lignes de ws2

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

 Dim ws6 As Worksheet   'déclaration des variables feuilles
 Dim u As Long, v As Long, du As Long     'déclaration des variables lignes
 Dim w As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws6 = Sheets("heure declare")        'définit la feuille ws2

du = ws6.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws2 en colonne A

 For u = 9 To du                          'boucle de la ligne 9 à la dernière ligne utilisée (feuille ws2)
  For v = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For w = 1 To 39                        'boucle de la colonne 1 à la colonne 39 (feuille ws2 de A à AM)
       If ws6.Cells(u, w) Like ws1.Range("G" & v) Then  'si la date de la feuille ws2 correspond à la date de la feuille ws1
          ws1.Range("M" & v) = ws6.Cells(u, w + 1)      'le type de ws2 = type de ws1 (+1 car on se décale vers la droite)
          ws1.Range("O" & v) = ws6.Cells(u, w + 2)       'le NB.H de ws2 = NB.H de ws1 (+2 car on se décale vers la droite)
       End If                             'fin de la condition
   Next w                                 'fin de la boucle sur les colonnes de ws2
  Next v                                  'fin de la boucle sur les lignes de ws1
 Next u                                   'fin de la boucle des lignes de ws2

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

 Dim ws4 As Worksheet   'déclaration des variables feuilles
 Dim l As Long, m As Long, dk As Long     'déclaration des variables lignes
 Dim y As Long                            'déclaration de la variable colonne

Application.ScreenUpdating = False        'évite le rafraichissement de l'écran à chaque tour de boucle

Set ws1 = Sheets("pointage semaine")              'définit la feuille ws1
Set ws4 = Sheets("annualisation")                  'définit la feuille ws3

dk = ws4.Range("A" & Rows.Count).End(xlUp).Row   'définit la dernière ligne utilisée de la feuille ws3 en colonne A

For l = 9 To dk                          'boucle de la ligne 9 à la dernière ligne utilisée (feuille ws3)
  For j = 17 To 23                        'boucle de la ligne 17 à la ligne 23 (feuille ws1)
   For y = 1 To 39                        'boucle de la colonne 1 à la colonne 39 (feuille ws3 de A à AM)
          If ws4.Cells(l, y) Like ws1.Range("G" & j) Then  'si la date de la feuille ws3 correspond à la date de la feuille ws1
          ws1.Range("S" & j) = ws4.Cells(l, y + 2)       'le ANNU de ws3 = ANNU de ws1 (+2 car on se décale vers la droite)
       End If                             'fin de la condition
          Next y                                 'fin de la boucle sur les colonnes de ws3
  Next j                                  'fin de la boucle sur les lignes de ws1
 Next l                                   'fin de la boucle des lignes de ws3

 Application.ScreenUpdating = True        'on réactive le rafraichissement de l'écran

End Sub

est ce long le premier bouton 1 du fait qui doit copier certaine ligne dans des feuilles différente?

ps: ne pas prendre en compte tout ce qui est ecris en vert des fois sa correspond pas car j'ai pas modifié

Bonjour,

Quelques commentaires sur la forme :

  • Dans votre propre intérêt, vous devriez modifier les commentaires (en vert), pour faciliter la relecture et la compréhension du code, si vous avez à y revenir plus tard (probable !)
  • On évite les déclarations de variable en cours de macro, plutôt à grouper en début début (instructions Dim)
  • Répétitions inutiles de Application.ScreenUpdating... Une seule désactivation au début, et réactivation à la fin suffit
  • Vous vous mélangez les pinceaux avec vos variables de feuille (ws1, ws2, etc). Un même nom de variable ne fait pas référence à la même feuille selon où on se place dans le code... C'est pas super efficace pour se relire !
  • Inutile de déclarer des variables différentes pour faire à nouveau des boucles. Par exemple, i, j et x peuvent être réutilisées, plutôt que de déclarer de nouvelles variables a, b et c
  • Je ne vois pas l'intérêt d'utiliser Like plutôt que = pour des comparaison de valeurs à l'identique

Pour le fond, un embryon de piste :

Application.Calculation = xlCalculationManual 'En début de macro
'Gnagnagna
Application.Calculation = xlCalculationAutomatic 'En fin de macro

fond d'embryon tu ma mis dans une brouillard.

je vois pas ce que sa veux dire desolé

Suite :

second et dernier blocs de boucles, la variable de la 2ème boucle n'est pas utilisée (variable b, et variable j), ce qui multiplie inutilement les opérations effectuées.

Bonjour,

J'ai fait un peu de ménage... A essayer :

Private Sub CommandButton1_Click()
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet, ws6 As Worksheet
Dim i&, j&, k&, x&
   Application.ScreenUpdating = False

Set ws1 = Sheets("pointage semaine")
Set ws2 = Sheets("pointage")
Set ws3 = Sheets("heure supp sem")
Set ws4 = Sheets("annualisation")
Set ws6 = Sheets("heure declare")

k = ws2.Range("A" & Rows.Count).End(xlUp).Row
 For i = 9 To k
  For j = 17 To 23
   For x = 1 To 39
       If ws2.Cells(i, x) Like ws1.Range("G" & j) Then
          ws2.Cells(i, x + 1) = ws1.Range("K" & j)
          ws2.Cells(i, x + 2) = ws1.Range("Q" & j)
       End If
   Next x
  Next j
 Next i

k = ws3.Range("A" & Rows.Count).End(xlUp).Row
 For i = 2 To k
  For j = 17 To 23
   For x = 1 To 2
       If ws3.Cells(i, x) Like ws1.Range("O" & 14) Then
          ws3.Cells(i, x + 2) = ws1.Range("Q" & 24)
       End If
   Next
  Next
 Next

k = ws6.Range("A" & Rows.Count).End(xlUp).Row
 For i = 9 To k
  For j = 17 To 23
   For x = 1 To 39
       If ws6.Cells(i, x) Like ws1.Range("G" & j) Then
          ws6.Cells(i, x + 1) = ws1.Range("M" & j)
          ws6.Cells(i, x + 2) = ws1.Range("O" & j)
       End If
   Next
  Next
 Next

k = ws4.Range("A" & Rows.Count).End(xlUp).Row
For i = 9 To k
  For j = 17 To 23
   For x = 1 To 39
          If ws4.Cells(i, x) Like ws1.Range("G" & j) Then
          ws4.Cells(i, x + 2) = ws1.Range("S" & j)
       End If
    Next
  Next
 Next

k = ws3.Range("A" & Rows.Count).End(xlUp).Row
 For i = 2 To k
  For j = 17 To 23
   For x = 1 To 2
       If ws3.Cells(i, x) Like ws1.Range("O" & 14) Then
          ws3.Cells(i, x + 5) = ws1.Range("S" & 24)
       End If
   Next
  Next
 Next

ws1.Range("K17:P23,S17:T23").ClearContents
Application.ScreenUpdating = True
End Sub

A+

Salut Galopin01 !

Je me permet de reprendre ton code pour supprimer 2 boucles à priori inutiles :

Private Sub CommandButton1_Click()
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet, ws6 As Worksheet
Dim i&, j&, x&

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Set ws1 = Sheets("pointage semaine")
Set ws2 = Sheets("pointage")
Set ws3 = Sheets("heure supp sem")
Set ws4 = Sheets("annualisation")
Set ws6 = Sheets("heure declare")

With ws1
 For i = 9 To ws2.Range("A" & Rows.Count).End(xlUp).Row
  For j = 17 To 23
   For x = 1 To 39
       If ws2.Cells(i, x) Like .Range("G" & j) Then
          ws2.Cells(i, x + 1) = .Range("K" & j)
          ws2.Cells(i, x + 2) = .Range("Q" & j)
       End If
   Next x
  Next j
 Next i

 For i = 2 To ws3.Range("A" & Rows.Count).End(xlUp).Row
  'For j = 17 To 23 'Pas utilisée
   For x = 1 To 2
       If ws3.Cells(i, x) Like .Range("O" & 14) Then ws3.Cells(i, x + 2) = .Range("Q" & 24)
   Next
  'Next
 Next

 For i = 9 To ws6.Range("A" & Rows.Count).End(xlUp).Row
  For j = 17 To 23
   For x = 1 To 39
       If ws6.Cells(i, x) Like .Range("G" & j) Then
          ws6.Cells(i, x + 1) = .Range("M" & j)
          ws6.Cells(i, x + 2) = .Range("O" & j)
       End If
   Next
  Next
 Next

For i = 9 To ws4.Range("A" & Rows.Count).End(xlUp).Row
  For j = 17 To 23
   For x = 1 To 39
          If ws4.Cells(i, x) Like .Range("G" & j) Then ws4.Cells(i, x + 2) = .Range("S" & j)
    Next
  Next
 Next

 For i = 2 To ws3.Range("A" & Rows.Count).End(xlUp).Row
  'For j = 17 To 23 'Pas utilisée
   For x = 1 To 2
       If ws3.Cells(i, x) Like .Range("O" & 14) Then ws3.Cells(i, x + 5) = .Range("S" & 24)
   Next
  'Next
 Next
 .Range("K17:P23,S17:T23").ClearContents
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

vous êtes des bon. je sais pas comment vous pouvez réussir a changer aussi rapidement des codes mais bravo

il est plus rapide pas comme le bouton 3 mais ces déjà beaucoup mieux

vous êtes des bon. je sais pas comment vous pouvez réussir a changer aussi rapidement des codes mais bravo

il est plus rapide pas comme le bouton 3 mais ces déjà beaucoup mieux

Rechercher des sujets similaires à "comprehension latence vba"