VBA boucles et conditions

Bonjour,

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 :slight_smile: exercice programmation .xlsm (29,9 Ko)

Bonjour

Ci-joint ma proposition

Cliques sur le bouton « Bouton 29 » onglet « Feuil2 »

Macro « Traitement »

Testes et dis moi

exercice programmation .xlsm (29,0 Ko)

j’ai une petite erreur de récupération du dossier et de la macro.

Est ce que ce serait possible que vous l’écriviez directement sur la conversation ?

Merci à vous !

Voici le code :

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

J’espère que la récupération sera meilleur

A ta disposition

merci à vous, mais existerait t’il une formule plus simple, en cas de répétition de ma situation ?

Plus simple à quel niveau ?

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

Bonjour à tous
Moi je n’aurais fait qu’une seule boucle

exercice programmation (1).xlsm (28,2 Ko)

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

Merci à toi toujours bon à connaitre

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.