Parcourir une colonne jusqu'à la dernière case non vide

Bonjour.

En fait tou est dans le titre, je pensais avoir la réponse avec le programme ci-dessous, mais en fait il parcours bien la colonne b mais par contre, le sendkeys"{cela}" semble renvoyer chaque fois le contenu de la cellule A1, je ne comprends pas. Tout est expliqué directement sur le code également si jamais c'est plus simple.

Voici le code :

Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub envoi()

    Dim cela As Range
    Dim celb As Range

Shell ("cmd /c C:\Users\XXXXX\Desktop\XXXXXXXX")

    Application.Wait (Now + TimeValue("0:00:5"))

    For Each cela In Range("A1:A" & Range("A1").End(xlDown).Row)
    For Each celb In Range("B1:B" & Range("B1").End(xlDown).Row)

    Sleep 250
    Application.SendKeys "{TAB}"
    Sleep 250
    Application.SendKeys cela   'CETTE LIGNE SEMBLE RENVOYER CHAQUE FOIS LE CONTENU DE A1
    Sleep 250
    Application.SendKeys "{TAB}"
    Sleep 250
    Application.SendKeys celb] 'ALORS QUE CELLE-CI RENVOIE BIEN, D'ABORD LE CONTENU DE B1, puis DE B2, puis DE B3, etc...
    Sleep 250
    Application.SendKeys "{TAB}"
    Sleep 250
    Application.SendKeys "10"
    Sleep 250

    Next celb
    Next cel

End Sub

Merci d'avance pour votre aide.

Bonsoir,

cel ou cela ? Il faut choisir !

Bonsoir,

cel ou cela ? Il faut choisir !

Désolé, c'est bien "cela" (cellules de la colonne A), et c'est bien cela que j'ai écrit chaque fois dans le code, c'est une erreur sur le forum seulement .

Malheureusement le bug ne vient donc pas de là. Et du coup je ne vois pas où est mon erreur.

Si c'est le cas, tes boucles étant imbriquées tu ne dois pas oublier qu'entre chaque cellule cela vont défiler toutes les cellules celb !

Cordialement.

Si c'est le cas, tes boucles étant imbriquées tu ne dois pas oublier qu'entre chaque cellule cela vont défiler toutes les cellules celb !

Cordialement.

Je vois. Mais du coup, partant de là, est-ce qu'il y a une possibilité de faire ce que je souhaite ?

À savoir :

  • Je vais jusqu'à un champs avec des sendkeys"{TAB}"
  • J'envoie le contenu de A1
  • Je passe au champs suivant
  • J'envoie le contenu de B1
  • Je fais ce que j'ai à faire lol
Puis : - Je recommence mais avec A2 et B2, puis A3 et B3, etc...

EDIT : Cela fonctionnerait en "encadrant" le sendkeys cela par le for cela et le sendkeys celb par le for celb ??

Bonjour,

j'ai l'impression que tu veux envoyer Ax et Bx pour chaque ligne.

Donc 1 seule boucle sur les lignes.

Au passage prend l'habitude de désigner la propriété voulue sans laisser excel deviner (parfois mal), donc

for lig = 1 to derlig

Senkeys cells(lig, "A").value

Senkeys cells(lig, "B").value

etc

eric

Bonjour,

j'ai l'impression que tu veux envoyer Ax et Bx pour chaque ligne.

Donc 1 seule boucle sur les lignes.

Au passage prend l'habitude de désigner la propriété voulue sans laisser excel deviner (parfois mal), donc

for lig = 1 to derlig

Senkeys cells(lig, "A").value

Senkeys cells(lig, "B").value

etc

eric

Je ne suis pas sûr d'avoir compris ton message.

En fait, dans l'appli que j'ouvre, il y a un champs texte où je veux envoyer A1, un autre où je veux envoyer B1, valider, puis une fois ça fait, répéter l'opération avec A2 dans le premier champs et B2 dans le deuxième. Et ce, jusqu'a la dernière cellule non vide de chaque colonne. J'espère que je suis clair.

Bonjour,

Comme Eric te l'a dit, il ne te faut qu'une seule boucle... et la boucle For Each... Next n'est pas la mieux adaptée. ou alors tu procèdes ainsi :

    Dim cel As Range
    '...
    For Each cel In Range("A1:A" & Range("A1").End(xlDown).Row)
    '...
        Application.SendKeys cel
    '...
        Application.SendKeys cel.Offset(, 1)
    '...
    Next cel
    '...

Cordialement.

Bonjour,

Comme Eric te l'a dit, il ne te faut qu'une seule boucle... et la boucle For Each... Next n'est pas la mieux adaptée. ou alors tu procèdes ainsi :

    Dim cel As Range
    '...
    For Each cel In Range("A1:A" & Range("A1").End(xlDown).Row)
    '...
        Application.SendKeys cel
    '...
        Application.SendKeys cel.Offset(, 1)
    '...
    Next cel
    '...

Cordialement.

Ah merci, j'essaierai ça des que possible.

Quel boucle serai mieux adaptée alors ?

Bonjour,

les 2 sont équivalentes.

eric

Je ne dis pas ça souvent, car malheureusement il est rare que je trouve ce que je veule sur les forum, mais merci beaucoup, ça va m'être d'une grande utilité .

Désolé, je fais un double message, mais j'ai une dernière question :

même si je n'ai pas trop de problèmes, il arrive que lorsque la macro lance l'appli en question avec le Shell, celle-ci mette un peu de temps à se charger, et du coup, le premier sendkeys se fait durant ce temps de chargement, donc est-ce qu'il y a un moyen de faire attendre que l'appli soit bien ouverte, autre qu'avec "Application.wait" ou "Sleep" ? ou est-ce le seul moyen ?

Excel n'est pas très riche dans ce domaine, ce n'est pas son but.

Sans doute avec une API mais je ne saurais te dire.

Tu pourrais regarder du coté des logiciels de macro windows avec plus de possibilités. Certains sont même capables de scruter la fenêtre active pour y détecter si une chaine particulière est bien présente pour bien synchroniser.

eric

Merci. Malheureusement dans mon cas c'est pour une utilisation professionnelle et je ne suis pas libre de telecharger ce que je veux, mais c'est pas grave je me débrouillerai avec application.wait

Rechercher des sujets similaires à "parcourir colonne derniere case vide"