Parcourir fichier et macro si

Résolu
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011 - 14 févr. 2008 à 15:48
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011 - 17 févr. 2008 à 00:13
Bonjour,

J'ai un fichier avec une formule rechercheV dans une partie de ma colonne T à partir de T18.
La rechercheV va chercher un nombre (une référence) dans un autre fichier. Parfois une référence apparaît souvent il n'y a rien.

Je voudrais via VBA que lorsqu'une référence apparaît lancer une macro.
Es-ce que ce code conviendrait?

cell = Range("T18")
For each cell in Range (T18:T2000)
if cell.value<>"" then
call MaMacro(activecell.value)
end if
cell = activecell.offset(1,0)
next cell

Merci

11 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
14 févr. 2008 à 23:15
Ceci devrait suffire, en principe...

Dim cell As Range
For each cell in Range("T18:T2000")
    if cell.value<>"" then _
        call MaMacro(cell.value)
Next

Comme tu boucles déjà en utilisant cell comme variable par rapport à Range défini (T18:T2000), il ne sert à rien de sélectionner la cellule ou d'utiliser Activecell

Par contre, plutôt que d'utiliser T2000 comme limite, tu pourrais déterminer le nombre de lignes à parcourir en connaissant la dernière ligne. J'imagine que 2000 est une limite que tu t'es donnée.

Dim cell As Range

Dim nbLignes As Long
nbLignes = Cells(Rows.Count, "T").End(xlUp).Row    'trouve la dernière ligne en T
For each cell in Range("T18:T" & nbLignes)

    if cell.value<>"" then _

        call MaMacro(cell.value)

Next

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 févr. 2008 à 20:45
C'est pour ça que je commencerais par la fin.
Quelque chose comme

Dim I as Long, nbLignes As Long
nbLignes = Cells(Rows.Count, "T").End(xlUp).Row  + 1  'première ligne vide
For I = nbLignes to 18 Step - 1
    if Range("T" & I - 1) <> "" then
        Call MaMacro(Range("T" & I - 1)
    End If
Next

Là, il faut savoir comment fonctionne ton autre macro qui insère la ligne. Si elle se fie à la cellule active, ça ne marchera pas. Il faut que tu lui passes la variable I (ou I - 1, à tester...) et qu'elle utilise cette valeur pour savoir où insérer la ligne.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 févr. 2008 à 23:24
cell est déclaré comme Range
Il faut donc utiliser Set pour lui passer l'objet Range

Set cell = Range("T" & I - 1)

Mais dans ton cas, ce n'est pas nécessaire d'utiliser cell, je pense (?) Enfin, c'est toi qui le sait...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
3
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
16 févr. 2008 à 19:55
Merci MPi² mais je bouclais sur activecell car la macro que j'appelle va insérer une ligne il faut donc que je saute une ligne après avoir appelé cette macro.

Voici mon code
Dim cell As Range
Dim result As Integer


For Each cell In Range("T18:T2000")
cell.Activate
    If IsNumeric(cell.Value) Then
    If cell.Value > 100 Then
    ref = cell.Value
    Application.Run "Ludo_odp.xla!insert_nouv_prod", ref
    cell = Range(ActiveCell.Offset(1, 0))
    End If
    End If
Next cell
Range("T18").Activate
End Sub


pour sauter cette ligne j'ai écris
    cell = Range(ActiveCell.Offset(1, 0))


Mais ce n'est pas juste cette ligne change la valeur de la cellule (exacte?) et je sèche un peu...

Merci pour ton aide.
Ludo
0

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

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 févr. 2008 à 20:14
Mais ce n'est pas juste cette ligne change la valeur de la cellule (exacte?)

Désolé, mais je n'ai pas compris...

Qu'est-ce qu'il y a dans ta Function xla ? Juste une insertion de ligne ?

Conseil: quand tu dois insérer ou supprimer des lignes, commence par la fin. Et utilise une boucle du genre
For I = nbLignes to 18 Step - 1
    '...
Next

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
16 févr. 2008 à 20:31
En fait le fichier dans lequel j'execute ce code est une liste de produits, lorsqu'un produit est obsolète il y a la référence du nouveau produit dans la colonne T de la ligne en question.

La macro que je créé actuellement parcour tout le fichier et s'il y a une référence dans la colonne T de la ligne actuelle alors on appel une autre macro "spéciale" qui va ajouter le nouveau produit.

Lorsqu'il n'y a pas de code (donc pas de nouveau produit à ajouter) on passe à la cell suivante mais lorsqu'on vient d'ajouter un produit passer à la cell suivante nous ramène à la position d'avant l'insertion du nouveau produit donc la macro va planter.

Je voudrais donc que la cell passe à la cellule suivante, comment faire?

Merci
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
16 févr. 2008 à 20:33
En fait pour l'écrire simplement je cherche un équivalent de "next cell" :)
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
16 févr. 2008 à 21:55
Merci mais dans mon tableau il y a parfois des lignes vides (saut de lignes pour la présentation). Donc je ne pourrai pas avoir le nbLignes.

N'existe-t-il pas d'équivalent de next cell? :-)

Merci
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 févr. 2008 à 22:24
La méthode que j'ai écrite pour trouver la "première" ligne vide est en fait pour trouver la dernière ligne remplie, peu importe s'il y a des lignes lignes précédemment. En ajoutant 1, tu te retrouves sur le première vide. En remontant, tu vérifies la ligne précédente, donc si tu insères une ligne (ou si tu la supprimais), ça ne nuirait pas à la position en I.

ex: tu es sur la ligne 10, tu insères une ligne en 9 et y inscris tes données. Au prochain tour de boucle tu te retrouves en 9 sur la ligne que tu viens d'éditer... Selon le cas, tu pourrais aussi insérer ta ligne directement en 10. À toi de voir.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
16 févr. 2008 à 22:48
MPi²,

Merci pour ton aide, je connaissais cette "parade" on avait déjà eu des échanges sur un sujet similaire dans le passé. J'adopte cette solution.

J'ai une dernière petite question

Pourquoi ceci
Dim cell As Range
cell = Range("T" & I - 1)

me renvoie l'erreur
"variable objet ou variable de bloc non définie?" sur la ligne cell = ..

Merci
Ludo
0
cs_Liro Messages postés 159 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 30 septembre 2011
17 févr. 2008 à 00:13
Super! Merci pour tout! ;)
0
Rejoignez-nous