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 :

concatener des ensembles de critères


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut concatener des ensembles de critères
    Bonjour à vous tous,


    JE sollicite votre aide aujourd'hui car je ne sais pas comment faire ce que j'ai besoin. J'ai une liste de critères dont le nombre est variable dans les colonnes et ainsi dans les lignes. Je voudrais par exemple dans la colonne A mettre pomme, orange, fraise et dans la colonne B mettre mur, pelé, fraiche et j'aurais quelque part une concatenation de toute les possibilités possibles (pomme mur, orange, mur, fraise mur, pomme pelé, orange pelé, fraise pelé et ainsi de suite.

    MOn premier problème c'est que le nombre de colonne ayant des critères (caractéristiques) peut varier et également au niveau du nombre de critères par catégorie. Je sais que j'Aspire à une macro nécessitant le moins de calcul ou d'intervention pour définir les critères par l'utilisateur. JE ne sais pas si il existe autrement qu'une fonction afin de définir le nombre d'élément étant donner que la cellule vide pourrais etre utiliser comme limite d'élément dans une feuille. Je pourrias utiliser une feuille gabarit avec des titres de colonnes afin de faciliter la manipulation.


    MOn second problème, la seul chose que je pense présentement est de concatener des boucles ayant des boucles, ce qui n'Est vraiment pas optimal. Je ne sais pas comment s'appel en terme de programmation et si il existe déjà quelquechose déjà pré-établi mais toute les recherche que j'ai faites prédécemment n'a pas porté fruit . Il se peut que l'utilisation de dictionnaire aiderais la rapidité mais je ne suis pas assez avancé pour l'utilisé.


    Si quelqu'un d'entre vous aurait des solutions ou des pistes de solutions, ce serais très appércié.


    merci d'avance

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 587
    Par défaut
    Bonjour

    Ce que tu décris correspond à un produit cartésien : j'utiliserais plutôt PowerQuery mais le nombre de combinatoires peut vide exploser dont il faudrait être moins vague...

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    MErci beaucoup !!!


    Je vais essayé de voir comment powerquery fonctionne !!!

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonjour
    sans doute je vais recevoir un pouce down pour cette réponse
    sans doute Powerquery est la meilleure solution mais je ne maîtrise pas cet outil malheureusement
    si non un dictionnaire :
    dans la mesure ou en colonne A et colonne B tes données, le résultat en C a partir de la ligne 2
    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
    Sub regroup()
    Application.ScreenUpdating = False
    Dim F1 As Worksheet
    Set F1 = Sheets("feuil1")
    Dim i As Long
    Set d = CreateObject("Scripting.Dictionary")
        TblBD = F1.Range("A2:A" & F1.Range("A" & Rows.Count).End(xlUp).Row)
        TblBD2 = F1.Range("B2:B" & F1.Range("B" & Rows.Count).End(xlUp).Row)
        For i = 1 To UBound(TblBD)
        For j = 1 To UBound(TblBD2)
        clé = TblBD(i, 1) & "-" & TblBD2(j, 1)
        d(clé) = TblBD(i, 1) & "-" & TblBD2(j, 1)
        Next j
        Next i
    F1.Range("C2").Resize(d.Count) = Application.Transpose(d.keys)
    Application.ScreenUpdating = True
    End Sub

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Pas de pouce en bas pour moi, cher ami BENNASR

    Ton commentaire est pertinent à mes yeux

    Moi non plus, je ne maitrise pas même que je connais pas powerquery. Je vais essayé de voir si je peux utilisé ton code en le combinant avec une input du nombre de critères.


    J'ai un autre vois si je ne trouve pas comment fonctionne powerquery ou si je ne trouve pas un collègue le connaissant

    merci pour ton commentaire

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    RE-Bonjour,

    EN se basant sur ce que notre ami BENNASR , j'arrive avec le code suivant

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    Option Explicit
     
    Sub regroup()
     
    Dim critere As Workbook
     
    Dim i As Long
    Dim j As Long
    Dim k As Long
    Dim l As Long
    Dim m As Long
    Dim n As Long
    Dim o As Long
    Dim p As Long
    Dim q As Long
    Dim r As Long
    Dim s As Long
    Dim t As Long
    Dim u As Long
    Dim v As Long
    Dim w As Long
    Dim x As Long
    Dim y As Long
    Dim z As Long
    Dim aa As Long
    Dim ab As Long
     
    Dim dico As Object
     
    Dim clé As String
     
    Dim TblBD1 As Variant
    Dim TblBD2 As Variant
    Dim TblBD3 As Variant
    Dim TblBD4 As Variant
    Dim TblBD5 As Variant
    Dim TblBD6 As Variant
    Dim TblBD7 As Variant
    Dim TblBD8 As Variant
    Dim TblBD9 As Variant
    Dim TblBD10 As Variant
    Dim TblBD11 As Variant
    Dim TblBD12 As Variant
    Dim TblBD13 As Variant
    Dim TblBD14 As Variant
    Dim TblBD15 As Variant
    Dim TblBD16 As Variant
    Dim TblBD17 As Variant
    Dim TblBD18 As Variant
    Dim TblBD19 As Variant
    Dim TblBD20 As Variant
     
    Set critere = ActiveWorkbook
     
     
    'Application.ScreenUpdating = False
     
     
    If sheetExists("Resultat") Then
        Application.DisplayAlerts = False
        critere.Worksheets("Resultat").Delete
        Application.DisplayAlerts = True
     
    End If
     
     
    Sheets.Add.Name = "Resultat"
     
    Set dico = CreateObject("Scripting.Dictionary")
     
    With critere.Worksheets("Travail")
     
        TblBD1 = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
        TblBD2 = .Range("B2:B" & .Range("B" & Rows.Count).End(xlUp).Row)
        TblBD3 = .Range("c2:C" & .Range("C" & Rows.Count).End(xlUp).Row)
        TblBD4 = .Range("d2:d" & .Range("d" & Rows.Count).End(xlUp).Row)
        TblBD5 = .Range("e2:e" & .Range("e" & Rows.Count).End(xlUp).Row)
        TblBD6 = .Range("f2:f" & .Range("f" & Rows.Count).End(xlUp).Row)
        TblBD7 = .Range("g2:g" & .Range("g" & Rows.Count).End(xlUp).Row)
        TblBD8 = .Range("h2:h" & .Range("h" & Rows.Count).End(xlUp).Row)
        TblBD9 = .Range("i2:i" & .Range("i" & Rows.Count).End(xlUp).Row)
        TblBD10 = .Range("j2:j" & .Range("j" & Rows.Count).End(xlUp).Row)
        TblBD11 = .Range("k2:k" & .Range("k" & Rows.Count).End(xlUp).Row)
        TblBD12 = .Range("l2:l" & .Range("l" & Rows.Count).End(xlUp).Row)
        TblBD13 = .Range("m2:m" & .Range("m" & Rows.Count).End(xlUp).Row)
        TblBD14 = .Range("n2:n" & .Range("n" & Rows.Count).End(xlUp).Row)
        TblBD15 = .Range("o2:o" & .Range("o" & Rows.Count).End(xlUp).Row)
        TblBD16 = .Range("p2:p" & .Range("p" & Rows.Count).End(xlUp).Row)
        TblBD17 = .Range("q2:q" & .Range("q" & Rows.Count).End(xlUp).Row)
        TblBD18 = .Range("r2:r" & .Range("r" & Rows.Count).End(xlUp).Row)
        TblBD19 = .Range("s2:s" & .Range("s" & Rows.Count).End(xlUp).Row)
        TblBD20 = .Range("t2:t" & .Range("t" & Rows.Count).End(xlUp).Row)
     
    End With
     
     
        Worksheets("Travail").Select
     
     
    If LastLignUsedInColumn("B") < 2 Then
        MsgBox "critère manquant"
        Exit Sub
    End If
     
     
    If LastLignUsedInColumn("C") < 2 And LastLignUsedInColumn("B") > 2 Then
     
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
     
                    clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1))))
                    dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1)
     
            Next j
        Next i
     
    End If
     
     
    If LastLignUsedInColumn("D") < 2 And LastLignUsedInColumn("C") > 2 Then
     
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
                For k = 1 To UBound(TblBD3)
     
                    clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1))))
                    dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1)
     
                Next k
            Next j
        Next i
     
    End If
     
     
     
    If LastLignUsedInColumn("E") < 2 And LastLignUsedInColumn("D") > 2 Then
     
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
                For k = 1 To UBound(TblBD3)
                    For l = 1 To UBound(TblBD4)
     
                    clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1))))
     
                    dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1)
     
                  Next l
                Next k
            Next j
        Next i
     
    End If
     
     
     
    If LastLignUsedInColumn("F") < 2 And LastLignUsedInColumn("e") > 2 Then
     
     
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
                For k = 1 To UBound(TblBD3)
                    For l = 1 To UBound(TblBD4)
                        For m = 1 To UBound(TblBD5)
     
                        clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1))))
     
                        dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1)
     
                        Next m
                    Next l
                Next k
            Next j
        Next i
     
    End If
     
     
    If LastLignUsedInColumn("G") < 2 And LastLignUsedInColumn("f") > 2 Then
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
                For k = 1 To UBound(TblBD3)
                    For l = 1 To UBound(TblBD4)
                        For m = 1 To UBound(TblBD5)
                            For n = 1 To UBound(TblBD6)
     
                            clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1) & " " & TblBD6(n, 1))))
     
                            dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1) & " " & TblBD6(n, 1)
     
                            Next n
                        Next m
                    Next l
                Next k
            Next j
        Next i
     
    End If
     
     
    If LastLignUsedInColumn("h") < 2 And LastLignUsedInColumn("g") > 2 Then
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
                For k = 1 To UBound(TblBD3)
                    For l = 1 To UBound(TblBD4)
                        For m = 1 To UBound(TblBD5)
                            For n = 1 To UBound(TblBD6)
                                For o = 1 To UBound(TblBD7)
     
                                 clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1) & " " & TblBD6(n, 1) _
                                       & " " & TblBD7(o, 1))))
     
                                 dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1) & " " & TblBD6(n, 1) _
                                       & " " & TblBD7(o, 1)
                                 Next o
                            Next n
                        Next m
                    Next l
                Next k
            Next j
        Next i
     
    End If
     
     
     
    If LastLignUsedInColumn("i") < 2 And LastLignUsedInColumn("h") > 2 Then
        For i = 1 To UBound(TblBD1)
            For j = 1 To UBound(TblBD2)
                For k = 1 To UBound(TblBD3)
                    For l = 1 To UBound(TblBD4)
                        For m = 1 To UBound(TblBD5)
                            For n = 1 To UBound(TblBD6)
                                For o = 1 To UBound(TblBD7)
                                    For p = 1 To UBound(TblBD8)
     
                                        clé = StripAccent(UCase(CleanTrim(TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1) & " " & TblBD6(n, 1) _
                                            & " " & TblBD7(o, 1) & " " & TblBD8(p, 1))))
     
                                        dico(clé) = TblBD1(i, 1) & " " & TblBD2(j, 1) & " " & TblBD3(k, 1) & " " & TblBD4(l, 1) & " " & TblBD5(m, 1) & " " & TblBD6(n, 1) _
                                            & " " & TblBD7(o, 1) & " " & TblBD8(p, 1)
     
                                      Next p
                                 Next o
                            Next n
                        Next m
                    Next l
                Next k
            Next j
        Next i
     
    End If
     
     
     
    Sheets("Resultat").Range("A1").Resize(dico.Count) = Application.Transpose(dico.keys)
     
    Worksheets("Resultat").Select
     
    Application.ScreenUpdating = True
     
     
    End Sub

    Le code marche super bien mais parfois j'arrive avec des #N/A comme possibilités malgré que le tout fonctionne si j'enlève d'autres critère. Je ne sais pas quel est la limite et je ne comprends pas oui plutôt, je n'Arrive pas a cibler quand la transposition donne certains #N/A
    Est-ce que vous auriez une piste afin de résoudre ce problème ... si il y a une limite, je devrais faire un message box lorsque j'atteins cette situation???

    merci mille fois

Discussions similaires

  1. [XL-2013] Concatener l'ensemble des valeurs d'une colonne
    Par maudrina dans le forum Excel
    Réponses: 9
    Dernier message: 22/04/2016, 17h57
  2. [VB.NET] Concaténer des images
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 5
    Dernier message: 26/11/2004, 17h57
  3. concatenation des données d'une table dans une autre
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/10/2004, 12h38
  4. Grouper et concatener des résultats
    Par Koo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/07/2004, 11h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 23h07

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