Macro multiplier condition

Résolu
Nathalie -  
 Nathalie -
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

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    2
    1. Nathalie
       
      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 !
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
  2. Le Pingou Messages postés 12274 Date d'inscription   Statut Contributeur Dernière intervention   1 476
     
    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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Salut Frank

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

    Bravo, là, tu me fais plaisir et je te plussoie :o))
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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+
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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...
      0
    4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
      0
  4. Nathalie
     
    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 !!
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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...
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      avec Michel on va passer à l'apéro pour te botter les fesses ;-))..

      J'arrrrrrriiiiiive
      :#D.
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Malheureusement Michel, pas de nouvelle de Nathalie... Un p'tit espoir pour le digestif???
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Nathalie
     
    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 ;)
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
      0
  7. Nathalie
     
    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 !
    0
  8. Nathalie
     
    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
    0