Cellules vides non détectées comme tel

Bonjour,

Dans le cadre d'un projet d'entreprise je dois déterminer plusieurs fois la dernière ligne d'une feuille. Pour cela j'utilise la formule

der_ligne_result = ThisWorkbook.Sheets(feuil).Cells(Rows.Count, 4).End(xlUp).Row

ou feuil est le nom de ma feuille.

Cette ligne de code ne me renvoie pas la "bonne" valeur car, lorsque je regarde directement via Ctrl + flèche du haut, la dernière cellule remplie de la feuille ..... n'est pas remplie.

Ces cellules sont le résultats d'une copie de VALEUR de cellules contenants des formules de calculs.

Vous pouvez trouve un exemple sur le document joint :

Arthur.

Auriez-vous des idées de comment ne détecter que les cellules avec de "vrai" valeur ?

Cordialement,

Arthur.

Bonjour,

En effet une cellule vide par formule n'est pas vide, elle contient la formule...

Votre code permet de trouver la dernière cellule non vide de la colonne, un fois cette ligne trouvée, faire une boucle négative de cette ligne vers la ligne 1 en faisant un test sur la valeur qu'elle contient :

For I=Der_ligne_result To 1 Step-1
If Cells(I, 4).Value <> "" Then
Der_ligne_result = I
Exit For
End If
Next I

Der_ligne_result aura alors le bon numéro de ligne, enfin je crois

Mais il a certainement une façon plus simple...

@ bientôt

LouReeD

Merci LouReeD pour t'être intéressée à mon problème.

Sur le document joint, j'ai fait un copie des valeurs ressorties par les formules, je n'ai donc, normalement, plus les formule ne renvoyant rien qui sont détecté. En pratique ce n'est pas le cas.

Ta solution fonctionnerai, j'y ai pensé, mais si j'ai un document contenant énormément de ligne cela prendrait beaucoup de temps, ce que j'aimerai évité :/ .

As-tu une autre solutions à proposer ? As-tu déjà le même problème sur un document créé par tes soins ?

Cordialement,

Arthur.

Une solution équivalente en mettant la colonne en mémoire dans un tableau VBA et de faire la boucle sur ce tableau, rapidité assurée malgré la méthode "archaïque"!

Dim tableau As Range, der_ligne_result As Long, I As Long
Set tableau = Range("D1").Resize(der_ligne_result)
For I=tableau.Rows.Count to 1 step -1
If tableau(I).VALUE <>"" Then
Der_ligne_result = I
Exit For
Next I

@ bientôt

LouReeD

Une solution équivalente en mettant la colonne en mémoire dans un tableau VBA et de faire la boucle sur ce tableau, rapidité assurée malgré la méthode "archaïque"!

Merci LouReed pour tes propositions. Je ne comprend pas pourquoi la seconde méthode serai plus rapide alors qu'on ajoute du contenue ? Pourrais-tu m'expliquer ?

Sinon ta première méthode marche parfaitement. Excel me déçois tout de même un peu avec ces cellules vides détectées comme non vide ... BREF merci de ton implication.

Bonne journée à toi et tous les lecteurs

Arthur.

Bonjour,

La deuxième méthode est plus rapide car il n'y a pas d'accès à la feuille à chaque rotation de la boucle, et en VBA, les accès feuille ralentissent considérablement l'exécution du code. Donc un accès feuille au début pour mettre d'un coup les données de la colonne en mémoire et le reste du code s'exécute en mémoire vive sous VBA... Donc plus rapide.

Évidemment cela ne se voit pas sur des "petits codes" mais pour ma part j'ai eu à faire un code qui passer d'une feuille à l'autre sur énormément de lignes et je suis passé de plus de 20 minutes à 7 secondes en mettant toutes les variables en tableau, en mettant le tableau final en variable, puis en mettant ce tableau final en une fois sur la feuille "résultat"

Donc accès feuilles pour le remplissage de 4 tableaux de variables source, et un accès feuille pour le tableau final, tout le reste en mémoire vive sous VBA.

Voilà le pourquoi du comment

@ bientôt

LouReeD

Rechercher des sujets similaires à "vides detectees comme tel"