IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Nombre de colonnes d'une selection [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut Nombre de colonnes d'une selection
    Bonjour,
    Je m'interroge sur la façon d'obtenir le nombre de colonnes d'une selection !

    Ca parait simple lorsque les cellules sont connexes mais dans le cas contraire le résultat est quelque peu étonnant!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub nbcolonnes()
    Dim MaSelection As Range
    Dim MaSelection2 As Range
     
    Set MaSelection = Union(Range("g9"), Range("i6"), Range("i13"), Range("k14"), Range("l7"))
    MaSelection.Interior.Color = 10498160
     
    MsgBox "Columns.count =" & MaSelection.Columns.Count _
    & vbCr & "Areas count = " & MaSelection.Areas.Count, , "Maselection : " & MaSelection.Address
    Debug.Print "Columns.count =" & MaSelection.Columns.Count _
    & " Areas count = " & MaSelection.Areas.Count & " Maselection : " & MaSelection.Address
     
    Set MaSelection2 = Range("$B$9:$C$10")
    MsgBox "Columns.count =" & MaSelection2.Columns.Count _
    & vbCr & "Areas count = " & MaSelection2.Areas.Count, , "Maselection2 : " & MaSelection2.Address
    Debug.Print "Columns.count =" & MaSelection2.Columns.Count _
    & " Areas count = " & MaSelection2.Areas.Count & " Maselection 2: " & MaSelection2.Address
     
     
    Set MaSelection2 = Union(Range("B9"), Range("C10"))
    MsgBox "Columns.count =" & MaSelection2.Columns.Count _
    & vbCr & "Areas count = " & MaSelection2.Areas.Count, , "Maselection2 : " & MaSelection2.Address
    Debug.Print "Columns.count =" & MaSelection2.Columns.Count _
    & " Areas count = " & MaSelection2.Areas.Count & " Maselection 2: " & MaSelection2.Address
     
    End Sub

    donne

    Columns.count =1 Areas count = 5 Maselection : $G$9,$I$6,$I$13,$K$14,$L$7 alors que j'ai 4 colonnes distinctes

    Columns.count =2 Areas count = 1 Maselection 2: $B$9:$C$10
    Columns.count =1 Areas count = 2 Maselection 2: $B$9,$C$10

    Quelqu'un a-t-il une méthode "globale" ?
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  2. #2
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Je me répond avec une fonction que je viens de créer mais si quelqu'un a une autre méthode ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function NbcolDistinctes(maselection As Range) As Integer
        Dim nbcol As Integer
        Dim MonDico_Ou As Object
        nbcol = 0
        Set MonDico_Ou = CreateObject("Scripting.Dictionary")
        MonDico_Ou.CompareMode = vbTextCompare
        For a = 1 To maselection.Areas.Count
            For Each Macol In maselection.Areas(a).Columns
                If Not MonDico_Ou.Exists(Macol.Column) Then MonDico_Ou.Add Macol.Column, Macol.Column
                nbcol = nbcol + maselection.Areas(a).Columns.Count
            Next Macol
        Next a
        NbcolDistinctes = MonDico_Ou.Count
    End Function
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  3. #3
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    J'étais parti sur un tableau...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set MaSelection = Union(Range("g9"), Range("i6"), Range("i13"), Range("k14"), Range("l7"))
    For Each c In MaSelection.Cells
    tablo(i) = c.Column
    i = i + 1
    Next c
    Il suffit de trouver le nombre d'élements distincts dans le tableau..

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une autre piste avec une fonction employant les Collections
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Sub nbColonnesLignes()
    Dim MaSelection As Range
    Dim MaSelection2 As Range
    '---
    Set MaSelection = Union(Range("g9"), Range("i6"), Range("i13"), Range("k14"), Range("l7"))
    MaSelection.Interior.Color = 10498160
    MsgBox "Columns.count =" & RangeColumsOrRowsCount(MaSelection, xlByColumns) & vbCrLf & _
          "Rows.count =" & RangeColumsOrRowsCount(MaSelection, xlByRows)
    '---
    Set MaSelection2 = Range("$B$9:$C$10,b13,e20")
    MaSelection2.Interior.Color = vbBlue
    MsgBox "Columns.count =" & RangeColumsOrRowsCount(MaSelection2, xlByColumns) & vbCrLf & _
          "Rows.count =" & RangeColumsOrRowsCount(MaSelection2, xlByRows)
    End Sub
     
    Function RangeColumsOrRowsCount(Plage As Range, Sens As XlSearchOrder) As Long
    Dim collRows As New Collection
    Dim collColumns As New Collection
    Dim C As Range
    Dim A$
    Dim B$
    '---
    On Error Resume Next
    Set Plage = Plage.Offset(1, 1)
    For Each C In Plage
      A$ = C.Address(False, False, xlR1C1, Range("a1"))
      '--- Lignes ---
      B$ = CStr(Mid(A$, 2, InStr(1, A$, "]") - 1))
      collRows.Add B$, B$
      '--- Colonnes ---
      B$ = CStr(Mid(A$, InStrRev(A$, "[")))
      collColumns.Add B$, B$
    Next C
    On Error GoTo 0
    '---
    If Sens = xlByColumns Then
      RangeColumsOrRowsCount = collColumns.Count
    ElseIf Sens = xlByRows Then
      RangeColumsOrRowsCount = collRows.Count
    End If
    End Function
    Je ne vois pas quel usage on peut en tirer ???
    Merci de m'éclairer sur ce point.

    Bonne journée et à plus.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Bonjours,
    1 petite copie de l'aide.
    Cordialement
    Ctac

    Référence du développeur Excel
    Range.Columns, propriété
    Cette propriété renvoie un objet Range qui représente les colonnes figurant dans la plage spécifiée.
    Syntaxe

    expression.Columns

    expression Variable qui représente un objet Range.

    Remarques


    L'utilisation de cette propriété sans qualificateur d'objet correspond à celle de ActiveSheet.Columns.

    Lorsqu'elle est appliquée à un objet Range constituant une sélection à zones multiples, cette propriété renvoie des colonnes uniquement à partir de la première zone de la plage. Par exemple, si l'objet Range possède deux zones — A1:B2 et C34 — Selection.Columns.Count renvoie la valeur 2, pas 4. Pour utiliser cette propriété sur une plage susceptible de contenir une sélection à zones multiples, essayez Areas.Count pour déterminer si la plage contient plusieurs zones. Si c'est le cas, effectuez une boucle sur chaque zone de la plage.


    Exemple


    Cet exemple montre comment affecter la valeur 0 (zéro) à chaque cellule de la colonne 1 dans la plage « myRange ».

    Visual Basic pour Applications
    Range("myRange").Columns(1).Value = 0

    Cet exemple montre comment afficher le nombre de colonnes dans la sélection de la feuille Sheet1. Si plusieurs zones sont sélectionnées, cet exemple montre comment faire une boucle sur chaque zone.

    Visual Basic pour Applications
    Worksheets("Sheet1").Activate
    areaCount = Selection.Areas.Count
    If areaCount <= 1 Then
    MsgBox "The selection contains " & _
    Selection.Columns.Count & " columns."
    Else
    For i = 1 To areaCount
    MsgBox "Area " & i & " of the selection contains " & _
    Selection.Areas(i).Columns.Count & " columns."
    Next i
    End If

  6. #6
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Salut à tous et merci pour vos contributions.

    Je n'avais pas pensé à regarder simplement dans l'aide !

    Ce qui me rassure c'est que c'est un comportement "normal"
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Je précise que l'exemple de l'aide compte les colonnes qu'occupe chaque cellule de la sélection.
    Cas 1 (cellules dans colonnes distinctes) :
    Sélection = A1,C1,E1 donnera 3 colonnes.
    Cas 2 (avec effet pernicieux) :
    Sélection = A1,C1,E1,A3 donnera 4 colonnes alors que la colonne A qui est compté 2 fois ne devrait l'être qu'une seule fois.
    ****
    La piste que je propose dans le message #4 indique le nombre de colonnes (ou de lignes) occupées soit, pour le Cas 2 (avec effet pernicieux), 3 colonnes.
    J'avais cru comprendre que c'était cela qui était demandé.

  8. #8
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut nombre de colonnes
    Bonjour Engue Engue.

    C'est précisément ce que fait le code Mercatog qu'au demeurant je n'ai toujours pas réussi à comprendre.

    Je vois bien au pas à pas ce que fait le code mais les lignes de ce code m'échappent encore.

    Cordialement,

  9. #9
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Euh... toutes nos méthodes essaient d'arriver au même point donc c'est normal que ce soit exactement la même chose. Sauf que la méthode n'est pas du tout la même. Mercatog joue sur les propriétes des ensembles. Union et intersection (ce qui est brillant) alors que moi j'ai rempli bêtement un tableau, évincé les doublons et compter le nombre d'éléments.

  10. #10
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Citation Envoyé par nibledispo Voir le message
    Je vois bien au pas à pas ce que fait le code mais les lignes de ce code m'échappent encore.
    Tu fais une projection (orthogonale) des plages sur la première ligne de la feuille. ça fait longtemps la géométrie . Tu obtiendras des cellules que tu vas compter en fin de compte.

    Je rejoins Eugene. Tous les chemins mènent à Rome du moment où la logique était cernée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter le nombre de colonne dans une table
    Par Coin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/12/2006, 16h03
  2. Compter le nombre de colonnes d'une table
    Par Lord_Jago dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/07/2006, 11h44
  3. Programmer le nombre de colonnes d'une table
    Par kurkaine dans le forum WinDev
    Réponses: 3
    Dernier message: 14/07/2006, 17h49
  4. Nombre de colonne d'une table
    Par tom79 dans le forum Requêtes
    Réponses: 10
    Dernier message: 30/06/2006, 11h36
  5. ajout de colonnes sur une selection
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/08/2004, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo