Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA - macro avec boucle et condition IF sur plusieurs colonnes

mlz_vba

XLDnaute Nouveau
Bonjour à tous,

Je viens de commencer VBA il y a une semaine et j'ai dejà un peu progressé grace à ce forum, donc dejà un grand merci à tous. Mais merci aussi pour votre indulgence car c'est la premiere fois que je montre un de mes code...

Je suis sur une macro qui doit changer une valeur dans les cellules de la colonne K, en fonction de données trouvées soit dans H, soit dans L.
Il y a plusieurs milliers de lignes (j'ai fixé arbitrairement à 4500 pour l'instant, en essayant de terminer ma boucle quand il n'y a plus de texte).

Ici je tombe sur une erreur d'intégration objet requis dansle premier paragraphe.

Pouvez-vous m'aider à comprendre mon erreur en voulant parametrer les celulles k dans ma boucle? (meme si il y a surement d'autres choses à modifier, c'est vraiment mon probleme pour l'instant).

Merci beaucoup.


Sub VALEUR()

Dim k As Integer
Set k = Range("H69:H4500")
For k = 1 To 4500

Do
With Selection.Find
.Text = " "
.Forward = True
booTrouve = .Execute


If k.cell(0, 2).Value = "HOME CARE" Then k.cell(0, 1).Value = "ENTRETIEN"
ElseIf k.cell(0, 2).Value = "PERSONNAL CARE" Then k.cell(0, 1).Value = "HYGIENE"
ElseIf k.cell(0, 2).Value = "SPREADS" Then k.cell(0, 1).Value = "EPICERIE"
ElseIf k.cell(0, -3).Value = "A341" Then k.cell(0, 1).Value = "EPICERIE"
ElseIf k.cell(0, -3).Value = "A343" Then k.cell(0, 1).Value = "FRAIS"
ElseIf k.cell(0, -3).Value = "A319" Then k.cell(0, 1).Value = "FRAIS"
ElseIf k.cell(0, -3).Value = "A334" Then k.cell(0, 1).Value = "FRAIS"
ElseIf k.cell(0, -3).Value = "A361" Then k.cell(0, 1).Value = "GLACE"
ElseIf k.cell(0, -3).Value = "A364" Then k.cell(0, 1).Value = "GLACE"
End If
Next
End With
Loop While booTrouve
End Sub
 

eriiic

XLDnaute Barbatruc
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonjour,

1) Dim k As Range
2) ton End With est un peu n'importe où.
Après le Next, ça te fait qu'il se termine en dehors de ta boucle For alors que le With est à l'intérieur.
Je l'imagine bien juste avant le If
3) pour tes prochaines demandes tu devrais lire la charte où il fortement conseillé de joindre un fichier ;-)

eric
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonjour Mlz_vba et bienvenue, bonjour Éric, bonjour le forum,

En gros, mêmes remarques qu'Éric avec en plus le fait que tu parles de Selection mais le code ne sélectionne rien !? J'avoue ne pas comprendre ton code. Je te conseille de nous envoyer une petit exemple, avec juste une poignée de données, montrant ce que tu as avant et ce que tu voudrais après traitement par la macro.
 

simraill

XLDnaute Occasionnel
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonjour Mlz_vba , eriiiic, Robert, le fofo, enfin tout le monde !

Je suis d'accord avec eriiiic et Robert donc je vais pas les paraphraser.

Sinon si j'ai bien compris tu veux ta boucle s'arrête à la derniére ligne utilisée?
Essaye de mettre ceci au début de ta macro:

Code:
Dim k As Range
Dim dl as long
dl = ActiveSheet.UsedRange.Rows.Count
Set k = Range("H69:H" & dl)
For k = 1 To dl
 

mlz_vba

XLDnaute Nouveau
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Hello,

Merci beaucoup pour vos réponses rapides,

j'ai pris en compte vos remarques et je vous ai rajouté un petit fichier explicatif de ce que j'aimerai obtenir.

simraill : j'ai une erreur incompatibilité de type sur For k = 1 To dl

Robert: en effet mon code ne selectionne rien et je crois que c'est bien là mon plus gros probleme...

Bonne soirée


Sub VALEUR()


Dim k As Range
Dim dl As Long
dl = ActiveSheet.UsedRange.Rows.Count
Set k = Range("H69:H" & dl)
For k = 1 To dl

If k.cell(0, 2).Value = "HOME CARE" Then p.cell(0, 1).Value = "ENTRETIEN"
ElseIf k.cell(0, 2).Value = "PERSONNAL CARE" Then k.cell(0, 1).Value = "HYGIENE"
ElseIf k.cell(0, -3).Value = "A341" Then k.cell(0, 1).Value = "EPICERIE"
ElseIf k.cell(0, -3).Value = "A343" Then k.cell(0, 1).Value = "FRAIS"
ElseIf k.cell(0, -3).Value = "A319" Then k.cell(0, 1).Value = "FRAIS"
ElseIf k.cell(0, -3).Value = "A334" Then k.cell(0, 1).Value = "FRAIS"
ElseIf k.cell(0, -3).Value = "A361" Then k.cell(0, 1).Value = "GLACE"
ElseIf k.cell(0, -3).Value = "A364" Then k.cell(0, 1).Value = "GLACE"
End If
End With
Next
Loop While booTrouve
End Sub
 

Pièces jointes

  • ex 1 macro.xls
    29.5 KB · Affichages: 155
  • ex 1 macro.xls
    29.5 KB · Affichages: 190
  • ex 1 macro.xls
    29.5 KB · Affichages: 181

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonsoir le fil, bonsoir le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :
Code:
Sub VALEUR()
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)

dl = Cells(Application.Rows.Count, 12).End(xlUp).Row 'définit la dernière ligne éditée dl de la coloone 12 (=L)
Set pl = Range("L2:L" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    Select Case cel.Value 'action en fonction de la valeur de la cellule cel
        Case "HOME CARE" 'cas "HOME CARE"
            cel.Offset(0, -1).Value = "ENTRETIEN" 'écrit "ENTRETIEN" dans la cellule en colonne K
        Case "PERSONAL CARE" 'cas "PERSONAL CARE"
            cel.Offset(0, -1).Value = "HYGIÈNE" 'écrit "HYGIÈNE" dans la cellule en colonne K
        Case "A341" 'cas "A341"
            cel.Offset(0, -1).Value = "ÉPICERIE" 'écrit "ÉPICERIE" dans la cellule en colonne K
        Case "A343" 'cas "A343"
            cel.Offset(0, -1).Value = "FRAIS" 'écrit "FRAIS" dans la cellule en colonne K
        Case "A319" 'cas "A319"
            cel.Offset(0, -1).Value = "FRAIS" 'écrit "FRAIS" dans la cellule en colonne K
        Case "A334" 'cas "A334"
            cel.Offset(0, -1).Value = "FRAIS" 'écrit "FRAIS" dans la cellule en colonne K
        Case "A361" 'cas "A361"
            cel.Offset(0, -1).Value = "GLACE" 'écrit "GLACE" dans la cellule en colonne K
        Case "A364" 'cas "A364"
            cel.Offset(0, -1).Value = "GLACE" 'écrit "GLACE" dans la cellule en colonne K
    End Select 'fin de l'action en fonction de la valeur de la cellule
Next cel 'prochaine cellule de la boucle
End Sub
Le fichier :
 

Pièces jointes

  • Mlz_vba_v01.xls
    36 KB · Affichages: 219

eriiic

XLDnaute Barbatruc
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonsoir,

j'ai une erreur incompatibilité de type sur For k = 1 To dl
Oui effectivement, c'était le jeu des 7 erreurs et celle-ci était passée inaperçue.

1) Tu ne peux faire une boucle for i = ... qu'avec un numérique, et k est Range (une cellule ou une plage comme ici).
Je te conseille de nommer k autrement qu'on reconnaisse que c'est une plage.
Pour la parcourir : utiliser for each ... in ...

2) si tu utilises la structure if (test) then (alors), ta ligne est complète et ton if est terminé. Il n'attend pas de endif et de else ni de elseif non plus. Ce sont des erreurs pour vba.
Si tu veux utiliser else ou elseif il faut un if sur plusieurs lignes et plus rien derrière les then
Ex:
Code:
Dim c as range
For each c in k
         if c = ... then 
          ...
         elseif c = ... then 
          ...
        endif
next c

3) tu as un Loop While booTrouve qui se balade tout seul...

Maintenant que tu as mis ton fichier on comprend mieux où tu veux en venir.
Si tu as plus d'une dizaine de codes, ou si la liste est sujette à évolution, je ferais plutôt dans une autre feuille Datas une liste à 2 colonnes avec Code et sa Cat.
Ta macro devant rechercher le code (avec .find par exemple) et ramener la Cat à la cellule d'offset(0,1)
C'est juste une proposition qui t'évitera de saisir autant de if que tu as de codes Données1 (apparemment en Données 2 tu n'as que 2 codes qui t’intéressent, si c'est le cas tu peux laisser dans des If), et qui permettra une mise à jour sans retoucher le code.

eric
 
Dernière édition:

mlz_vba

XLDnaute Nouveau
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonjour à tous,

Merci beaucoup Robert, ton code est tres clair, en effet avec un "select" c'est plus logique!

Par contre j'avais des données dans 2 colonnes differentes (H et L), du coup le
Set pl = Range("L2:L" & dl) n'est pas suffisant.
Du coup j'ai fait 2 macro à la suite avec un Set pl = Range("H2:H" & dl) dans la deuxieme.
Vous avez une autre solution?

Merci Eric pour ton explication sur IF.
Je vais étudier le fonctionnement avec une feuille data, est-ce que tu penses que ça augmentera la rapidité de la macro?

Encore merci et bonne journée!
 

eriiic

XLDnaute Barbatruc
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonjour,

Je vais étudier le fonctionnement avec une feuille data, est-ce que tu penses que ça augmentera la rapidité de la macro?
Oui, bien sûr.
D'un coté tu fais (en moyenne) la moitié des if avant de trouver la Cat, de l'autre tu la trouves directement. et ça multiplié par le nombre de cellules.
Quand tu écris dans les cellules tu peux gagner du temps en bloquant le rafraichissement écran avec
Application.ScreenUpdating = False
avant la boucle, remettre à True en sortie

Et si vraiment c'est encore trop lent le mieux est de travailler en mémoire.
voir exemple joint (n'hésite pas à jouer de la touche F1, voire de google pour le dictionary)

eric
 

Pièces jointes

  • ex 1 macro.xls
    43.5 KB · Affichages: 157
  • ex 1 macro.xls
    43.5 KB · Affichages: 199
  • ex 1 macro.xls
    43.5 KB · Affichages: 224

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - macro avec boucle et condition IF sur plusieurs colonnes

Bonjour le fil, bonjour le forum,


Oui pardon dans ma précipitance je navet (si,si, dans ce cas là ça s'écrit comme ça...) pas vu ! Le code modifié :
Code:
Sub VALEUR()
Dim dl As Long 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)

dl = Cells(Application.Rows.Count, 12).End(xlUp).Row 'définit la dernière ligne éditée dl de la coloone 12 (=L)
Set pl = Application.Union(Range("H2:H" & dl), Range("L2:L" & dl)) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    Select Case cel.Value 'action en fonction de la valeur de la cellule cel
        Case "HOME CARE" 'cas "HOME CARE"
            Cells(cel.Row, 11).Value = "ENTRETIEN" 'écrit "ENTRETIEN" dans la cellule en colonne K
        Case "PERSONAL CARE" 'cas "PERSONAL CARE"
            Cells(cel.Row, 11).Value = "HYGIÈNE" 'écrit "HYGIÈNE" dans la cellule en colonne K
        Case "A341" 'cas "A341"
            Cells(cel.Row, 11).Value = "ÉPICERIE" 'écrit "ÉPICERIE" dans la cellule en colonne K
        Case "A343" 'cas "A343"
            Cells(cel.Row, 11).Value = "FRAIS" 'écrit "FRAIS" dans la cellule en colonne K
        Case "A319" 'cas "A319"
            Cells(cel.Row, 11).Value = "FRAIS" 'écrit "FRAIS" dans la cellule en colonne K
        Case "A334" 'cas "A334"
            Cells(cel.Row, 11).Value = "FRAIS" 'écrit "FRAIS" dans la cellule en colonne K
        Case "A361" 'cas "A361"
            Cells(cel.Row, 11).Value = "GLACE" 'écrit "GLACE" dans la cellule en colonne K
        Case "A364" 'cas "A364"
            Cells(cel.Row, 11).Value = "GLACE" 'écrit "GLACE" dans la cellule en colonne K
    End Select 'fin de l'action en fonction de la valeur de la cellule
Next cel 'prochaine cellule de la boucle
End Sub
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…