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
A voir également:

7 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
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
Le Pingou Messages postés 12249 Date d'inscription   Statut Contributeur Dernière intervention   1 458
 
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
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 315
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
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
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 315
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
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
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 315
 
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
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
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
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 315
 
avec Michel on va passer à l'apéro pour te botter les fesses ;-))..

J'arrrrrrriiiiiive
:#D.
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
Malheureusement Michel, pas de nouvelle de Nathalie... Un p'tit espoir pour le digestif???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 762
 
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
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
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