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 :

Combinaisons en VBA [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut Combinaisons en VBA
    Bonjour,

    Je cherche une solution depuis quelques semaines à ce problème. Je suis sûr qu'il y a un moyen simple de me faciliter la tâche, mais je n'y connais rien en VBA...

    J'ai une liste (en colonne) d'éléments que je voudrais combiner, en faisant apparaître le résultat sur deux colonnes. Par exemple, disons que les éléments sont:

    1
    2
    3
    4
    5

    Je voudrais obtenir les combinaisons de deux chiffres suivantes:

    1 2
    1 3
    1 4
    1 5
    2 3
    2 4
    2 5
    3 4
    3 5
    4 5

    Soit, pour chaque élément, une combinaison avec chacun des éléments situés en-dessous de lui. Évidemment dans cet exemple de 5 éléments, c'est simple, et je pourrais le faire "manuellement". Ça devient tout de suite beaucoup plus long et fastidieux quand il y a 200 ou 300 éléments dans la liste... Le copier-coller donne vite de l'arthrose...

    Merci pour toute aide,

    Grégoire

  2. #2
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Bonjour,

    En vba cela me parait assez simple ; je viens d'en écrire un très rapidement et est donc certainement très perfectible :

    Colonne A les chiffres

    Colonne B et C les combinaisons

    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
     
    Private Sub CommandButton1_Click()
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    i = 1
    k = 1
    While (ActiveSheet.Range("A" & i) <> "")
      j = i + 1
      While (ActiveSheet.Range("A" & j) <> "")
        ActiveSheet.Range("B" & k) = i
        ActiveSheet.Range("C" & k) = j
        j = j + 1
        k = k + 1
      Wend
      i = i + 1
    Wend
    End Sub
    Pour le faire fonctionner, il suffit de créer un bouton (affichage->barre d'outils->boite à outils controle sur excel 2003) puis de faire un clic droit sur le bouton "Viualiser le code" puis de copier le code ci-dessus dans VB

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    Salut P4board,

    Tout d'abord, merci pour ton temps et ta solution. Quand je l'exécute, le résultat présente correctement les combinaisons dans les colonnes B et C, mais je crois que j'ai mal présenté mon exemple, car les numéros de la colonne initiale ne se suivent pas nécessairement. Par exemple:

    (a1) 1
    (a2) 3
    (a3) 4
    (a4) 5
    (a5) 7

    devrait donner

    1 3
    1 4
    1 5
    1 7
    3 4
    3 5
    3 7
    4 5
    4 7
    5 7

    Hum, je suppose que ça complique un peu les choses...

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Qui dit beaucoup de valeur, dit temps de traitement, il est donc préférable d'utiliser un tableau et de bien garder en tête sur quel classeur et quelles feuilles on travaille. Si on ne défini pas ça dès le départ, si l'utilisateur change de document pendant le déroulement de la macro, ça peut vite devenir catastrophique.

    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
    Option Explicit
    Option Base 0
    Sub Combinaison()
    Dim Wb As Workbook
    Dim Ws_Source As Worksheet, Ws_Resultat As Worksheet
    Dim Tab_ValeurBase As Variant
    Dim Tab_Resultat() As Long
    Dim NombreCombi As Long
    Dim X As Long, Y As Long
    Dim CursPos As Long
     
    'Sur un traitement qui va prendre du temps,
    'il est preférable de garder la référence du document en cours
    Set Wb = ThisWorkbook
     
    'Les feuilles
    Set Ws_Source = Wb.Sheets("Feuil1") 'à adapter
    Set Ws_Resultat = Wb.Sheets("Feuil2") 'à adapter
     
    'On place les valeurs source dans une variable sous forme de tableau
    With Ws_Source
        Tab_ValeurBase = .Range("A2", .Cells(.Rows.Count, "A").End(xlUp))
    End With
     
    'On calcule le nombre de combinaison
    NombreCombi = UBound(Tab_ValeurBase) - 1
    NombreCombi = (NombreCombi * (NombreCombi + 1)) / 2
     
    'On dimenssionne le tableau qui va recevoir les solutions
    ReDim Tab_Resultat(0 To NombreCombi - 1, 0 To 1)
     
    'Ensuite on rempli
    For X = 0 To UBound(Tab_ValeurBase) - 1
        For Y = X + 1 To UBound(Tab_ValeurBase) - 1
            Tab_Resultat(CursPos, 0) = Tab_ValeurBase(X + 1, 1)
            Tab_Resultat(CursPos, 1) = Tab_ValeurBase(Y + 1, 1)
            CursPos = CursPos + 1
        Next
    Next
     
    'On place dans la feuil resultat
    Ws_Resultat.Cells.Clear
    Ws_Resultat.Range("A2").Resize(UBound(Tab_Resultat) + 1, UBound(Tab_Resultat, 2) + 1) = Tab_Resultat
     
    End Sub
    Il faut adapter les lignes qui définissent Ws_Source et Résultat en mettant le feuilles ou tu souhaites avoir le résultat. Si c'est sur la même feuille, pense à modifier cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ws_Resultat.Range("B2").Resize(UBound(Tab_Resultat) + 1, UBound(Tab_Resultat, 2) + 1) = Tab_Resultat
    A2 devient B2 et représente la cellule en haut à gauche du tableau de résultat

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Effectivement gregoireBA, j'ai été un peu vite dans mon écriture... 2 petites modifs et ç'est ok :

    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
     
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    i = 1
    k = 1
    While (ActiveSheet.Range("A" & i) <> "")
      j = i + 1
      While (ActiveSheet.Range("A" & j) <> "")
        ActiveSheet.Range("B" & k) = ActiveSheet.Range("A" & i)
        ActiveSheet.Range("C" & k) = ActiveSheet.Range("A" & j)
        j = j + 1
        k = k + 1
      Wend
      i = i + 1
    Wend
    Effectivement l'utilisation d'un tableau serait plus optimale... mais dans ce cas je ne suis pas sur du réel gain de temps.

  7. #7
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    [Edit]
    Boff, en effet dans le cas d'une 100ènes de valeur ça n'est pas si flagrant que ça... j'suis dessus...
    Mais à 200/ 300 valeurs on commence à mieux voir.
    Et d'ailleurs tu as un dépassement de capacité à cause de Integer
    [/Edit]
    Citation Envoyé par P4board Voir le message
    Effectivement l'utilisation d'un tableau serait plus optimale... mais dans ce cas je ne suis pas sur du réel gain de temps.
    Mets une 100ènes de valeurs, tu te rendras mieux compte.

    ensuite tu rajouteras

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    k = 1
    Application.screenupdating = False
    While (ActiveSheet.Range("A" & i) <> "")
    Tu sentiras déjà une net amélioration.

    Et par la suite si tu as beaucoup plus de valeurs, au lieu d'avoir le temps de prendre une douche, tu finiras tout juste ton café

    Et comme je l'explique dans mon message prècedent, imagine que durant le déroulement de ta macro, tu changes de classeur, a ton avis que va t il se passer?

    Bonne continuation

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 4
    Par défaut
    Tout simplement génial, merci à tous les deux. Et même en considérant le temps de calcul, c'est infiniment plus rapide que faire tout à la main! Vous venez de me sauver des heures de travail!

  9. #9
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Effectivement je m'incline

    Je voulais juste faire simple et compréhensible car il a dit qu'il n'y connaissait rien en vba...

    avec mon vieux bouzin d'il y a 11 ans :
    ma methode :
    10s pour 50 lignes
    35s pour 100 lignes
    1'20 pour 150 lignes

    Il ne faut donc pas aller trop loin...

    ta methode :
    2s pour 350 lignes

    Gloups !

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 27/11/2007, 14h40
  2. Combinaisons sans répétition avec VBA (suite)
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/08/2007, 19h03
  3. Combinaisons sans répétition avec VBA
    Par arnold95 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/08/2007, 16h23
  4. [VBA]performance de combinaison,tri et élimination doublons
    Par tangjuncn dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/03/2007, 23h52
  5. [VBA-E] Générer des combinaisons dans Excel
    Par JSOREL dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 07/03/2007, 17h23

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