Comment faire avec For Each ?

Résolu
jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -  
jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je souhaite créer une procédure qui, si dans ma colonne R il y a une ou plusieurs cellule(s) > 0 alors cette ou ces cellule(s) s'additionne(nt) à la cellule de la même ligne mais en colonne P. Voila ce que j'ai écrit, mais le For Each me pose un problême. J'ai beau chercher sur les forums, je plante, merci d'avance, en espérant avoir été assez clair.

Sub ajouter()

Dim a As Range ' colonne ("R3:R200")
Dim p As Range ' colonne ("P3:P200")
Dim cellules As Range

Set a = Range("commande") ' colonne ("R3:R200")
Set p = Range("previs") ' colonne ("P3:P200")

For Each cellules In a
If cellules.Value > 0 Then

p = a + p ????????

Else
Exit Sub
End If
Next cellules

End Sub

4 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonsoir,
    je ne sais pas si j'ai bien compris

    Sub ajouter() 
    Dim com As Range 
    Dim pre As Range 
    Dim cel As Range 
    Set com = Range("commande") 
    Set pre = Range("previs") 
    For Each cel In com 
      If cel.Value > 0 Then 
        pre.Cells(cel.Row, cel.Column).Value = pre.Cells(cel.Row, cel.Column).Value + cel.Value 
      End If 
    Next cel 
    End Sub

    si ça ne convient pas, tu expliques
    RQ. j'ai mis des identificateurs plus explicites
    bonne suite
    0
  2. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonsoir ccm81

    Merci d'avoir répondu à ma question. J'ai testé ta procédure en pas à pas détaillé mais rien ne se passe. Toutes les lignes sont passées une première fois puis If.., End If, Next cel et ça recommence If.., End If, Next cel, aucun message d'erreur et rien ne se produit.
    J'ai planché de mon côté sur la base de ce que tu as produit voilà où j'en suis arrivé :

    Sub ajouter()

    Dim com As Range
    Dim cel As Range

    Set com = Range("commande")

    For Each cellules In com
    If cel.Value > 0 Then
    cel.Offset(0, -2).Value = cel.Offset(0, -2).Value + cel.Value
    End If
    Next cellules
    End Sub

    Si ce n'est trop te demander, peux-tu m'expliquer succinctement cette ligne "pre.Cells(cel.Row, cel.Column).Value = pre.Cells(cel.Row, cel.Column).Value + cel.Value", je pense avoir saisi et je ne vois pas pourquoi cela ne fonctionne pas.
    Merci, bonne soirée.
    0
  3. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    1. Pour mon exemple, je l'ai fabriqué dans l'esprit de ta demande en utilisant deux plages "commande" et "previs".
    2. je crois que le pb vient du fait que tes plages commencent en ligne 3, et j'ai fait mon exemple avec des plages commençant en ligne 1, il faut donc tenir compte du décalage, et voila, en principe le code correct.
    3. pre.Cells(cel.Row, cel.Column).Value
    les cellules de la plage "pre" sont accessibles par leurs coordonnées (lig, col) relatives à cette plage, cad que la 1° cellule de "pre" est accessible avec pre.Cells(1,1) alors que pour la 1° cellule de "commande" cel.row vaut 3 (chez toi), d'où le décalage
    4. Ta solution avec offset permet d'éviter ce pb (attention à l'identificateur pour ta cellule courante qui change en cours de route cellules-cel)

    Sub ajouter()
    Dim com As Range
    Dim pre As Range
    Dim cel As Range
    Set com = Range("commande")
    Set pre = Range("previs")
    For Each cel In com
      If cel.Value > 0 Then
        pre.Cells(cel.Row - 2, cel.Column).Value = pre.Cells(cel.Row - 2, cel.Column).Value + cel.Value
      End If
    Next cel
    End Sub


    bonne suite
    0
  4. jen_peplu Messages postés 33 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonsoir
    Effectivement, dans la suite de mon programme, je colle les valeurs de « previs » dans un tableau sur une autre feuille et j'ai un décalage qui s'opère d'autant de cellule, lié au fait que ma plage commence ligne 3. Solution adoptée, démarrer mes plages ligne 1.
    J'ai essayé ton code, cela ne marche pas chez moi. J'ai modifié le « cel.Row-2 en cel.Row+2 » car avec cette valeur le controltiptext m'indique cel.Row =3 (ma plage commence toujours ligne 3) et là, ça ne marche pas non plus, pas d'erreur, mais les cellules ne s'additionnent pas.
    Merci quand même, je te dérange pas plus avec ça car ta syntaxe m'a permis de créer la mienne, un peu plus simpliste j'en conviens, mais c'est un début et je reviendrai sur la tienne plus tard.
    A une prochaine.
    0