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

10 réponses

1 2 3 4
Avatar
michdenis
Avatar
Tatanka
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
isabelle
j'ai un message pour "xlCellTypeConstants" comme quoi la sélection est trop grande,
c'est mon pc qui n'est pas assez puissant ?

isabelle


Le 2010-12-10 13:36, michdenis a écrit :
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
DanielCo
Ca passe pour moi, mais ça prend 5 mn (colonne compplètement remplie).
Daniel
Avatar
DanielCo
... et ça plante Excel, maintenant.
Daniel


Ca passe pour moi, mais ça prend 5 mn (colonne compplètement remplie).
Daniel
Avatar
michdenis
Non, la méthode que tu utilises a une limite...et je crois qu'elle est
surtout basée sur le nombre de plages discontinues qu'il y a dans la
plage...Mais je ne connais pas cette limite de façon opérationnelle
si ce n'est qu'il faut s'en méfier sur des plages plus étendues !



MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idttaf$4ur$

j'ai un message pour "xlCellTypeConstants" comme quoi la sélection est trop grande,
c'est mon pc qui n'est pas assez puissant ?

isabelle


Le 2010-12-10 13:36, michdenis a écrit :
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
Tatanka
Finalement, après simplifications, ma macro n'est pas si tordue que ça :

Sub Serge()
Dim L1&, L2&, NL&
Dim c As Range
Set c = Columns(ActiveCell.Column)
If Application.CountA(c) = 0 Then
MsgBox "Aucune valeur dans cette colonne."
Exit Sub
End If
NL = c.Rows.Count
col = ActiveCell.Column
L1 = IIf(IsEmpty(c.Rows(1)), c.Rows(1).End(xlDown).Row, 1)
L2 = IIf(IsEmpty(c.Rows(NL)), c.Rows(NL).End(xlUp).Row, NL)
Range(Cells(L1, col), Cells(L2, col)).Select
MsgBox Selection.Address, vbCritical, "Plage sélectionnée"
End Sub

et semble donner les mêmes résultats que celle-ci :

Sub Daniel_Avec_Ajout()
Dim col As Range, Cellsup As Range, Cellinf As Range
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
MsgBox Selection.Address, vbCritical, "Plage sélectionnée"
End Sub

Mais là je m'inquiète :-) Denis va peut-être trouver un cas ou ces macros
ne remplissent pas leur mission !

Serge
Avatar
michdenis
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
isabelle
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

isabelle

Le 2010-12-10 08:38, Tatanka a écrit :
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
Tatanka
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

isabelle

Le 2010-12-10 08:38, Tatanka a écrit :
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


1 2 3 4