VBA - Problème boucle
Bonjour à tous,
Je vous écris car j'ai un problème assez embettant avec une boucle, et étant un débutant en VBA je ne sais comment le résoudre.
Voici le code :
Sub Recup()
'Variables
Dim i As Integer
Dim PF_Code As String
'Quotidien
For i = Index_debut("NOURRICIERS") - 1 To Index_fin("****") Step 3 'c'est ici que j'aimerais mettre un step2 lorsque le résultat doit s'appliquer à 2 lignes seulement
PF_Code = ActiveSheet.Cells(i, 2)
If PF_Code <> "" Then
ActiveSheet.Cells(i, 3).Value = "resultat"
End If
Next i
End SubIndex_debut et Index_fin sont mes bornes de début et de fin (vous verrez le code dans le fichier exemple). Mon problème est que j'aimerais appliqué le code en step 3 quand je veux que le résultat s'applique sur 3 lignes, en step 2 quand je veux qu'il s'applique sur 2 lignes, et en step x quand je veux qu'il s'applique sur x ligne. Pour cela, j'aimerais créer une condition "si le PF_Code est similaire sur x cases alors step x pour la boucle". Mais je ne trouve pas comment le formuler.
Voila, alors je ne sais pas si j'ai reussi à me faire comprendre mais le fichier exemple devrait illustrer au mieux ce que je veux faire. Si jamais vous avez besoin de plus d'informations dites moi.
Merci d'avance pour votre aide.
Cordialement,
alexcauwel
Bonjour,
un essai qui ne modifie pas le step , mais qui n'écrit que sur la ligne où le code de la colonne B est "nouveau" :
Sub Recup()
Dim i As Integer
Dim PF_Code As String, PF_Old As String, Fin As Integer
With Worksheets("Feuil1")
PF_Old = ""
Fin = .Range("A" & Rows.Count).End(xlUp).Row
'For i = Index_debut("NOURRICIERS") - 1 To Index_fin("****") Step 3 'c'est ici que j'aimerais mettre un step2 lorsque le résultat doit s'appliquer à 2 lignes seulement
For i = 3 To Fin ' ou garder Index_debut("NOURRICIERS") - 1 et Index_fin("****")
PF_Code = .Cells(i, 2)
If PF_Code <> PF_Old Then
PF_Old = PF_Code
.Cells(i, 3).Value = "resultat"
End If
Next i
End With
End SubA+
Bonjour AlexCauwel,
Modifié un "Step" quand une boucle est lancée, à ma connaissance c'est impossible
En revanche avec un Do While, on fait ce que l'on veut
Sub Recup()
'Variables
Dim Lig As Long, LigFin As Long
Dim PF_Code As String
Dim Sht As Worksheet
Lig = Index_debut("NOURRICIERS") - 1
LigFin = Index_fin("****")
Set Sht = ActiveSheet
'Quotidien
Do While Lig <= LigFin
PF_Code = Sht.Cells(Lig, 2)
If PF_Code <> "" Then ActiveSheet.Cells(Lig, 3).Value = "resultat"
' Incrémenter ICI selon le nombre de valeur = STEP
Lig = Lig + Application.CountIf(Sht.Range("A:A"), Sht.Range("A" & Lig))
Loop
Set Sht = Nothing
End SubEdit : oups, salut AlgoPlus, j'ai fait plus simple
@+
Bonjour à tous,
"si le PF_Code est similaire sur x cases alors step x pour la boucle"
et donc il ne peut qu'augmenter. S'il doit baisser de 3 à 2 par exemple ça va merdouiller...
eric
AlgoPlus pas le temps de tout tester
C'était juste un problème de test strictement inférieur il faut que ce soit "<="
Bonjour,
Merci à tous ça marche niquel ! J'aurais jamais pensé à faire ça...
J'ai encore un petit problème que je n'ai pas mentionné dans mon fichier exemple car mon résultat est "résultat" dans celui-ci, mais j'ai reussi à le résoudre avec une fonction if then. Le problème était que mon résultat devait être tiré des résultats des 2 feuilles précédentes et par conséquent prendre en compte le nombre de ligne approprié. Ma façon de résoudre ce problème est d'avoir pris en compte 2 ligne seulement dans le code initial, et rajouter une ligne de code:
If PF_Code = ActiveSheet.Cells(Lig + 2 , 2) then 'compter la 3ème ligneSeul bémol c'est si mes lignes à prendre en compte pour le résultat sont <2 ; 3<...
Avez-vous des suggestions ?
Merci encore pour votre aide !
Cordialement,
alexcauwel
Très bien, j'ai mis à jour le fichier exemple. Vous comprendrez peut-être mieux en lisant le code. Le problème est que le calcul ne s'applique que si les lignes S/R N-1 et N-2 sont de 3 ou de 2 (via ma fonction If PF_Code est le même 3 ligne après, alors calculez ligne 3).
Merci d'avance.
alexcauwel
et moi j'attend encore une réponse à ma remarque.
Et puis moi j'attends les éclaircissements pour BrunoM45
(comme ça personne ne sait que je n'ai rien compris non plus...)
Un essai selon ce que j'ai compris ( mais est ce bien ça ??)
Sub Recup()
Dim i As Integer, j As Integer, Dico As Object, Clé, w As Integer, TT, T(), T1, DL As Long
Set Dico = CreateObject("Scripting.Dictionary")
For i = 1 To 2 ' pour les feuilles N-2 et N-1 qui doivent être en 1ère et 2ème position
With Worksheets(i)
DL = .Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille en cours
T1 = .Range("A3:D" & DL)
End With
For j = LBound(T1, 1) To UBound(T1, 1) ' création du dictionnaire
Clé = T1(j, 1) & "|" & T1(j, 2)
Dico(Clé) = Dico(Clé) + T1(j, 4)
Next
Next
ReDim T(1 To Dico.Count, 1 To 3) ' création du tableau résultat
For Each Clé In Dico.keys
x = x + 1
TT = Split(Clé, "|")
T(x, 1) = TT(0)
T(x, 2) = TT(1)
T(x, 3) = Dico(Clé)
Next
Worksheets("N").Range("A3").Resize(UBound(T, 1), UBound(T, 2)) = T ' "collage du résultat
End Sub@AlgoPlus formidable ce code, mais absolument pas adapté à un débutant
Il serait bien de se mettre à la porter de tous quand on répond
Merci pour tout ....
Adapter son code à la connaissance des débutants....? pourquoi pas .
Faut-il questionner le demandeur sur son niveau avant de proposer une boucle Do While ....Loop plutôt qu'une boucle For ...Next ... ou est ce déjà hors niveau ...?
J'essaie (pas toujours réussi...) plutôt de répondre au besoin ...
Vaste débat qui n'apporte rien au besoin de alexcauwel ....
Mais, la plupart vient chercher une solution clés en mains et se désintéresse du code.
Quelques uns s'intéressent au "comment" et je suis alors ravi de répondre à leur questionnement ...
Aura-t-on des nouvelles de alexcauwel ?
@AlgoPlus
Faut-il questionner le demandeur sur son niveau avant de proposer une boucle Do While ....Loop plutôt qu'une boucle For ...Next ... ou est ce déjà hors niveau ...?
A ce niveau, je ne pense pas puisqu'il s'agit d'une boucle (base du VBA)
Ensuite si on lit attentivement l'énoncé, une boucle For.. Next avec un Step qui change n'est pas possible
Mais, la plupart vient chercher une solution clés en mains et se désintéresse du code.
Oui et se retrouve bloqué un jour, car il n'a jamais rien compris
C'est un vaste débat effectivement, mais je fais parti de ceux qui préfèrent donner une canne pour leur apprendre à pêcher
L'idéologie des uns n'est pas celles des autres et ce n'est pas sur le fil d'un demandeur qu'il convient d'en débattre
Je te propose d'en rester là pour ne pas continuer à polluer. Je me demande même comment on en est arrivé là ?
Bonjour,
Merci à tous pour votre implication. Je n'ai pas encore eu le temps de checker le dernier code mais je reviendrais vers vous quand ce sera le cas.
Les codes sur lesquelles je bosse ne sont certainement pas dédiés aux débutants, mais jusqu'ici j'arrive à les comprendre et les corriger. Lorsque je bloque vraiment je fais appel à vous, mais mon intention n'est pas d'avoir un code tout près conçu que je puisse appliquer. VBA étant un indispensable dans mon domaine, ma volonté de progresser est grande croyez moi.
Quoi qu'il en soit je vous remercie car vous m'avez été d'une grande aide.
Cordialement,
alexcauwel
Bonsoir…
Avec des tableaux et dans la fenêtre des codes de la feuille de synthèse (N dans l’exemple)
Option Explicit
Sub Macro1()
Dim R As Range, n1 As Long, n2 As Long
For Each R In [à3]
n1 = Application.SumIf([ç1], R(1, -2).Value, [à1])
n2 = Application.SumIf([ç2], R(1, -2).Value, [à2])
R = n1 + n2
Next
End Sub
BrunoM45, si tu m’accordes cette observation « Il serait bien de se mettre à la portée de tous quand on répond », je t’accorderais celle-ci « Ce qui est simple pour les uns peut être compliqué pour les autres et réciproquement ! Cela dépend du niveau de connaissances. C’est à chacun d’apprendre les nouveautés présentées. »
Ici, il est évident que le débutant ne doit pas être au niveau 0.
De plus il doit se douter que le bon choix des outils est prépondérant pour se simplifier la tâche. Je suis vraiment gêné pour ceux, très nombreux de ce forum, qui ne fréquentent pas les tableaux (ListObjects).
Dans l’exemple fourni, la fusion des cellules n’est pas faite pour faciliter les choses.
Le débutant pourrait se dispenser du VBA avec la fonction SOMME.SI, encore faut-il savoir l’utiliser.