Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

5 réponses

1 2 3 4
Avatar
isabelle
ben voilà, j'crois pas qu'on peut faire mieux,
bon w.e. à toi également,
isabelle

Le 2010-12-10 15:42, Tatanka a écrit :
Bonne fin de semaine Isabelle et essaie de ne pas congeler si
tu mets le bout du nez dehors. Et pour rigoler :

Sub Tellement_Simple()
Dim c As Range
Set c = Columns(ActiveCell.Column)
If Application.CountA(c) = 0 Then MsgBox "Aucune valeur dans cette colonne.": Exit Sub
Range(Cells(IIf(IsEmpty(c.Rows(1)), c.Rows(1).End(xlDown).Row, 1), c.Column), _
Cells(IIf(IsEmpty(c.Rows(c.Rows.Count)), c.Rows(c.Rows.Count).End(xlUp).Row, _
c.Rows.Count), c.Column)).Select
End Sub

Serge

"isabelle" a écrit dans le message de news: idu0pv$dq7$
et la tienne également, là v'la un peu condensé,

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

Avatar
michdenis
| ben voilà, j'crois pas qu'on peut faire mieux,

À partir d'Excel 2007, on pourrait utiliser 2 lignes de code :

'---------------------------------
Sub test()
If Application.CountA(ActiveCell.EntireRow) = 0 Then _
MsgBox "Aucune valeur dans cette colonne.": Exit Sub
Range(Cells(Evaluate("MIN(IF(NOT(ISBLANK(" & ActiveCell.EntireColumn.Address _
& ")),Row(" & ActiveCell.EntireColumn.Address & ")))"), ActiveCell.Column), _
Cells(Evaluate("max(IF(NOT(ISBLANK(" & ActiveCell.EntireColumn.Address & _
")),Row(" & ActiveCell.EntireColumn.Address & ")))"), ActiveCell.Column)).Select
End Sub
'---------------------------------

Sauf que je ne sais pas si cela répond à l'interrogation de Serge...

| Je veux pourtant faire quelque chose de tout simple

MichD
--------------------------------------------


"isabelle" a écrit dans le message de groupe de discussion : idu66v$so6$

ben voilà, j'crois pas qu'on peut faire mieux,
bon w.e. à toi également,
isabelle

Le 2010-12-10 15:42, Tatanka a écrit :
Bonne fin de semaine Isabelle et essaie de ne pas congeler si
tu mets le bout du nez dehors. Et pour rigoler :

Sub Tellement_Simple()
Dim c As Range
Set c = Columns(ActiveCell.Column)
If Application.CountA(c) = 0 Then MsgBox "Aucune valeur dans cette colonne.": Exit Sub
Range(Cells(IIf(IsEmpty(c.Rows(1)), c.Rows(1).End(xlDown).Row, 1), c.Column), _
Cells(IIf(IsEmpty(c.Rows(c.Rows.Count)), c.Rows(c.Rows.Count).End(xlUp).Row, _
c.Rows.Count), c.Column)).Select
End Sub

Serge

"isabelle" a écrit dans le message de news: idu0pv$dq7$
et la tienne également, là v'la un peu condensé,

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

Avatar
Daniel.C
OK, mais tu n'as pas tenu compte de ce qui a été dit après le ppost de
cette macro. Elle devient :

Sub Daniel()
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),
xlFormulas, , , xlNext)
Set Cellinf = col.Find("*", Cells(1, ActiveCell.Column),
xlFormulas, , , xlPrevious)
Range(Cellsup, Cellinf).Select
MsgBox Selection.Address, vbCritical, "Plage sélectionnée"
End Sub

voici le classeur :
http://cjoint.com/?0mlj9cKIML6
Daniel

http://www.cijoint.fr/cjlink.php?file=cj201012/cijPx1sNKa.xls

Les explications ont été données sur les autres messages de ce fil.


MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion :
idtt5u$4tg$

En tous cas, en reprenant ton exemple; ma macro, celle de Daniel
et la tienne sélectionnent la même plage :
http://www.cijoint.fr/cjlink.php?file=cj201012/cijaK91wkg.xls

Peux-tu me trouver un cas où les macros ne donneraient pas toutes
le même résultat ?

Serge



"michdenis" a écrit dans le message de news:
idts2m$2cd$
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
--------------------------------------------
Avatar
michdenis
Ok.

Ce qui est important de retenir :

La propriété LookIn de la méthode "Find" d'un objet "Range"
détermine si la chaîne de caractères spécifiés à chercher se
retrouve dans la propriété "VALUE" OU "FORMULA" appartenant
à un objet "Range".

Lorsque l'on utilise LookIn:=xlValues, la méthode "Find" utilise la
chaîne de caractères que retourne chaque cellule en utilisant la
propriété "Value" d'un objet. (Range("LaPlage").value)

Lorsque l'on utilise LookIn:=xlFormulas, la méthode "Find" utilise la
chaîne de caractères que retourne chaque cellule en utilisant la
propriété "Formula" d'un objet Range. (Range("LaPlage").Formula)


MichD
--------------------------------------------


"Daniel.C" a écrit dans le message de groupe de discussion : 4d033d0e$0$29704$

OK, mais tu n'as pas tenu compte de ce qui a été dit après le ppost de
cette macro. Elle devient :

Sub Daniel()
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),
xlFormulas, , , xlNext)
Set Cellinf = col.Find("*", Cells(1, ActiveCell.Column),
xlFormulas, , , xlPrevious)
Range(Cellsup, Cellinf).Select
MsgBox Selection.Address, vbCritical, "Plage sélectionnée"
End Sub

voici le classeur :
http://cjoint.com/?0mlj9cKIML6
Daniel

http://www.cijoint.fr/cjlink.php?file=cj201012/cijPx1sNKa.xls

Les explications ont été données sur les autres messages de ce fil.


MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion :
idtt5u$4tg$

En tous cas, en reprenant ton exemple; ma macro, celle de Daniel
et la tienne sélectionnent la même plage :
http://www.cijoint.fr/cjlink.php?file=cj201012/cijaK91wkg.xls

Peux-tu me trouver un cas où les macros ne donneraient pas toutes
le même résultat ?

Serge



"michdenis" a écrit dans le message de news:
idts2m$2cd$
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
--------------------------------------------
Avatar
Gloops
Tatanka a écrit, le 10/12/2010 03:59 :
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 to us 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






Bonjour,

Peut-être un autre chemin pour démarrer :

Set R = ActiveSheet.Range(Cells(1, C.Column), _
Cells(ActiveSheet.UsedRange.Rows.Count, C.Column))

Après il reste certes à éliminer les cellules vides.
Mais au moins a-t-on éliminé tout ce qui se trouve en dessous de la
plage utilisée sur la feuille.

Pour ce qui est des cellules vides, on peut imaginer plusieurs acceptions :
- les cellules vraiment vides (isempty(C))
- ainsi que les cellules contenant une cellule qui retourne null (isnull( C))
- ainsi que les cellules contenant une cellule qui retourne une chaîne
vide (C="")

Alors je m'en tiendrai à une fonction booléenne nommée vide qu'on
définira comme on voudra.

min = 1
While vide(Cells(min, C.Column)
min = min + 1
Wend

max = R.Rows.Count
While vide(Cells(max, C.Column)
max = max - 1
Wend

Set R = Range(Cells(min, C.Column), Cells(max, C.Column))

Quant à dire que c'est plus simple que ce qui était proposé au dé part,
sûrement faut-il vérifier ...
1 2 3 4