Macro multiplier condition
Résolu
Nathalie
-
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
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
A voir également:
- Macro multiplier condition
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Excel cellule couleur si condition texte - Guide
- Jitbit macro recorder - Télécharger - Confidentialité
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- System memory multiplier - Forum Matériel & Système
7 réponses
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) :
Ton code devient donc :
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
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
Bonjour,
Juste au passage, en utilisant se que pijaku (bonjour) a expliqué dans un poste précédent, votre macro :
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
Salut Frank
mettre des noms compréhensible aux variables (au moins 3 lettres)
Bravo, là, tu me fais plaisir et je te plussoie :o))
mettre des noms compréhensible aux variables (au moins 3 lettres)
Bravo, là, tu me fais plaisir et je te plussoie :o))
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
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
Ouais mais plus précis du genre
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
'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
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 !!
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 !!
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 :
2- Vire la ligne : ActiveWindow.SmallScroll Down:=-54 C'est totalement inutile, un reste d'une macro enregistrée...
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 500par :
For Lig = 500 To 1 Step -1PS : 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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ;)
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 ;)
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 :
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
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 !
Bien sur on peux adapter selon la colonne, suffit de remplacer "A" par ce que l'on souhaite...
Donc, intégré à ta macro :