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
etx
peuvent être réutilisées, plutôt que de déclarer de nouvelles variablesa
,b
etc
- 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