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
isabelle
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
Tatanka
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
DanielCo
Bonjour.
Peut-être :
Sub test()
Set CellSup = ActiveCell.EntireColumn.Find("*", Cells(Rows.Count,
ActiveCell.Column), , , , xlNext)
Set CellInf = ActiveCell.EntireColumn.Find("*", Cells(1,
ActiveCell.Column), , , , xlPrevious)
Range(CellSup, CellInf).Select
End Sub
Cordialement.
Daniel


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
Avatar
michdenis
Bonjour,

Pour tous les cas de figure, je te propose ceci :

'-----------------------------------
Sub Sélection_dans_Colonne()
Dim LastLine As Long, FirstLine As Long
On Error Resume Next
With ActiveCell
With .EntireColumn
LastLine = .Cells.Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
FirstLine = .Cells.Find(What:="*", _
After:Îlls(LastLine, .Column), _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext).Row
End With
Range(Cells(FirstLine, .Column), Cells(LastLine, .Column)).Select
End With
If Err <> 0 Then
Err = 0
MsgBox "la colonne est entirement vide"
End If
End Sub
'-----------------------------------



MichD
--------------------------------------------
"Tatanka" a écrit dans le message de groupe de discussion : ids510$7kj$

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
Avatar
Tatanka
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
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
Tatanka
Ave Denis,

Beau sujet de réflexion.
J'ai sauté trop vite aux conclusions ( pas la première fois ).

Bonne journée
Serge

"michdenis" a écrit dans le message de news: idtb6f$poe$
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
DanielCo
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
isabelle
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
DanielCo
Bonjour Isabelle.
Sauf que si la première ou la dernière cellule contient une formule,
elle n'est pas prise en compte.
Cordialement.
Daniel


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
1 2 3 4