OVH Cloud OVH Cloud

Recherche de la dernière colonne occupée..

13 réponses
Avatar
Jean-Luc GARNIER
Bonjour,

Je cherche =E0 identifier la derni=E8re cellule occup=E9e sur=20
une ligne. Le code est assez simple et fait appel =E0 un=20
banal : Cells(i,j) <> "".

Je viens de d=E9couvrir qu'il ne trouve rien si la colonne=20
en question est masqu=E9e ! Pourtant, la boucle est bien=20
ex=E9cut=E9e, mais lorsqu'il arrive sur la cellule non vide,=20
le test if (Cells(i,j) <> "") ne d=E9clenche pas !

N'est-ce pas un bug d'Excel ?

Merci d'avance pour votre aide !

Jean-Luc

3 réponses

1 2
Avatar
Michel Gaboly
Bonjour,

Tu obtiens une référence circulaire si la formule est sur
la même ligne que la ligne testée (ligne 16 ici).

Sinon, cela fonctionne ; je peux t'envoyer un exemple dans
ta Bal si tu veux.

Quant au principe, ESTVIDE() renvoie une matrice composée de
VRAi et/ou FAUX selon que la cellule correspondante contient
quelque chose ou non. COLONNE() renvoie le numéro de colonne
des cellules.

Excel interprête VRAI comme 1, et FAUX comme 0. Le produit
est donc une matrice alternant les numéros de colonnes des cel-
lules non vides et des 0 pour les cellules vides.

La + grande valeur, renvoyée par MAX() est donc le + grand
numéro de colonne correspondant à une cellule non vide.

Par exemple dans un nouveau classeur, entre une valeur que
conque en A1, A3 et A6.

Sur une AUTRE LIGNE, entre

=MAX(NON(ESTVIDE(A1:F1)) * COLONNE(A1:F1))

à valider en matricielle (Ctrl (ou Commande sur Mac) +
Enter ; la formule doit apparaître entre accolades dans la barre
de formukes :

{=MAX(NON(ESTVIDE(A1:F1)) * COLONNE(A1:F1))}



NON(ESTVIDE(A1:F1))

renvoie

{VRAI;FAUX;VRAI;FAUX;FAUX;VRAI}

équivalent à

{1;0;1;0;0;1}

et COLONNE(A1:F1)

renvoie

{1;2;3;4;5;6}

Le produit des 2 est

{1;0;3;0;0;6}

Et la formule matricielle compète (avec MAX) renvoie 6.



NB - tu peux vérifier le résultat d'une partie de la formule
en la surlignant dans la barre de formules et en appuyant sur
F9 (Win) ou Commande + "=" (Mac)


J'espère que cela te paraîtra + clair.




Merci beaucoup !

La syntaxe If Not IsEmpty(...) fonctionne très bien mais
je n'ai 1) pas compris et 2) pas réussi à faire
fonctionner l'autre proposition (que j'aurais pourtant
préférée) =MAX(NON(ESTVIDE(16:16)) * COLONNE(16:16)) !

Es tu sûr de cette formule, car j'obtiens un 'référence
circulaire error' !..

Merci de ton aide !

Jean-Luc

-----Message d'origine-----
Bonjour Jean-Luc,

Pas de problème chez moi avec ce code :

Sub DerCellLigne()
Dim i As Integer, MaxCol As Integer
With ActiveCell
For i = 0 To
ActiveSheet.UsedRange.Columns.Count +

ActiveSheet.UsedRange.Column - 2
If Not IsEmpty(.Offset(0, i)) Then
MaxCol = i + 1
End If
Next i
End With
MsgBox MaxCol
End Sub


Tu peux également obtenir le résultat sans VBA :

pour la ligne 16 :

=MAX(NON(ESTVIDE(16:16)) * COLONNE(16:16))

à valider en matricielle

ou mieux encore, en passant par une indirection et
en mettant le numéro de ligne en A1 :

=MAX(NON(ESTVIDE(INDIRECT(A1 & ":" & A1))) * COLONNE
(INDIRECT(A1 & ":" & A1)))


à valider également en matricielle, bien sûr.



Bonjour,

Je cherche à identifier la dernière cellule occupée sur
une ligne. Le code est assez simple et fait appel à un
banal : Cells(i,j) <> "".

Je viens de découvrir qu'il ne trouve rien si la colonne
en question est masquée ! Pourtant, la boucle est bien
exécutée, mais lorsqu'il arrive sur la cellule non vide,
le test if (Cells(i,j) <> "") ne déclenche pas !

N'est-ce pas un bug d'Excel ?

Merci d'avance pour votre aide !

Jean-Luc


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


.




--
Cordialement,

Michel Gaboly
http://www.gaboly.com



Avatar
Jean-Luc GARNIER
Merci beaucoup, c'est effectivement beaucoup plus clair !!
Par contre, je suis obligé d'utiliser la formule sur la
même ligne que la zone de recherche, je vais donc bricoler
pour résoudre la référence circulaire..

Merci encore !

Jean-Luc

-----Message d'origine-----
Bonjour,

Tu obtiens une référence circulaire si la formule est sur
la même ligne que la ligne testée (ligne 16 ici).

Sinon, cela fonctionne ; je peux t'envoyer un exemple dans
ta Bal si tu veux.

Quant au principe, ESTVIDE() renvoie une matrice composée
de

VRAi et/ou FAUX selon que la cellule correspondante
contient

quelque chose ou non. COLONNE() renvoie le numéro de
colonne

des cellules.

Excel interprête VRAI comme 1, et FAUX comme 0. Le produit
est donc une matrice alternant les numéros de colonnes
des cel-

lules non vides et des 0 pour les cellules vides.

La + grande valeur, renvoyée par MAX() est donc le + grand
numéro de colonne correspondant à une cellule non vide.

Par exemple dans un nouveau classeur, entre une valeur que
conque en A1, A3 et A6.

Sur une AUTRE LIGNE, entre

=MAX(NON(ESTVIDE(A1:F1)) * COLONNE(A1:F1))

à valider en matricielle (Ctrl (ou Commande sur Mac) +
Enter ; la formule doit apparaître entre accolades dans
la barre

de formukes :

{=MAX(NON(ESTVIDE(A1:F1)) * COLONNE(A1:F1))}



NON(ESTVIDE(A1:F1))

renvoie

{VRAI;FAUX;VRAI;FAUX;FAUX;VRAI}

équivalent à

{1;0;1;0;0;1}

et COLONNE(A1:F1)

renvoie

{1;2;3;4;5;6}

Le produit des 2 est

{1;0;3;0;0;6}

Et la formule matricielle compète (avec MAX) renvoie 6.



NB - tu peux vérifier le résultat d'une partie de la
formule

en la surlignant dans la barre de formules et en appuyant
sur

F9 (Win) ou Commande + "=" (Mac)


J'espère que cela te paraîtra + clair.




Merci beaucoup !

La syntaxe If Not IsEmpty(...) fonctionne très bien mais
je n'ai 1) pas compris et 2) pas réussi à faire
fonctionner l'autre proposition (que j'aurais pourtant
préférée) =MAX(NON(ESTVIDE(16:16)) * COLONNE(16:16)) !

Es tu sûr de cette formule, car j'obtiens un 'référence
circulaire error' !..

Merci de ton aide !

Jean-Luc

-----Message d'origine-----
Bonjour Jean-Luc,

Pas de problème chez moi avec ce code :

Sub DerCellLigne()
Dim i As Integer, MaxCol As Integer
With ActiveCell
For i = 0 To
ActiveSheet.UsedRange.Columns.Count +

ActiveSheet.UsedRange.Column - 2
If Not IsEmpty(.Offset(0, i))
Then



MaxCol = i + 1
End If
Next i
End With
MsgBox MaxCol
End Sub


Tu peux également obtenir le résultat sans VBA :

pour la ligne 16 :

=MAX(NON(ESTVIDE(16:16)) * COLONNE(16:16))

à valider en matricielle

ou mieux encore, en passant par une indirection et
en mettant le numéro de ligne en A1 :

=MAX(NON(ESTVIDE(INDIRECT(A1 & ":" & A1))) * COLONNE
(INDIRECT(A1 & ":" & A1)))


à valider également en matricielle, bien sûr.



Bonjour,

Je cherche à identifier la dernière cellule occupée
sur




une ligne. Le code est assez simple et fait appel à
un




banal : Cells(i,j) <> "".

Je viens de découvrir qu'il ne trouve rien si la
colonne




en question est masquée ! Pourtant, la boucle est
bien




exécutée, mais lorsqu'il arrive sur la cellule non
vide,




le test if (Cells(i,j) <> "") ne déclenche pas !

N'est-ce pas un bug d'Excel ?

Merci d'avance pour votre aide !

Jean-Luc


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


.




--
Cordialement,

Michel Gaboly
http://www.gaboly.com


.






Avatar
Michel Gaboly
De rien, ;-))

En te plaçant en colonne A, il faudrait simplement utiliser :

=MAX(NON(ESTVIDE(B16:IV16)) * COLONNE(B16:IV16))

C'est + compliqué si tu veux utiliser une autre colonne, sauf
si elle est au-delà de la dernière colonne qui t'intéresse. Par
exemple, si les colonnes "utiles" du tableau s'arrêtent en "H",
tu peux écrire sur la même ligne, À PARTIR de la colonne "I" :

=MAX(NON(ESTVIDE(A16:H16)) * COLONNE(A16:H16))



Merci beaucoup, c'est effectivement beaucoup plus clair !!
Par contre, je suis obligé d'utiliser la formule sur la
même ligne que la zone de recherche, je vais donc bricoler
pour résoudre la référence circulaire..

Merci encore !

Jean-Luc

-----Message d'origine-----
Bonjour,

Tu obtiens une référence circulaire si la formule est sur
la même ligne que la ligne testée (ligne 16 ici).

Sinon, cela fonctionne ; je peux t'envoyer un exemple dans
ta Bal si tu veux.

Quant au principe, ESTVIDE() renvoie une matrice composée
de

VRAi et/ou FAUX selon que la cellule correspondante
contient

quelque chose ou non. COLONNE() renvoie le numéro de
colonne

des cellules.

Excel interprête VRAI comme 1, et FAUX comme 0. Le produit
est donc une matrice alternant les numéros de colonnes
des cel-

lules non vides et des 0 pour les cellules vides.

La + grande valeur, renvoyée par MAX() est donc le + grand
numéro de colonne correspondant à une cellule non vide.

Par exemple dans un nouveau classeur, entre une valeur que
conque en A1, A3 et A6.

Sur une AUTRE LIGNE, entre

=MAX(NON(ESTVIDE(A1:F1)) * COLONNE(A1:F1))

à valider en matricielle (Ctrl (ou Commande sur Mac) +
Enter ; la formule doit apparaître entre accolades dans
la barre

de formukes :

{=MAX(NON(ESTVIDE(A1:F1)) * COLONNE(A1:F1))}



NON(ESTVIDE(A1:F1))

renvoie

{VRAI;FAUX;VRAI;FAUX;FAUX;VRAI}

équivalent à

{1;0;1;0;0;1}

et COLONNE(A1:F1)

renvoie

{1;2;3;4;5;6}

Le produit des 2 est

{1;0;3;0;0;6}

Et la formule matricielle compète (avec MAX) renvoie 6.



NB - tu peux vérifier le résultat d'une partie de la
formule

en la surlignant dans la barre de formules et en appuyant
sur

F9 (Win) ou Commande + "=" (Mac)


J'espère que cela te paraîtra + clair.




Merci beaucoup !

La syntaxe If Not IsEmpty(...) fonctionne très bien mais
je n'ai 1) pas compris et 2) pas réussi à faire
fonctionner l'autre proposition (que j'aurais pourtant
préférée) =MAX(NON(ESTVIDE(16:16)) * COLONNE(16:16)) !

Es tu sûr de cette formule, car j'obtiens un 'référence
circulaire error' !..

Merci de ton aide !

Jean-Luc

-----Message d'origine-----
Bonjour Jean-Luc,

Pas de problème chez moi avec ce code :

Sub DerCellLigne()
Dim i As Integer, MaxCol As Integer
With ActiveCell
For i = 0 To
ActiveSheet.UsedRange.Columns.Count +

ActiveSheet.UsedRange.Column - 2
If Not IsEmpty(.Offset(0, i))
Then



MaxCol = i + 1
End If
Next i
End With
MsgBox MaxCol
End Sub


Tu peux également obtenir le résultat sans VBA :

pour la ligne 16 :

=MAX(NON(ESTVIDE(16:16)) * COLONNE(16:16))

à valider en matricielle

ou mieux encore, en passant par une indirection et
en mettant le numéro de ligne en A1 :

=MAX(NON(ESTVIDE(INDIRECT(A1 & ":" & A1))) * COLONNE
(INDIRECT(A1 & ":" & A1)))


à valider également en matricielle, bien sûr.



Bonjour,

Je cherche à identifier la dernière cellule occupée
sur




une ligne. Le code est assez simple et fait appel à
un




banal : Cells(i,j) <> "".

Je viens de découvrir qu'il ne trouve rien si la
colonne




en question est masquée ! Pourtant, la boucle est
bien




exécutée, mais lorsqu'il arrive sur la cellule non
vide,




le test if (Cells(i,j) <> "") ne déclenche pas !

N'est-ce pas un bug d'Excel ?

Merci d'avance pour votre aide !

Jean-Luc


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


.




--
Cordialement,

Michel Gaboly
http://www.gaboly.com


.




--
Cordialement,

Michel Gaboly
http://www.gaboly.com





1 2