Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

Dans une feuille j'ai plusieurs colonnes.
Ces colonnes peuvent individuellement avoir des tailles variables, autrement dit elles n'ont pas forcément toutes la même hauteur.
Je voudrais "tout simplement" sélectionner automatiquement (via macro) l'ensemble de ces colonnes.
La seule chose dont je sois sûr, c'est la localisation de la 1ère cellule de la 1ère colonne.
Évidemment... les colonnes sont stables ; entendez par là qu'elles sont toujours au même endroit.
J'ai pensé à un truc tordu et longuet (vous savez... la fatigue due au poids des latitudes... C'est lourd tout ça !), mais existerait-il une solution simple à ce problème ?

Merci pour toute proposition.

Très bonne soirée à tous.
 

job75

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonsoir Magic_Doctor,

Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Quelle cellule ? La dernière de la colonne ?

Je voudrais "tout simplement" sélectionner automatiquement (via macro) l'ensemble de ces colonnes.

Quel est le rapport entre le titre et cette question ?

Merci de poser le problème plus clairement.

A+
 

job75

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Re,

Pour ceci :

Je voudrais "tout simplement" sélectionner automatiquement (via macro) l'ensemble de ces colonnes.

ces 2 macros ne font pas la même chose :

Code:
Sub Selectionner1()
Dim c As Range, r As Range
For Each c In ActiveSheet.UsedRange
If c.Text <> "" Then Set r = Union(IIf(r Is Nothing, c, r), c)
Next
If Not r Is Nothing Then r.Select
End Sub

Sub Selectionner2()
Dim c As Range, r As Range
For Each c In ActiveSheet.UsedRange
If Not IsEmpty(c) Then Set r = Union(IIf(r Is Nothing, c, r), c)
Next
If Not r Is Nothing Then r.Select
End Sub
A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonsoir job,

Le rapport entre le titre et la question :
Titre : "Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes"
Question : "Je voudrais "tout simplement" sélectionner automatiquement (via macro) l'ensemble de ces colonnes"

L'idée que j'avais en tête :
- on connaît l'adresse de la 1ère cellule de la 1ère colonne
- on sait quel est le nombre de colonnes dans la feuille
- connaissant l'adresse de la dernière cellule de la colonne la plus longue

On peut alors déterminer l'adresse de la plage qui va de la 1ère cellule de la 1ère colonne jusqu'à la dernière cellule de la colonne la plus longue "translatée" vers la dernière colonne au cas où cette dernière ne soit pas la plus longue.

J'ai essayé tes 2 macros.
- Selectionner1 : sélectionne individuellement (ou séparément) toutes les colonnes, mais aussi leurs en-têtes et des trucs à côté, mais ne sélectionne pas les cellules vides
- Selectionner2 : idem, mais avec sélection des cellules vides (ou avec "0").

En fait, ce que je voudrais, c'est sélectionner en BLOC toutes les colonnes présentes (ici 5), hors en-têtes.

Le mieux serait de voir sur la PJ.

Bonne soirée
 

Pièces jointes

  • Sélection colonnes.xlsm
    41.1 KB · Affichages: 57
  • Sélection colonnes.xlsm
    41.1 KB · Affichages: 59

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonsoir Magic_Doctor, job75,

Un essai dans le fichier joint. Il y a sans doute plus simple mais j'étais parti sur la recherche des cellules correspondant à la cellule la plus basse. Avec l'exemple fourni, j'ai modifié ma procédure initiale pour l'adapter à l'exemple.
 

Pièces jointes

  • Magic_Doctor-Sélection colonnes v1.xlsm
    37.2 KB · Affichages: 49

ROGER2327

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonsoir à tous.


Supprimé, je m'ai trompé.


Bonne nuit.


ℝOGER2327
#8020


Lundi 16 Phalle 142 (Nativité de St Vibescu, pohète et Commémoration de Ste Cuculine d’Ancône - fête Suprême Quarte)
9 Fructidor An CCXXIII, 9,8934h - réglisse
2015-W35-3T23:44:39Z
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonjour à tous.


Code:
Sub toto()
Dim C, L&, NbCol&, T&, Col As Range

'================================================================
'À adapter ou à passer en paramètres :
C = 2 'ou C = "B"
NbCol = 9
L = 5
'================================================================

  With Columns(C).Resize(Rows.Count - L + 1, NbCol).Offset(L - 1)
    For Each Col In .Columns
      T = Col.Cells(Col.Rows.Count).End(xlUp).Row
      If T > L Then L = T
    Next
    Intersect(.Cells, Rows.Resize(L)).Select
  End With
  
End Sub


Bonne journée.


ℝOGER2327
#8021


Mardi 17 Phalle 142 (Sainte Gallinacée, cocotte - fête Suprême Quarte)
10 Fructidor An CCXXIII, 0,2604h - échelle
2015-W35-4T00:37:30Z
 

Pièces jointes

  • Copie de Sélection colonnes.xlsm
    38 KB · Affichages: 41
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Suite...


Ou, peut-être :
Code:
Sub toto()
Dim C, L&, NbCol&, T&, HG$, Col As Range

'==================================================================
'À adapter ou à passer en paramètres :
HG = "B5"
'==================================================================

  C = Range(HG).Column: L = Range(HG).Row
  NbCol = Cells(L - 1, Columns.Count).End(xlToLeft).Column - C + 1
  If NbCol < 1 Then NbCol = 1

  With Columns(C).Resize(Rows.Count - L + 1, NbCol).Offset(L - 1)
    For Each Col In .Columns
      T = Col.Cells(Col.Rows.Count).End(xlUp).Row
      If T > L Then L = T
    Next
    Intersect(.Cells, Rows.Resize(L)).Select
  End With
  
End Sub
ℝOGER2327
#8022


Mardi 17 Phalle 142 (Sainte Gallinacée, cocotte - fête Suprême Quarte)
10 Fructidor An CCXXIII, 0,4479h - échelle
2015-W35-4T01:04:30Z
 

job75

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonjour Magic_Doctor, mapomme, Roger, Marc, le forum,

2 autres solutions :

Code:
Sub Selectionner3()
Dim deb As Range, derlig&, dercol%
Set deb = [B5] '1ère cellule à adapter
On Error Resume Next 'si la plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  derlig = .Find("*", , xlValues, , xlByRows, xlPrevious).Row
  dercol = .Find("*", , , , xlByColumns, xlPrevious).Column
  Range(deb, Cells(derlig, dercol)).Select
  MsgBox Selection.Address 'pour tester
End With
End Sub

Sub Selectionner4()
Dim deb As Range, derlig&, dercol%
Set deb = [B5] '1ère cellule à adapter
On Error Resume Next 'si la plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  derlig = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
  dercol = .Find("*", , , , xlByColumns, xlPrevious).Column
  Range(deb, Cells(derlig, dercol)).Select
  MsgBox Selection.Address 'pour tester
End With
End Sub
Bonne journée.
 

job75

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Re,

Si en plus on se donne le nombre maximum de colonnes remplies à étudier (5) :

Code:
Sub Selectionner5()
Dim deb As Range, ncol%, c As Range, lig&, derlig&, dercol%, n%
Set deb = [B5] '1ère cellule à adapter
ncol = 5 'nombre maximum de colonnes remplies à étudier
On Error Resume Next 'si la plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  For Each c In Intersect(.Cells, ActiveSheet.UsedRange).Columns
    lig = 0
    lig = c.Find("*", , xlValues, , xlByRows, xlPrevious).Row
    If lig Then
      If lig > derlig Then derlig = lig
      dercol = c.Column
      n = n + 1
      If n = ncol Then Exit For
    End If
  Next
End With
Range(deb, Cells(derlig, dercol)).Select
MsgBox Selection.Address 'pour tester
End Sub

Sub Selectionner6()
Dim deb As Range, ncol%, c As Range, lig&, derlig&, dercol%, n%
Set deb = [B5] '1ère cellule à adapter
ncol = 5 'nombre maximum de colonnes remplies à étudier
On Error Resume Next 'si la plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  For Each c In Intersect(.Cells, ActiveSheet.UsedRange).Columns
    lig = 0
    lig = c.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    If lig Then
      If lig > derlig Then derlig = lig
      dercol = c.Column
      n = n + 1
      If n = ncol Then Exit For
    End If
  Next
End With
Range(deb, Cells(derlig, dercol)).Select
MsgBox Selection.Address 'pour tester
End Sub
Avec la 1ère macro, si l'on pose ncol = 3 on verra que la colonne F (qui contient des 0 masqués) n'est pas comptabilisée, car xlValues dans Find recherche les valeurs affichées.

A+
 

job75

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Re,

Encore 2 variantes où l'on se donne les colonnes à étudier :

Code:
Sub Selectionner7()
Dim col, ligdeb&, deb As Range, i%, lig&, derlig&
col = Array("B", "D", "F", "H", "J") 'colonnes à étudier, à adapter
ligdeb = 5 '1ère ligne, à adapter
Set deb = Cells(ligdeb, col(0))
On Error Resume Next 'si une plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  For i = 0 To UBound(col)
    lig = 0
    lig = Intersect(.Cells, Columns(col(i))) _
      .Find("*", , xlValues, , xlByRows, xlPrevious).Row
    If lig > derlig Then derlig = lig
  Next
End With
Range(deb, Cells(derlig, col(i - 1))).Select
MsgBox Selection.Address 'pour tester
End Sub

Sub Selectionner8()
Dim col, ligdeb&, deb As Range, i%, lig&, derlig&
col = Array("B", "D", "F", "H", "J") 'colonnes à étudier, à adapter
ligdeb = 5 '1ère ligne, à adapter
Set deb = Cells(ligdeb, col(0))
On Error Resume Next 'si une plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  For i = 0 To UBound(col)
    lig = 0
    lig = Intersect(.Cells, Columns(col(i))) _
      .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
    If lig > derlig Then derlig = lig
  Next
End With
Range(deb, Cells(derlig, col(i - 1))).Select
MsgBox Selection.Address 'pour tester
End Sub
C'est sans doute une solution de ce genre que tu cherchais, non ?

A+
 

Magic_Doctor

XLDnaute Barbatruc
Re : Localiser la cellule de la colonne la plus longue d'un ensemble de colonnes

Bonjour mapomme, Roger, tototiti, job,
Bref, tous ceux qui ont participé à ce fil.

En tout cas merci à tous pour votre dynamisme.

2 solutions m'ont particulièrement intéressé :
celle de Roger (post #8) et celle de job (post #12).

Pour des raisons, disons, pratiques, j'ai décidé de paramétrer ces 2 macros.
Dans ma "philosophie" des plages nommées (celles qui apparaissent dans les macros), la solution de job me semble peut-être plus pratique. Je n'ai, en effet, pas à connaître le nombre de colonnes entre la 1ère et la dernière (celles-ci étant incluses), je n'ai qu'à rentrer en paramétrage les noms des colonnes concernées et c'est tout. En théorie, car dans la pratique j'ai un problème avec la macro de job :

VB:
Sub Selectionner7(NameCol1 As String, NameCol2 As String, NameCol3 As String, NameCol4 As String, NameCol5 As String)
'Sélectionne un ensemble de 5 colonnes nommées (ici, car il pourrait y en avoir davantage)
' - NameCol1 à NameCol5 : nom des 5 colonnes nommées
'job75
Dim x As Byte, colonne(5) As String, col, ligdeb&, deb As Range, i%, lig&, derlig&

For x = 1 To 5 'on récupère la lettre correspondant à la colonne de chaque plage (1 seule plage par colonne)
  colonne(x) = Split(Range("NameCol" & x).Address, "$")(1) 'pb ici
Next

'col = Array("B", "D", "F", "H", "J") 'colonnes à étudier, à adapter
col = Array(colonne(1), colonne(2), colonne(3), colonne(4), colonne(5))
'ligdeb = 5 '1ère ligne, à adapter
ligdeb = Range(NameCol1).Address '1ère ligne
Set deb = Cells(ligdeb, col(0))
On Error Resume Next 'si une plage est vide
With deb.Resize(Rows.Count - deb.Row + 1, Columns.Count - deb.Column + 1)
  For i = 0 To UBound(col)
    lig = 0
    lig = Intersect(.Cells, Columns(col(i))) _
      .Find("*", , xlValues, , xlByRows, xlPrevious).Row
    If lig > derlig Then derlig = lig
  Next
End With
Range(deb, Cells(derlig, col(i - 1))).Select
'MsgBox Selection.Address 'pour tester
End Sub

Merci d'avance pour m'expliquer où je me suis planté.

Bonne soirée à tous.
 
Dernière édition:

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390