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

Re,

Une bonne manière de faire :

Code:
Sub Selectionner9(NameCol1$, NameCol2$, NameCol3$, NameCol4$, NameCol5$)
Dim col, deb As Range, i%, lig&, derlig&
col = Array(NameCol1, NameCol2, NameCol3, NameCol4, NameCol5)
Set deb = Range(col(0))(1) '1ère cellule
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, Range(col(i))) _
      .Find("*", , xlValues, , xlByRows, xlPrevious).Row
      '.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
    If lig > derlig Then derlig = lig
  Next
End With
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub
Bonne nuit.
 

job75

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

Re,

En fait on peut simplifier :

Code:
Sub Selectionner9(NameCol1$, NameCol2$, NameCol3$, NameCol4$, NameCol5$)
Dim col, deb As Range, i%, lig&, derlig&
col = Array(NameCol1, NameCol2, NameCol3, NameCol4, NameCol5)
Set deb = Range(col(0))(1) '1ère cellule
On Error Resume Next 'si une plage est vide
For i = 0 To UBound(col)
  lig = 0
  lig = Range(col(i)).Find("*", , xlValues, , xlByRows, xlPrevious).Row
  'lig = Range(col(i)).Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre
  If lig > derlig Then derlig = lig
Next
If derlig < deb.Row Then MsgBox "Aucune sélection possible...": Exit Sub
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub
A+
 
Dernière édition:

Magic_Doctor

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

Bonsoir,

Je reviens sur ce fil. Il se trouve, en effet, que je viens de me rendre compte que cette macro peut m'être à nouveau utile, mais que pour 2 colonnes.
Que cela ne tienne, j'ai essayé de modifier la macro de job en déclarant, dans le paramétrage, les 3 dernières variables comme optionnelles :
VB:
Sub SelectColonnes(NameCol1$, NameCol2$, Optional NameCol3$, Optional NameCol4$, Optional NameCol5$)
'Sélectionne un ensemble (ici) de 5 colonnes
'Attention ! Le début de toutes les colonnes doit se trouver sur la même ligne
'- NameCol1 à NameCol5 : nom des 5 colonnes nommées
'job75
Dim col, deb As Range, i%, lig&, derlig&
col = Array(NameCol1, NameCol2, NameCol3, NameCol4, NameCol5)
Set deb = Range(col(0))(1) '1ère cellule
On Error Resume Next 'si une plage est vide
For i = 0 To UBound(col)
  lig = 0
  lig = Range(col(i)).Find("*", , xlValues, , xlByRows, xlPrevious).Row
  'lig = Range(col(i)).Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
  If lig > derlig Then derlig = lig
Next
If derlig < deb.Row Then Exit Sub
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub
Et appeler la macro ainsi :
VB:
Call SelectColonnes("Import_Colonne1", "Import_Colonne2")
Évidemment, c'eut été trop beau. Lamentable échec.
Alors, j'ai pris le taureau par les cornes en rédigeant ceci :
VB:
Sub SelectColonnes(NameCol1$, NameCol2$)
'Sélectionne un ensemble (ici) de 2 colonnes
'Attention ! Le début de toutes les colonnes doit se trouver sur la même ligne
'- NameCol1 à NameCol2 : nom des 2 colonnes nommées
'job75
Dim col, deb As Range, i%, lig&, derlig&
col = Array(NameCol1, NameCol2)
Set deb = Range(col(0))(1) '1ère cellule
On Error Resume Next 'si une plage est vide
For i = 0 To UBound(col)
  lig = 0
  lig = Range(col(i)).Find("*", , xlValues, , xlByRows, xlPrevious).Row
  'lig = Range(col(i)).Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
  If lig > derlig Then derlig = lig
Next
If derlig < deb.Row Then Exit Sub
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub
Et là ça marche très bien. Mais, bien sûr, il faut écrire une autre macro…

Comment pourrait-on améliorer encore cette macro pour faire en sorte qu’au minimum on doive choisir 2 colonnes et qu’on puisse pouvoir élargir la sélection jusqu’à concurrence du nombre maximal de colonnes préalablement fixé dans le paramétrage de la macro ?

Merci pour toute réponse.

Buenas noches a todos.
 

job75

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

Bonjour Magic_Doctor,

Tu peux garder l'Array avec 5 éléments, modifie la macro comme suit :

Code:
Sub SelectColonnes(NameCol1, NameCol2, Optional NameCol3 = 0, Optional NameCol4 = 0, Optional NameCol5 = 0)
'-----
i = Application.Match("zzz", col) 'détermine le dernier paramètre utile
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub
Bonne journée.
 

job75

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

Re,

Tu peux aussi sortir de la boucle :

Code:
Sub SelectColonnes(NameCol1$, NameCol2$, Optional NameCol3$, Optional NameCol4$, Optional NameCol5$)
Dim col, deb As Range, i%, lig&, derlig&
col = Array(NameCol1, NameCol2, NameCol3, NameCol4, NameCol5)
Set deb = Range(col(0))(1) '1ère cellule
On Error Resume Next 'si une plage est vide
For i = 0 To UBound(col)
  If col(i) = "" Then Exit For '1er paramètre non défini
  lig = 0
  lig = Range(col(i)).Find("*", , xlValues, , xlByRows, xlPrevious).Row
  'lig = Range(col(i)).Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
 If lig > derlig Then derlig = lig
Next
If derlig < deb.Row Then Exit Sub
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub
A+
 

Magic_Doctor

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

Bonjour job, mutzik, le forum,

Pourquoi faire compliqué quand on peut faire simple ?
Ce que je veux, c'est sélectionner un ensemble de colonnes (en fait plages verticales de cellules contiguës) qui n'ont pas forcément la même taille.
J'ai pour habitude de toujours nommer des plages (singleton ou pas) qui apparaissent dans les macros. Ça minimise ainsi les emmerdes si on veut par la suite modifier la feuille.
Au minimum on doit avoir 2 colonnes. Mais je viens de me rendre compte que c'est très largement suffisant. Il suffit, en effet, de connaître les extrêmes du bloc de colonnes NOMMÉES.
Supposons que j'aie 36 colonnes nommées "Colonne1" à "Colonne36".
Si j'écris :
VB:
Call SelectColonnes("Colonne1", "Colonne2")
Le bloc "Colonne1" - "Colonne2" et toutes les colonnes (s'il y en a) les séparant sera sélectionné.
Idem si j'écris :
VB:
Call SelectColonnes("Colonne2", "Colonne4")
Le bloc "Colonne2" - "Colonne4" et toutes les colonnes (s'il y en a) les séparant sera sélectionné.
Et si j'écris :
VB:
Call SelectColonnes("Colonne1", "Colonne36")
Le bloc "Colonne1" - "Colonne36" et toutes les colonnes (s'il y en a) les séparant sera sélectionné.

Donc, je me rends compte qu'il est inutile de mentionner dans cette sélection les colonnes nommées intermédiaires.

Voilà donc la finalité de cette macro.

En conséquence, la macro suivante semble très largement suffisante :
VB:
Sub SelectColonnes(NameCol1$, NameCol2$)
'Sélectionne un ensemble de colonnes (plages verticales de cellules contiguës), avec les colonnes intermédiaires
'(s'il y en a) les séparant dont les extrêmes sont les plages nommées "NameCol1" & "NameCol2"
'Attention ! Le début de toutes les colonnes doit se trouver sur la même ligne
'- NameCol1 à NameCol2 : nom de 2 colonnes nommées
'job75
Dim col, deb As Range, i%, lig&, derlig&
col = Array(NameCol1, NameCol2)
Set deb = Range(col(0))(1) '1ère cellule
On Error Resume Next 'si une plage est vide
For i = 0 To UBound(col)
  lig = 0
  lig = Range(col(i)).Find("*", , xlValues, , xlByRows, xlPrevious).Row
  'lig = Range(col(i)).Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
  If lig > derlig Then derlig = lig
Next
If derlig < deb.Row Then Exit Sub
Range(deb, Cells(derlig, Range(col(i - 1)).Column)).Select
End Sub

Maintenant, pour répondre à mutzik, pourquoi cette macro ?
Résoudre (selon ma logique à moi ; un autre, très certainement, aurait trouvé un autre moyen) un problème sur lequel je me heurtais.
Je me suis toujours demandé à quoi pouvait donc bien servir le Sudoku. Je déteste ça : perte de temps, improductif, répétitif... Il me semble nettement plus enrichissant de se plonger dans les mémoires du Père Teilhard de Chardin ou dans une encyclopédie sur la cuisine ! Jusqu'au jour où un quidam m'expliqua que le Sudoku permettait de conserver la face au nord. Et ce fut pour moi une véritable révélation !

En tout cas, merci job pour ton aide. Ah ! Ah ! Parce que tout seul...

Bonne journée à tous.
 

job75

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

Re,

Tu n'y es pas du tout Magic_Doctor.

Depuis le post #12 mes macros n'étudient que les colonnes listées dans l'Array, un point c'est tout.

A+
 

job75

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

Re,

Si tu as une tripotée de colonnes nommées "Colonne1", Colonne2"... "Colonne36" :

Code:
Sub SelectColonnes(Nomcol$)
Dim mincol%, nom As Name, deb As Range, maxcol%, lig&, derlig&
mincol = Columns.Count
On Error Resume Next 'si une plage est vide
For Each nom In ThisWorkbook.Names
  If nom.Name Like Nomcol & "*" Then
    With Range(nom.Name)
      If .Column < mincol Then mincol = .Column: Set deb = .Cells(1)
      If .Column > maxcol Then maxcol = .Column
      lig = 0
      lig = .Find("*", , xlValues, , xlByRows, xlPrevious).Row
      'lig = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
      If lig > derlig Then derlig = lig
    End With
  End If
Next
If derlig < deb.Row Then Exit Sub
Range(deb, Cells(derlig, maxcol)).Select
End Sub
Et bien sûr on l'appelle par :

Code:
Call SelectColonnes("Colonne")
Bonne soirée à toi, bonne nuit aux européens.
 

job75

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

Bonjour Magic_Doctor, le forum,

Avec ceci je pense qu'on aura fait le tour du problème :

Code:
Sub SelectColonnes(Nomcol$)
Dim mincol%, minlig&, nom As Name, maxcol%, lig&, maxlig&
mincol = Columns.Count
minlig = Rows.Count
On Error Resume Next 'si une plage est vide
For Each nom In ThisWorkbook.Names
  If nom.Name Like Nomcol & "*" Then
    With Range(nom.Name)
      If .Column < mincol Then mincol = .Column
      If .Column > maxcol Then maxcol = .Column
      If .Row < minlig Then minlig = .Row
      lig = 0
      lig = .Find("*", , xlValues, , xlByRows, xlPrevious).Row
      'lig = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
      If lig > maxlig Then maxlig = lig
    End With
  End If
Next
Range(Cells(minlig, mincol), Cells(maxlig, maxcol)).Select
'If maxlig = 0 Then MsgBox "Aucune sélection possible..." 'facultatif
End Sub
La sélection englobe toutes les colonnes même si elles ne commencent pas sur la même ligne.

Bonne journée.
 
Dernière édition:

Magic_Doctor

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

Bonjour job,

Non, je ne snobe pas, mais j'essayais de comprendre mon erreur.
Il se trouve que les tests que j'avais essayés concernaient des colonnes qui TOUTES avaient la même taille. Effectivement, quand les tailles changent, ce n'est plus pareil, et si la plus longue n'est pas en dernière position, elle sera alors fatalement tronquée.
Je viens de découvrir ton dernier post. Bravo, c'est presque la fin. On n'a pas à s'embêter à écrire dans la macro les noms des colonnes concernées. Ça simplifie la vie !
Le dernier truc serait le suivant. Comme la sélection doit se faire pour un ensemble de 2 colonnes et toutes les colonnes intermédiaires qui s'y trouvent (éventuellement), ta dernière macro, presqiue parfaite, fait la sélection sur l'ensemble des colonnes du même nom. C'était l'idée de départ, mais, par la suite, je me suis rendu compte qu'en peaufinant la macro, en paramétrage on pourrait spécifier quel ensemble de colonnes nous intéresse. Par exemple :
Supposons qu'il y ait 6 colonnes ("Colonne1" à "Colonne6")
SelectColonnes2(Nomcol$) --> sélection de TOUTES les colonnes
SelectColonnes2(Nomcol$,2,4) --> sélection des colonnes "Colonne2" à "Colonne4"

Excuses pour le retard de réponse.

¡Feliz lunes a todos!
 

job75

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

Bonjour Magic_Doctor, le forum,

Si maintenant tu veux les colonnes de "Colonne2" à "Colonne6" paramètre la macro autrement :

Code:
Sub SelectColonnes(Nomcol$, deb&, fin&)
Dim mincol%, minlig&, nom As Name, n&, maxcol%, lig&, maxlig&
mincol = Columns.Count
minlig = Rows.Count
On Error Resume Next 'si une plage est vide
For Each nom In ThisWorkbook.Names
  n = Val(Replace(nom.Name, Nomcol, ""))
  If nom.Name Like Nomcol & "*" And n >= deb And n <= fin Then
    With Range(nom.Name)
      If .Column < mincol Then mincol = .Column
      If .Column > maxcol Then maxcol = .Column
      If .Row < minlig Then minlig = .Row
      lig = 0
      lig = .Find("*", , xlValues, , xlByRows, xlPrevious).Row
      'lig = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row 'autre possibilité
      If lig > maxlig Then maxlig = lig
    End With
  End If
Next
Range(Cells(minlig, mincol), Cells(maxlig, maxcol)).Select
'If maxlig = 0 Then MsgBox "Aucune sélection possible..." 'facultatif
End Sub
Et tu l'appelles par :

Code:
Call SelectColonnes("Colonne", 2, 6)
Edit : précision importante : les noms doivent être définis dans le classeur, pas dans la feuille.

Bonne journée.
 
Dernière édition:

Statistiques des forums

Discussions
312 216
Messages
2 086 351
Membres
103 195
dernier inscrit
martel.jg