Recuperer les numeros de colonne en selection multiple

Résolu
Bonjour ,
j'ai fait une selection multiple de COLONNES NON CONTIGUE ( ex : colonne B + colonne D ) .
Objectif = recuperer le numero des colonnes dans ma selection .

je pensais naïvement faire du style :

for each C in selection
msgbox " numero : " & C.column
next C

mais .... il passe en revue toutes les cellules ( et donc toutes les lignes ... ) .

n'y aurait-il pas un moyen de faire <<For each Column in Selection >> ou qq chose du genre ??

merci d'avance .
J'ai été étonné de ne pas avoir trouvé dans le forum ...

eeam

9 réponses

  1. Modérateur
    Bonjour,

    Selection est un objet de type RANGE
    Il a donc une propriété Columns

    Tu peux donc faire :
    For Each C In Selection.Columns
     Debug.Print "Colonne :" & C.Column
    Next
    

    1
    1. aie ! ....
      je voulais adapter type de la recherche ( le "C" ) , alors qu'il suffisait d'adapter la zone de recherche (le "Selection") .
      voilà pourquoi je trouvais pas ... c'est super simple .
      dslé ... :-(

      merci jordane45 !
      eeam.
      0
      1. re bjr ...
        néanmoins : toujours sous les mêmes hypotheses , pourquoi ne peut on pas appeler directement le xieme element selectionné ??
        En effet, si je veux la 4ieme colonne seulement , je ne peut pas faire
          Debug.Print "4eme Colonne :" & Selection.Columns(4).Column

        pourquoi me donne t il la 4eme colonne apres la 1ere ? c'est la 4eme parmi les selectionnees que je devrait recupérer . non ?

        merci de vos eclaircissements ...
        eeam
        0
        1. Bonsoir eeam78,

          Lorsque tu fais une sélection multiple, celle-ci comporte donc
          à l'évidence plusieurs zones, dont le nombre est donné par
          Selection.Areas.Count ; voici un petit exercice :

          Sur ta feuille, fais cette sélection multiple :
          colonnes C:E, I:L, O:Q

          L'instruction : MsgBox Selection.Areas.Count
          affichera 3, car il y a 3 zones.

          Si par exemple tu veux modifier la largeur de la colonne K,
          qui est la 3ème colonne de ta 2ème zone :

          Selection.Areas(2).Columns(3).ColumnWidth = 50
          

          Si ton problème est réglé, merci d'aller en haut de page
          pour cliquer sur « Marquer comme résolu ».

          Cordialement.  😊
           
          0
          1. Bonjour Albkan , et merci de ta reponse .
            En effet cela me rapproche de la solution .
            Neanmoins, cela m'oblige a connaitre la zone de la colonne souhaitée.
            Alors que ce qui m'interesse ici c'est de selectionner la xième colonne .

            exemple : dans ton exemple de selection du dessus C:E, I:L, O:Q , la colonne K est la 6ieme de la selection.
            mais si je selectionne C:F , J:L , O:Q
            ton instruction ne me donnera pas la colonne K , alors que celle ci est encore en 6ieme position .

            mais peut-etre n'est ce pas possible ...
            merci en tt cas .
            eeam
            0
            1. Modérateur
              Tu peux essayer ça et me dire si ça te va ?
              
              Sub colTest()
              Dim ColSelect As Areas
              Dim nbCol As Long
              
              'Colonnes selectionnées
              Set ColSelect = Selection.Areas
              
              'Nombre de zone selectionnées (colonnes y compris celles contigues)
              nbCol = ColSelect.Count
              
              'Liste des colonnes selectionnées
              For Each C In ColSelect
               Debug.Print "Colonne :" & C.Column
              Next
              
              'On modifie la largeur d'une colonne en particulier (ici la deuxième de ma selection)
              ColSelect(2).ColumnWidth = 5
              
              End Sub
              
              0
              1. pas vraiment en fait ... :
                par exemple , la boucle FOR ne me liste pas les colonnes , mais liste la 1ere colonne de chaquie zone ; par exemple ds la seletion C:E, I:L, O:Q
                il donne "colonne 3 , colonne 9, colonne 15" .

                par ailleurs , chez moi, le ColSelect(2).ColumnWidth ne passe pas ..

                dslé.
                0
                1. Modérateur
                  Bon finalement je pense qu'en stockant dans un array c'est plus simple.
                  Voici un exemple complet.... dis moi ce que tu en penses.

                  Sub colTest()
                  Dim ColSelect As Areas
                  Dim nbCol As Long
                  Dim tblCol()
                  Dim x As Long
                  Dim numColonne As Long
                  Dim monChoix As Long
                  'Colonnes selectionnées
                  Set ColSelect = Selection.Areas
                  
                  'Nombre de zone selectionnées (colonnes y compris celles contigues)
                  nbCol = ColSelect.Count
                  
                  'On Alimente l'array avec la Liste des colonnes selectionnées
                  ReDim Preserve tblCol(0)
                  For Each A In ColSelect
                   If A.Columns.Count > 1 Then
                    For Each C In A.Columns
                     x = UBound(tblCol) + 1
                     ReDim Preserve tblCol(x)
                     tblCol(x - 1) = C.Column
                    Next
                   Else
                     x = UBound(tblCol) + 1
                     ReDim Preserve tblCol(x)
                     tblCol(x - 1) = A.Column
                   End If
                  Next
                  
                  'On affiche la liste des colonnes
                  For i = 0 To UBound(tblCol) - 1
                   numColonne = tblCol(i)
                   Debug.Print "Colonne N° " & numColonne & " => " & LettreColonne(numColonne)
                  Next
                  
                  'On cible une colonne en particulier (via son numero d'ordre )
                   monChoix = 3 'je cible la troisième colonne de ma liste
                   ActiveSheet.Columns(tblCol(monChoix - 1)).Interior.Color = 5
                  
                  End Sub
                  
                  Function LettreColonne(NumCol As Long) As String
                  Dim reste, quotient As Long
                  quotient = Int(NumCol / 26)
                  reste = NumCol Mod 26
                  If quotient = 0 And reste = 0 Then
                      Exit Function
                  End If
                  If quotient = 0 Then
                      LettreColonne = Chr(64 + reste)
                  Else
                      If reste = 0 Then
                          quotient = quotient - 1
                          If quotient = 0 Then
                              LettreColonne = Chr(64 + 26)
                          Else
                              LettreColonne = Chr(64 + quotient) & Chr(64 + 26)
                          End If
                      Else
                          LettreColonne = Chr(64 + quotient) & Chr(64 + reste)
                      End If
                  End If
                  End Function
                  
                  


                  Cordialement, 
                  Jordane                                                                 
                  0
                  1. Merci Jordane,
                    En effet, ca fonctionne .

                    Je m'en étais "tiré" en faisant simplement une boucle FOR en incrementant un compteur a chaque colonne et en testant si le compteur etait = à x .
                    Mais j'en conviens ce n'est pas très élégant comme programmation , et souhaitais une approche, sinon plus simple, en tout cas plus académique . ce qui est fait . merci encore .

                    eeam.
                    0