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 Sub

Index_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

18exemple.xlsm (21.21 Ko)

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 Sub

A+

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 Sub

Edit : 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

Bonsoir BrunoM45, eriiic


@ BrunoM45 :
Plus simple effectivement ... ; mais s'il n'y a qu'une ligne pour le dernier code, il n'y a pas d'écriture pour cette ligne

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 ligne

Seul 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

Bonjour Alex,

Perso, je n'ai rien compris à votre besoin

@+

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

16exemple.xlsm (29.98 Ko)

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

Bonjour BrunoM45,

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
noms

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.

Rechercher des sujets similaires à "vba probleme boucle"