Macro multiplier condition

Résolu
Bonjour tout le monde

Je fait en ce moment une macro en excel avec Visual Basic Editor. Et j'essaie dps qlq jours de trouver comment multiplier des données dans une colonne, si elle remplisse une certaine condition.

Si les cellules en H2:H(fin série de données) contiennent "ANN" ou "CREDIT" il faut multiplier la cellule de la meme ligne en colonne G par (-1).

Il faut bien sure que ses nouveaux montants en colonne G remplacent les anciens.

J'ai trouvé ceci jusqu'a mtn, mais ca ne functionne pas:

Sub Test()

Dim i As Integer
For i = 2 To 500
If Cells(i, 8) = "CREDIT" Then
Cells(i, 7) = Multiply
i = i * (-1)
End If
Next

End Sub

Je suis assez nouvelle en macros, un peu d'aide serait super !!

Un grand merci en avance,

Nathalie

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Bonjour,
    Dans ta macro, i n'est pas le contenu de la cellule mais le numéro de ligne.
    1er conseil, mettre des noms compréhensible aux variables (au moins 3 lettres) :
    Dim Lign As Integer 
    For Lign = 1 To 500 
    bla bla

    Ton code devient donc :
    Sub Test()  
    Dim Lign As Integer  
    
    For Lign = 2 To 500  
    'ici on va faire les 2 tests avec "ou" 
        If Cells(Lign, 8) = "CREDIT" Or Cells(Lign, 8) = "ANN" Then  
            'ici, si la condition est remplie on multiplie 
            Cells(Lign, 7) = Cells(Lign, 7) * (-1) 
        End If  
    Next Lign 
    End Sub

    Après on peux se poser pas mal de question... Si "CREDIT" est écrit "crédit" est ce que cela fonctionne? On peux remplacer le To 500 par "To derniereLigne"
    Tu dis...
    Franck P
    1. Bonjour bonjour

      Merci pour la réponse rapide !!

      Pour les critères (CREDIT et ANN), les mots sont toujours ecris de la meme façon. Et en effet, la formule devrait functionner jusqu'à la dernière cellule ou il y à des données. Mais vu que je ne savais pas comment l'écrire, j'ai mis jusqu'à 500, ce qui couvre sans problème toutes les données. Il y en aura jamais plus que 500 quoi.

      Merci pour votre aide !
    2. Modérateur
      Alors, le code qui va te donner le numéro de la dernière ligne saisie colonne A est :
      Bien sur on peux adapter selon la colonne, suffit de remplacer "A" par ce que l'on souhaite...
      Dim DernLign As Integer
      DernLign = Range("A65536").End(xlUp).Row

      Donc, intégré à ta macro :
      Sub Test()  
      Dim Lign As Integer, DernLign As Integer
      
      DernLign = Range("A65536").End(xlUp).Row
      For Lign = 2 To DernLign  
      'ici on va faire les 2 tests avec "ou" 
          If Cells(Lign, 8) = "CREDIT" Or Cells(Lign, 8) = "ANN" Then  
              'ici, si la condition est remplie on multiplie 
              Cells(Lign, 7) = Cells(Lign, 7) * (-1) 
          End If  
      Next Lign 
      End Sub
  2. Bonjour,
    Juste au passage, en utilisant se que pijaku (bonjour) a expliqué dans un poste précédent, votre macro :
    Sub Test() 
    
    Sheets("CB VAD").Select 
    
    Dim Lign As Integer, DernLign As Integer 
    DernLign = Range("G65536").End(xlUp).Row 
    For Lign = DernLign To 1 Step -1 
    
    If Cells(Lign, 8) = "TNA" Or Cells(Lign, 8) = "INTERD" Or Cells(Lign, 8) = "PréAut" Then 
    Rows(Lign).Delete 
    Next 
    
    For Lign = DernLign To 1 Step -1 
    If Cells(Lign, 8) = "CREDIT" Or Cells(Lign, 8) = "ANN" Then 
    Cells(Lign, 7) = Cells(Lign, 7) * (-1) 
    End If 
    
    Next 
    
    End Sub
    1. Contributeur
      Salut Frank

      mettre des noms compréhensible aux variables (au moins 3 lettres)

      Bravo, là, tu me fais plaisir et je te plussoie :o))
      1. Modérateur
        Salut Michel,
        Effectivement, 3 lettres minimum, on essaye même avec une majuscule. J'ai lu cela dans une de tes réponses ici même... Et en plus, on essaie d'être explicite. Lign pour ligne, Col pour colonne etc...
        J'en profite pour te remercier au passage, car j'ai appris énormément à te lire.
        A+
      2. Contributeur
        Re,

        C'est au cours du CNAM que j'ai pris cette habitude: de toute façons, on se faisait jeter du labo pour toute variable non explicite et/ou de moins de 3 lettres !!!
        de plus, on était jugé sur les pseudo-codes car "une bonne procédure est celle qui se dépanne rapidement et qui est modifiée facilement"

        ca faisait ch... mais ils avaient hachement raison !!! super formation le CNAM
      3. Modérateur
        euh... Etant autodidacte, je ne comprends pas tout. Par "pseudo-code" tu entends "commentaire"? c'est bien ça? ce qui sert effectivement à adapter et dépanner le cas échéant...
      4. Contributeur
        Ouais mais plus précis du genre

        'si la la valeur 1 est affectée à la cellule A2 de la feuillle " feuil1"  alors
        if sheets("feuil1").range("A2")=1 then


        Tu vois le calvaire? des phrases et pas de faute d'orthographe ou de non sens informatique (écris est égal au lieu de affecté==> tu claques la porte du labo en partant!) comme les cours sont le soir après le boulot, tu vois l'ambiance quand t'as bossé le WE ( sous l'air en boucle de la chorale occitane: "chuis pas mariée avec un ordinateur" ) que ta bidouille fonctionne enfin et que tu es accueilli par un regard façon "porte de prison" du prof au labo à cause d'un mauvais accord du participe passé...
        Comme le prof n'était pas un charlot (directeur informatique de la fac de sciences du coin ) tu te dis qu'il doit avoir raison.

        après, tu n'écris pas tout ca, heureusement, mais cette rigueur t'as appris à essayer d'être précis dans tes commentaires pour faciliter la maintenance....
        voila
    2. Bonjour !! Un grand merci pour ton aide Pijaku !! Et merci au autres des conseils, c'est tj le bienvenu !!

      Si je peu me permettre, j'ai encore une petite question. J'ai fait une macro qui doit supprimer les lignes quand la cellule de cette ligne en colonne H contient le mot "TNA", "INTERD" ou "PréAut". Ca functionne, mais il me laisse toujours trainer une ligne ou deux. Quand je lance la macro 2, 3 fois de suite tout est parti. Comment faire pour que tout disparaissent du premier coup?

      Voici un bout de la macro:

      Sheets("CB EMV").Select

      Range("A1").Select
      ActiveWindow.SmallScroll Down:=-54
      Range(Selection, Selection.End(xlToRight)).Select
      Range(Selection, Selection.End(xlDown)).Select
      Selection.Sort Key1:=Range("H2"), Order1:=xlAscending, Header:=xlGuess,
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
      DataOption1:=xlSortNormal

      Dim i As Integer
      For i = 1 To 500
      If Cells(i, 8) = "TNA" Then
      Rows(i).Delete
      i = i - 1
      End If
      If Cells(i, 8) = "INTERD" Then
      Rows(i).Delete
      i = i - 1
      End If
      If Cells(i, 8) = "PréAut" Then
      Rows(i).Delete
      End If
      Next

      Faut dire que je me base sur des codes trouvés sur le net, vu que ca ne fait que dps 1 semaine que je me suis mise aux macros !!

      Merci beaucoup !!
      1. Modérateur
        Salut Nathalie,
        Pas de souci. Petite explication :
        Lorsque tu supprimes une ligne, la ligne suivante "prends" son numéro. Exemple : tu supprimes la ligne 8, celle qui était n°9 avant devient donc n°8. Or, si 2 lignes qui se suivent sont à supprimer, la N°9 à supprimer devient la N°8. Or, dans ta boucle, la ligne 8 a déjà été traitée. Pour éviter ce souci, on boucle "à l'envers", en partant de la fin.
        il te suffit de remplacer :
        For Lig = 1 To 500
        par :
        For Lig = 500 To 1 Step -1
        PS : 1- Tu nous remercies pour nos conseils mais ne les applique pas... Scrogneugneu!!! Dernière fois que tu nous fait des variables à une lettre! Attention, avec Michel on va passer à l'apéro pour te botter les fesses ;-))...
        2- Vire la ligne : ActiveWindow.SmallScroll Down:=-54 C'est totalement inutile, un reste d'une macro enregistrée...
      2. Contributeur
        avec Michel on va passer à l'apéro pour te botter les fesses ;-))..

        J'arrrrrrriiiiiive
        :#D.
      3. Modérateur
        Malheureusement Michel, pas de nouvelle de Nathalie... Un p'tit espoir pour le digestif???
    3. Salut les gars !! Dsl pour les réponses tardives, j'ss au taff et je ne bosse que sur mes macros quand j'ai un peu de temps libre. Donc voila, personne ne regarde alors j'en profite pour vous repondre. (Je suis drolement en retard pour l'apero je remarque)

      ENCORE MERCI !! Il me semblais déjà avoir lu qlq part qu'il falait faire les boucles à l'envers, mais je n'avait pas trop compris pq. Mtn si bien sure !! Et pour les variables, je n'ai pas encore eu le temps de les ajuster ds mes macros, mais c'est sur ma liste!!

      Modif de 16:39

      J'ai testé toutes vos méthodes, mais la macro me laisse toujours trainer une TNA (qui devrait s'effacer). J'ai surement du me tromper qlq part. Voici la nouvelle macro:

      Sub Test()

      Sheets("CB VAD").Select

      Dim Lign As Integer, DernLign As Integer
      DernLign = Range("G65536").End(xlUp).Row
      For Lign = DernLign To 1 Step -1

      If Cells(Lign, 8) = "TNA" Then
      Rows(Lign).Delete
      Lign = Lign - 1
      End If
      If Cells(Lign, 8) = "INTERD" Then
      Rows(Lign).Delete
      Lign = Lign - 1
      End If
      If Cells(Lign, 8) = "PréAut" Then
      Rows(Lign).Delete
      End If
      Next

      For Lign = DernLign To 1 Step -1
      If Cells(Lign, 8) = "CREDIT" Or Cells(Lign, 8) = "ANN" Then
      Cells(Lign, 7) = Cells(Lign, 7) * (-1)
      End If

      Next

      End Sub

      Grand merci, encore une fois. Je me demande bien ce que je ferais sans des personnes gentils comme vous qui aiment aider les autres ;)
      1. Modérateur
        Bonjour,
        Lorsque tu réalises une boucle, la variable (dans ton exemple : Lign) s'incrémente toute seule. Si tu l'incrémentes une deuxième fois dans ta boucle (Dans ton exemple, tu écris une ligne de code : Lign = Lign - 1) tu va rater forcément des valeurs. Donc supprime tes lignes de code Lign = Lign - 1 et ça fonctionnera.
        Tu peux aussi recopier le code de Le pingou (salut) ci dessous.

        Pour agrémenter mes propos (Wahou je cause bien ce matin!!) voici 2 petits tests qui te montreront ton erreur :
        Sub test() 
        Dim Lign As Integer 
        For Lign = 6 To 1 Step -1 
            MsgBox "Ligne " & Lign 
        Next 
        End Sub

        Sub test2() 
        Dim Lign As Integer 
        For Lign = 6 To 1 Step -1 
            MsgBox "Ligne " & Lign 
            Lign = Lign - 1 'ici on incrémente Lign une 2ème fois, et c'est pas bien! 
        Next 
        End Sub
    4. Ok super !! Je vais tester ca cette aprem !! J'vous donne des news dés que j'ai testé !! Encore merci a tous, surtout a toi Pijaku !
      1. Et ca functionne nikel chrome !!!! Wahoo big merci à tout le monde !! Allé hop, à la nouvelle macro mtn, donc peut-etre a bientot ds une nouvelle demande à l'aide? Haha encore merci