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
L1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)(1).Address
L2 = Cells(65536, ActiveCell.Column).End(xlUp).Address
Range(L1 & ":" & L2).Select
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" <i...@v.org> a écrit dans le message de news: idsb1n$km2$1...@speranza.aioe.org...
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:=Cells(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$1...@speranza.aioe.org...
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
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$1...@speranza.aioe.org...
Beau sujet de réflexion.
J'ai sauté trop vite aux conclusions ( pas la première fois ).
Bonne journée
Serge
"michdenis" <mich...@hotmail.com> a écrit dans le message de news: idtb6f$poe$1...@speranza.aioe.org...
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"<i...@v.org> a écrit dans le message de news: idsb1n$km2$1...@speranza.aioe.org...
>> salut Serge,
>>
>> L1 = Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23)(1).Address
>> L2 = Cells(65536, ActiveCell.Column).End(xlUp).Address
>> Range(L1& ":"& L2).Select
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$1...@speranza.aioe.org...
Que fais-tu si la colonne contient des formules ?
MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtcid$sqf$1...@speranza.aioe.org...
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$1...@speranza.aioe.org...
>
> une autre,
>
> x = Split(Columns(ActiveCell.Column).SpecialCells(xlCellTypeConstants, 23).Address, ",")
> L1 = x(0)
> L2 = x(UBound(x))
> Range(L1& ":"& L2).Select
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$1...@speranza.aioe.org...
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$426a...@news.free.fr...
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
http://cjoint.com/?0mktIKBMUn7
MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idtqui$vfv$1...@speranza.aioe.org...
Peux-tu me trouver un cas où les macros ne donneraient pas toutes
le même résultat ?
Serge
"michdenis" <mich...@hotmail.com> a écrit dans le message de news: idts2m$2cd$1...@speranza.aioe.org...
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$1...@speranza.aioe.org...
>
> à 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), " "),
MichD
--------------------------------------------
"isabelle" a écrit dans le message de groupe de discussion : idttaf$4ur$1...@speranza.aioe.org...
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
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$1...@speranza.aioe.org...
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
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" <i...@v.org> a écrit dans le message de news: idu0pv$dq7$1...@speranza.aioe.org...
À 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$1...@speranza.aioe.org...
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
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$426a...@news.free.fr...
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 ...