OVH Cloud OVH Cloud

Sélection première cellule non vide -> dernière non vide

35 réponses
Avatar
Tatanka
Salutatous et toutes,

Je veux pourtant faire quelque chose de tout simple :
À partir d'une cellule active quelconque, sélectionner par macro la plage
s'étendant de la première cellule non vide de la colonne contenant la cellule active
à la dernière cellule non vide de ladite colonne. En prévoyant tous les cas de figure!
Peux pas croire qu'il n'y a pas quelque chose de moins tordu que ça :

Sub Première_Dernière()
Dim L1 As Long, L2 As Long, NL As Long
Dim c As Range
Dim a As Range
Set a = ActiveCell
Set c = Columns(a.Column)
If Application.CountA(c) = 0 Then
MsgBox "Aucune valeur dans cette colonne."
Exit Sub
End If
NL = c.Rows.Count
col = a.Column
If Not IsEmpty(c.Rows(1)) Then
L1 = 1
Else
L1 = c.Rows(1).End(xlDown).Row
End If
If Not IsEmpty(c.Rows(NL)) Then
L2 = NL
Else
L2 = c.Rows(NL).End(xlUp).Row
End If
Range(Cells(L1, col), Cells(L2, col)).Select
End Sub

Qu'en pensez-vous ?

A+
Serge

10 réponses

1 2 3 4
Avatar
michdenis
Bonjour Daniel,

Suppose que tu as comme contenu dans la dernière cellule de ta colonne
une formule compliquée du genre : =Si(A1="";"") qui n'affiche aucun
contenu.

Si tu utilises le paramètre LookIn:=xlFormulas
la dernière cellule de la colonne trouvée sera celle
ayant cette formule.

Si tu utilises le paramètre LookIn:=XlValues
la dernière cellule trouvée de la colonne sera celle
affichant un contenu quelconque.

Quand tu ouvres Excel, ce paramètre est à XlFormulas par défaut
mais comme Excel retient la valeur de ce paramètre lors de la
dernière recherche qu'il a effectuée, il y a bien des chances que la
procédure retourne des faussetés selon ce que l'usager cherche et
la valeur du paramètre...Et il risque de chercher longtemps la source
de son erreur... !


MichD
--------------------------------------------
"DanielCo" a écrit dans le message de groupe de discussion : idtbtd$rcr$

Bonjour Denis,
Je ne pense pas que le paramètre "LookIn" joue quand tu cherches "*",
mais si c'est le cas, pour ma gouverne, donne-moi un exemple.
Daniel


Sauf si tu as des formules dans la plage qui retourne "" par exemple.

La méthode Find est alambiquée... il faut faire attention à certains
paramètres dont : LookIn:=xlFormulas OU LookIn:=xlValues selon ce que tu
recherches. Au même titre que tu dois te rappeler que la méthode find retient
pour certains de ses paramètres la valeur donnée lors du dernier usage de la
méthode Find qu'elle soit appelée en VBA ou par l'interface de calcul à
l'intérieur d'une même session de travail. Pour plus de détails, voir la note
en bas de page de l'aide d'Excel sur la méthode Find

Selon moi, ton approche n'est pas valide en "TOUTES" circonstances !


MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion :
idtaen$nq4$

Merci Daniel et Denis,

Sub Et_Finalement()
Set col = ActiveCell.EntireColumn
If Application.CountA(col) = 0 Then
MsgBox "Colonne vide."
Exit Sub
End If
Set Cellsup = col.Find("*", Cells(Rows.Count, ActiveCell.Column), , , ,
xlNext) Set Cellinf = col.Find("*", Cells(1, ActiveCell.Column), , , ,
xlPrevious) Range(Cellsup, Cellinf).Select
End Sub

me semble parfaite.

Serge
Avatar
michdenis
Bonjour Isabelle,

Que fais-tu si la colonne contient des formules ?


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtcid$sqf$

une autre,

x = Split(Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23).Address, ",")
L1 = x(0)
L2 = x(UBound(x))
Range(L1 & ":" & L2).Select

pi y fa fret en crisse

isabelle

Le 2010-12-10 00:36, Tatanka a écrit :
Bonsoir Isabelle,

Pas très chaud à Québec aujourd'hui :-)
Ta macro ne tient pas compte de tous les cas possibles mais elle m'inspire.

Bonne nuit,
« Si je devais recommencer ma vie, je ferais les mêmes erreurs... mais plus tôt ».
G.M.

Serge


"isabelle" a écrit dans le message de news: idsb1n$km2$
salut Serge,

L1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)(1).Address
L2 = Cells(65536, ActiveCell.Column).End(xlUp).Address
Range(L1& ":"& L2).Select

isabelle

Le 2010-12-09 21:59, Tatanka a écrit :
Sub Première_Dernière()
Dim L1 As Long, L2 As Long, NL As Long
Dim c As Range
Dim a As Range
Set a = ActiveCell
Set c = Columns(a.Column)
If Application.CountA(c) = 0 Then
MsgBox "Aucune valeur dans cette colonne."
Exit Sub
End If
NL = c.Rows.Count
col = a.Column
If Not IsEmpty(c.Rows(1)) Then
L1 = 1
Else
L1 = c.Rows(1).End(xlDown).Row
End If
If Not IsEmpty(c.Rows(NL)) Then
L2 = NL
Else
L2 = c.Rows(NL).End(xlUp).Row
End If
Range(Cells(L1, col), Cells(L2, col)).Select
End Sub







Avatar
isabelle
vous avez tout à fait raison Daniel et Denis,
ça rallonge un peut l'affaire,

On Error Resume Next
Set plg1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)
Set plg2 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeFormulas, 23)
a = plg1.Address
b = plg2.Address
c = a & b
x = Split(c, ",")
Range(x(0) & ":" & x(UBound(x))).Select


isabelle

.


Le 2010-12-10 09:32, michdenis a écrit :
Bonjour Isabelle,

Que fais-tu si la colonne contient des formules ?


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtcid$sqf$

une autre,

x = Split(Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23).Address, ",")
L1 = x(0)
L2 = x(UBound(x))
Range(L1& ":"& L2).Select

pi y fa fret en crisse

isabelle

Le 2010-12-10 00:36, Tatanka a écrit :
Bonsoir Isabelle,

Pas très chaud à Québec aujourd'hui :-)
Ta macro ne tient pas compte de tous les cas possibles mais elle m'inspire.

Bonne nuit,
« Si je devais recommencer ma vie, je ferais les mêmes erreurs... mais plus tôt ».
G.M.

Serge


"isabelle" a écrit dans le message de news: idsb1n$km2$
salut Serge,

L1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)(1).Address
L2 = Cells(65536, ActiveCell.Column).End(xlUp).Address
Range(L1& ":"& L2).Select

isabelle

Le 2010-12-09 21:59, Tatanka a écrit :
Sub Première_Dernière()
Dim L1 As Long, L2 As Long, NL As Long
Dim c As Range
Dim a As Range
Set a = ActiveCell
Set c = Columns(a.Column)
If Application.CountA(c) = 0 Then
MsgBox "Aucune valeur dans cette colonne."
Exit Sub
End If
NL = c.Rows.Count
col = a.Column
If Not IsEmpty(c.Rows(1)) Then
L1 = 1
Else
L1 = c.Rows(1).End(xlDown).Row
End If
If Not IsEmpty(c.Rows(NL)) Then
L2 = NL
Else
L2 = c.Rows(NL).End(xlUp).Row
End If
Range(Cells(L1, col), Cells(L2, col)).Select
End Sub










Avatar
news.free.fr
Oui, mais si on met xlformulas, Find trouve aussi les valeurs qui ne
sont pas des formules.
Daniel
Avatar
DanielCo
Oui, mais si on met xlformulas, Find trouve aussi les valeurs qui ne
sont pas des formules.
Daniel
Avatar
michdenis
Je crois que tu tentes de nous en passer une vite...;-))

Je n'obtiens pas le résultat espéré !

Ma plage débute et se terminer par une cellule contenant ce genre de formule : =SI(B3="";"")
et entre les deux, des cellules contenant des constantes...


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtg94$598$

vous avez tout à fait raison Daniel et Denis,
ça rallonge un peut l'affaire,

On Error Resume Next
Set plg1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)
Set plg2 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeFormulas, 23)
a = plg1.Address
b = plg2.Address
c = a & b
x = Split(c, ",")
Range(x(0) & ":" & x(UBound(x))).Select


isabelle

.


Le 2010-12-10 09:32, michdenis a écrit :
Bonjour Isabelle,

Que fais-tu si la colonne contient des formules ?


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtcid$sqf$

une autre,

x = Split(Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23).Address, ",")
L1 = x(0)
L2 = x(UBound(x))
Range(L1& ":"& L2).Select

pi y fa fret en crisse

isabelle

Le 2010-12-10 00:36, Tatanka a écrit :
Bonsoir Isabelle,

Pas très chaud à Québec aujourd'hui :-)
Ta macro ne tient pas compte de tous les cas possibles mais elle m'inspire.

Bonne nuit,
« Si je devais recommencer ma vie, je ferais les mêmes erreurs... mais plus tôt ».
G.M.

Serge


"isabelle" a écrit dans le message de news: idsb1n$km2$
salut Serge,

L1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)(1).Address
L2 = Cells(65536, ActiveCell.Column).End(xlUp).Address
Range(L1& ":"& L2).Select

isabelle

Le 2010-12-09 21:59, Tatanka a écrit :
Sub Première_Dernière()
Dim L1 As Long, L2 As Long, NL As Long
Dim c As Range
Dim a As Range
Set a = ActiveCell
Set c = Columns(a.Column)
If Application.CountA(c) = 0 Then
MsgBox "Aucune valeur dans cette colonne."
Exit Sub
End If
NL = c.Rows.Count
col = a.Column
If Not IsEmpty(c.Rows(1)) Then
L1 = 1
Else
L1 = c.Rows(1).End(xlDown).Row
End If
If Not IsEmpty(c.Rows(NL)) Then
L2 = NL
Else
L2 = c.Rows(NL).End(xlUp).Row
End If
Range(Cells(L1, col), Cells(L2, col)).Select
End Sub










Avatar
michdenis
Je ne comprends pas le sens de ton commentaire...

La question, celle que j'ai comprise demandait de sélectionner
la première et la dernière cellule occupée, sans faire la discrimination
entre les valeurs ou les éventuelles formules contenues dans la colonne.

Si tu entres comme première et dernière cellule de la colonne une
formule qui retourne "" ((si(A1="";"") par exemple) et des valeurs entre
ces 2 cellules, utilise à tour de rôle la procédure avec le paramètre de la
méthode Find avec LookIn:=xlformulas et lookin:=xlvalues
tu vas te rendre compte que la plage de cellules sélectionnées est très
différente.
Comme ce paramètre retient la valeur de la dernière recherche effectuée,
durant une session, il devient impératif de définir ce paramètre afin d'obtenir
le résultat escompté.


MichD
--------------------------------------------
"DanielCo" a écrit dans le message de groupe de discussion : 4d024501$0$5044$

Oui, mais si on met xlformulas, Find trouve aussi les valeurs qui ne
sont pas des formules.
Daniel
Avatar
Daniel.C
Je me suis mal exprimé; je voulais simplement dire qu'avec
"xlformulas", on récupérais la bonne cellule,, qu'il y ait dedans une
formule ou une constante. Mais il faut spécifier "xlformulas" pour être
bordé.
Daniel
Je ne comprends pas le sens de ton commentaire...

La question, celle que j'ai comprise demandait de sélectionner
la première et la dernière cellule occupée, sans faire la discrimination
entre les valeurs ou les éventuelles formules contenues dans la colonne.

Si tu entres comme première et dernière cellule de la colonne une
formule qui retourne "" ((si(A1="";"") par exemple) et des valeurs entre
ces 2 cellules, utilise à tour de rôle la procédure avec le paramètre de la
méthode Find avec LookIn:=xlformulas et lookin:=xlvalues
tu vas te rendre compte que la plage de cellules sélectionnées est très
différente.
Comme ce paramètre retient la valeur de la dernière recherche effectuée,
durant une session, il devient impératif de définir ce paramètre afin
d'obtenir le résultat escompté.


MichD
--------------------------------------------
"DanielCo" a écrit dans le message de groupe de discussion :
4d024501$0$5044$

Oui, mais si on met xlformulas, Find trouve aussi les valeurs qui ne
sont pas des formules.
Daniel
Avatar
isabelle
à force de ...

On Error Resume Next
Set plg1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)
Set plg2 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeFormulas, 23)
a = Application.Substitute(Application.Substitute(plg1.Address & "," & plg2.Address, Left(ActiveCell.Address, 3), " "), ":", ",")
n = Split(a, ",")
For i = 0 To UBound(n)
If CDbl(n(i)) < n(1) Then x = CDbl(n(i))
If CDbl(n(i)) > n(1) Then y = CDbl(n(i))
Next i
Range(Cells(x, ActiveCell.Column), Cells(y, ActiveCell.Column)).Select

isabelle


Le 2010-12-10 10:53, michdenis a écrit :
Je crois que tu tentes de nous en passer une vite...;-))

Je n'obtiens pas le résultat espéré !

Ma plage débute et se terminer par une cellule contenant ce genre de formule : =SI(B3="";"")
et entre les deux, des cellules contenant des constantes...


MichD
--------------------------------------------
Avatar
michdenis
C'est mieux, mais tu ne crois sûrement pas que tu vas t'en tirer aussi facilement ;-))
essaie d'appliquer ta méthode à la colonne 1 du fichier que je te propose !

http://cjoint.com/?0mktIKBMUn7


MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtqui$vfv$

à force de ...

On Error Resume Next
Set plg1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)
Set plg2 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeFormulas, 23)
a = Application.Substitute(Application.Substitute(plg1.Address & "," & plg2.Address, Left(ActiveCell.Address, 3), " "),
":", ",")
n = Split(a, ",")
For i = 0 To UBound(n)
If CDbl(n(i)) < n(1) Then x = CDbl(n(i))
If CDbl(n(i)) > n(1) Then y = CDbl(n(i))
Next i
Range(Cells(x, ActiveCell.Column), Cells(y, ActiveCell.Column)).Select

isabelle


Le 2010-12-10 10:53, michdenis a écrit :
Je crois que tu tentes de nous en passer une vite...;-))

Je n'obtiens pas le résultat espéré !

Ma plage débute et se terminer par une cellule contenant ce genre de formule : =SI(B3="";"")
et entre les deux, des cellules contenant des constantes...


MichD
--------------------------------------------
1 2 3 4