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

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #22906331
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

Tatanka
Le #22906371
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"
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

DanielCo
Le #22907401
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
michdenis
Le #22907501
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
Tatanka
Le #22908031
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
michdenis
Le #22908151
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
Tatanka
Le #22908121
Ave Denis,

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

Bonne journée
Serge

"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

DanielCo
Le #22908171
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
isabelle
Le #22908161
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"
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







DanielCo
Le #22908231
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" 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
Publicité
Poster une réponse
Anonyme