Recherche dernière ligne d'une colonne avec import d'information à la suite

Bonjour les pros du VBA,

J'ai beau retourner le problème dans tous les sens, je bloque !

Voici le sujet :

Dans ma colonne AD10 (Ligne 10), je récupère des informations depuis un autre outil, ces informations commencent toutes par SA*

A la suite de cette colonne AD, je souhaite retrouver mes informations commençant par EL*

Pas de problème pour la macro récupérant les informations, le problème est plus sur se positionner sur la première ligne blanche afin d'enchainer avec la deuxième macro

Voici ce que j'ai fait mais ça bloque :

Range("AD10:AE20000").ClearContents

Call Run("CODA_elementListWithClear", "AD10", "HARMELLE", "3", "SA*", True, False)

DoEvents

Let NumLigne = 10

Let ColTraite = 30

Cells(NumLigne, ColTraite).Select

ActiveCell.End(xlDown).Select

Let NumFinLigne = ActiveCell.Row

If NumFinLigne = 1048576 Then

NumFinLigne = NumLigne

End If

If NumFinLigne = 10 Then

NumFinLigne = 9

End If

Call Run("CODA_elementListWithClear", Range(Cells(NumFinLigne + 1, ColTraite)), "HARMELLE", "3", "EL*", True, False)

DoEvents

Pour les infos en rouge, pas de problème, ça fonctionne, c'est principalement la partie en jaune qui pose problème, du moins c'est ce que je pense...

Merci à tous pour votre aide

Micka

Bonjour,

Si tu cesses de te positionner inutilement pour agir, cela cessera d'être un problème !

Cordialement.

Bonjour MFerrand,

J'ai pas tout compris là....

Chaque fois que tu Select une cellule tu déplaces le curseur, c'est toujours une action parasite s'il y a une action qui suit à réaliser. Donc si tu ne bouges plus en éliminant tout Select et donc sans recourir à ActiveCell mais en te contentant d'adresser les cellules visées, ton code sera plus clair, plus fiable et plus rapide...

Quant à ta partie en jaune, pas très lisible !!, on ne sait pas ce que tu fais précisément avant et après, mais tu devrais savoir à l'avance si tu excèdes la capacité en lignes de la feuille, et si tu reviens en AD9 tu vas écraser AD10 en faisant +1...

Voici avec quelques explications :

C'est la partie en rouge qui me pose problème

Range("AD10:AE20000").ClearContents

Call Run("CODA_elementListWithClear", "AD10", "HARMELLE", "3", "SA*", True, False)

DoEvents

Let NumLigne = 10 N° 1ère ligne de donnée (dans Excel) pour AD10

Let ColTraite = 30 N° de colonne de donnée à tester pour AD10

Cells(NumLigne, ColTraite).Select On sélectionne la cellule de départ

ActiveCell.End(xlDown).Select On descend en bas de la colonne

Let NumFinLigne = ActiveCell.Row Affecte à FinCopieLink le N° de ligne correspondant

If NumFinLigne = 1048576 Then Si la ligne trouvée est 1048576 soit tout en bas

NumFinLigne = NumLigne On renvoi la ligne de départ car la plage est vide

End If

If NumFinLigne = 10 Then Si toujours à 10 donc vide

NumFinLigne = 9 Pour pouvoir faire +1 dans la destination de la nouvelle liste

End If

Call Run("CODA_elementListWithClear", Range(Cells(NumFinLigne + 1, ColTraite)), "HARMELLE", "3", "EL*", True, False)

DoEvents

Bonjour,

En préambule, je t'inciterais à apprendre à utiliser les balises Code pour citer du code dans un post ! Tous les intervenants te sauront gré de leur faciliter la lecture du code.

Ceci étant, on n'a pas connaissance du contexte, on ne sait ce que fait ta procédure appelée, on ignore aussi si la macro citée est complète ou ne constitue qu'un fragment, en l'absence d'instructions de déclarations de procédures, donc on ne peut qu'en rester à des idées générales et quelques spéculations...

L'élimination des Select, Selection, ActiveCell... de ton code est une recommandation générale qui vaut pour tout code... Dès qu'on trouve un Select dans un code, c'est une scorie d'enregistrement, ou d'imitation de code enregistrée, indice d'un code de qualité douteuse, situation dont il est toujours souhaitable de sortir en s'affranchissant des contraintes liant les instructions à des éléments actifs...

J'éliminerais aussi volontiers quelques autres fioritures dont on n'a nul besoin : Call, Run, Let...

En ce qui concerne End, il vaudrait mieux utiliser le paramètres xlUp plutôt que xlDown, il réserve moins de surprises... Et ne pas oublier que la première cellule vide est celle qui suit la cellule renvoyée par la propriété.

Cordialement.

Merci pour votre aide

Le problème est que je ne peux pas vous joindre ma feuille Excel car la macro ne peut fonctionner qu'avec un outil externe (Progiciel comptable) d'où la présence de Call Run, etc... obligatoire pour son bon fonctionnement !

La macro ci-dessous me retourne en colonne AD un certain nombre d'information issue de cet outil qui peuvent évoluer et qui commence toute par SA* :

Range("AD10:AE20000").ClearContents

Call Run("CODA_elementListWithClear", "AD10", "HARMELLE", "3", "SA*", True, False)

DoEvents

Mon souhait est que mon curseur se positionne, une fois cette macro aboutie, sur la première cellule vide de la colonne AD pour enchainer avec la macro ci-dessous :

Call Run("CODA_elementListWithClear", Range(Cells(NumFinLigne + 1, ColTraite)), "HARMELLE", "3", "EL*", True, False)

DoEvents

Qui me retournera à la suite de mes SA*, les informations commençants par EL*

Merci à vous

Vraiment une manie de vouloir toujours se positionner...

D'après ce que je vois de ton premier appel sur AD10 :

cc = Range("AD" & Rows.Count).End(xlUp) (2).Address

cc est une variable à déclarer en début de procédure, de type String.

Et tu remplaces Range(Cells(NumFinLigne + 1, ColTraite)) par cc dans ton appel.

Ce sera bien analogue au premier appel, dans lequel tu fournis l'argument : "AD10" (soit la référence de cellule sous forme de valeur String).

Ce sera ainsi la même chose, et de plus sans positionnement inutile (et chronophage)

Cordialement.

Bonjour MFerrand,

Et bien c'est tout bon

Merci beaucoup à vous d'avoir pris le temps de me répondre

Très bonne journée

Micka

Merci du retour, et bonne continuation.

Rechercher des sujets similaires à "recherche derniere ligne colonne import information suite"