Je suis en ce moment entrain de travailler sur un dossier VBA. Je dois calculer la quantité de produits A , B et C à partir d’un tableau, dans le désordre. Les formules à utiliser sont les boucles For et les conditions avec IF THEN.
j’aimerais de l’aide car après plusieurs heures passer sur la question, c’est compliqué et mon niveau actuel en VBA n’aide pas plus…
je vous mets le dossier en pièce jointe, avec ma dernière tentative pas très glorieuse.
j’espère que vos réponses m’aideront à améliorer mon niveau !
Merci d’avance exercice programmation .xlsm (29,9 Ko)
Sub Traitement()
derligne1 = Range(« D » & Rows.Count).End(xlUp).Row
derligne2 = Sheets(« Feuil1 »).Range(« A » & Rows.Count).End(xlUp).Row
For i = 6 To derligne1
somme = 0
For j = 2 To derligne2
If Sheets(« Feuil1 »).Range(« A » & j) = Range(« D » & i) Then
somme = somme + Sheets(« Feuil1 »).Range(« B » & j)
End If
Next
Range(« E » & i) = somme
Next
End Sub
Débutant je dirais, j’en suis qu’au base pour le moment.
du genre:
Sub boucle_for()
Dim max_boucles As Integer
max_boucles =
Range(« A1 ») 'En A1 : une limite de répétitions de la boucle est définie
For i = 1 To 7 'Boucles prévues : 7
If i > max_boucles Then 'Si A1 est vide ou contient un nombre < 7, diminution du nb de boucles
Exit For 'Si condition vraie, on quitte la boucle For
End If
MsgBox i
Next
End Sub
Quel intérêt ?
Ce n’est pas sur un tour de boucle de plus ou de moins que le traitement aura un bénéfice
De plus à jouer serrer sur leur nombre c est le risque d en altérer le résultat obtenu
Pour éviter des tours superflus il faut de manière dynamique déterminer la limite de celle-ci
C est dans mon code l objet des variables derligne1 et derligne2 défini en début de code
Ainsi les boucles ne font aucun passage inutile et se déroule jusqu à la dernière nécessaire
En espérant avoir était assez claire dans mes explications
Option Explicit
Sub Boucle()
'********************************
'* DECLARATIONS DES VARIABLES *
'********************************
Dim Ws As Worksheet
Dim Wd As Worksheet
Dim Dl As Integer
Dim i As Integer
'********************************
'* INITIALISATION DES VARIABLES *
'********************************
Set Ws = Sheets("Feuil1")
Set Wd = Sheets("Feuil2")
Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row
'********************************
'* MACRO *
'********************************
For i = 6 To 8
Wd.Range("E" & i) = Application.WorksheetFunction.SumIf(Ws.Range("A2:A" & Dl), Wd.Cells(i, 4), Ws.Range("B2:B" & Dl))
Next i
'********************************
'* VIDE LA MEMOIRE DES OBJETS *
'********************************
Set Ws = Nothing
Set Wd = Nothing
End Sub
Ou avec trois IF … THEN
Sub Boucle2()
'********************************
'* DECLARATIONS DES VARIABLES *
'********************************
Dim Ws As Worksheet
Dim Wd As Worksheet
Dim Dl As Integer
Dim i As Integer
'********************************
'* INITIALISATION DES VARIABLES *
'********************************
Set Ws = Sheets("Feuil1")
Set Wd = Sheets("Feuil2")
Dl = Ws.Range("A" & Rows.Count).End(xlUp).Row
'********************************
'* MACRO *
'********************************
For i = 2 To Dl
If Ws.Cells(i, 1) = Wd.Range("D6") Then Wd.Range("E6") = Wd.Range("E6") + Ws.Cells(i, 2)
If Ws.Cells(i, 1) = Wd.Range("D7") Then Wd.Range("E7") = Wd.Range("E7") + Ws.Cells(i, 2)
If Ws.Cells(i, 1) = Wd.Range("D8") Then Wd.Range("E8") = Wd.Range("E8") + Ws.Cells(i, 2)
Next i
'********************************
'* VIDE LA MEMOIRE DES OBJETS *
'********************************
Set Ws = Nothing
Set Wd = Nothing
End Sub
Bonjour Mimimathy
Merci pour ta proposition
Diminuer le nombre de boucles n’a d’intérêt que si cela diminue de manière significative le temps de traitement
Pour un code plus allégé je n’en vois pas trop l’utilité surtout qu’il n’est pas certain qu’il le soit car il faut pour compenser des lignes supplémentaires qui l’alourdissent
Moi je cherche surtout la fiabilité et rapidité du résultat de manière significative moins la légèreté de l’écriture
Mais peut être que dans son cas si le nombre de lignes à traiter est conséquent le jeu en vaut peut être la chandelle
Cela ne reste que ma vision des choses
Chacun voit midi à sa porte