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 :

boucle combinatoire à réduire


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut Simplification de code
    Bonjour à tous,

    Je ne sais pas comment simplifier cette petite macro, alors je suis obligé de tester par lot de variables. Si quelqu'un avait une solution !!!

    Merci par avance

    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
    Option Explicit
     
    Sub SolutionCombinatoire()
    Dim strFormuleA As String
    Dim a As Long, b As Long, c As Long, d As Long, e As Long, f As Long, g As Long, h As Long, i As Long
    Application.ScreenUpdating = False
     
    Range("X2:Z1000").ClearContents
     
    'avec 2 variables '''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -4
            For b = a + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
            Next
        Next
     
    'avec 3 variables'''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -5
            For b = a + 1 To -4
                For c = b + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                Next
            Next
        Next
     
    'avec 4 variables'''''''''''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -6
            For b = a + 1 To -5
                For c = b + 1 To -4
                    For d = c + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                    Next
                Next
            Next
        Next
     
    'avec 5 variables'''''''''''''''''''''''''''''''''''''''''''''''''
     
        For a = -12 To -7
            For b = a + 1 To -6
                For c = b + 1 To -5
                    For d = c + 1 To -4
                        For e = d + 1 To -3
     
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]+RC[" & e & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                        Next
                    Next
                Next
            Next
        Next
     
    'avec 6 variables'''''''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -8
            For b = a + 1 To -7
                For c = b + 1 To -6
                    For d = c + 1 To -5
                        For e = d + 1 To -4
                            For f = e + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]+RC[" & e & "]+RC[" & f & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                            Next
                        Next
                    Next
                Next
            Next
        Next
     
    'avec 7 variables'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -9
            For b = a + 1 To -8
                For c = b + 1 To -7
                    For d = c + 1 To -6
                        For e = d + 1 To -5
                            For f = e + 1 To -4
                                For g = f + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]+RC[" & e & "]+RC[" & f & "]+RC[" & g & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
                                Next
                            Next
                        Next
                    Next
                Next
            Next
        Next
     
    ActiveWorkbook.Save
    Application.ScreenUpdating = True
     
    End Sub

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 184
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Plutôt que nous obliger à lire un code indigeste, ne serait-il pas plus simple de nous expliquer en quelques mots, phrases ce que tu essaies de faire.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut boucle combinatoire à réduire
    Bonjour a tous,

    Je cherche une solution pour réduire ma petite macro si cela est possible.
    Si quelqu'un pouvait me donner une piste.

    Merci par avance

    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
    Option Explicit
     
    Sub Combinatoire()
    Dim strFormuleA As String
    Dim a As Long, b As Long, c As Long, d As Long, e As Long, f As Long, g As Long, h As Long, i As Long
    Application.ScreenUpdating = False
     
    Range("X2:Z1000").ClearContents
     
    'avec 2 variables '''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -4
            For b = a + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
            Next
        Next
     
    'avec 3 variables'''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -5
            For b = a + 1 To -4
                For c = b + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                Next
            Next
        Next
     
    'avec 4 variables'''''''''''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -6
            For b = a + 1 To -5
                For c = b + 1 To -4
                    For d = c + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                    Next
                Next
            Next
        Next
     
    'avec 5 variables'''''''''''''''''''''''''''''''''''''''''''''''''
     
        For a = -12 To -7
            For b = a + 1 To -6
                For c = b + 1 To -5
                    For d = c + 1 To -4
                        For e = d + 1 To -3
     
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]+RC[" & e & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                        Next
                    Next
                Next
            Next
        Next
     
    'avec 6 variables'''''''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -8
            For b = a + 1 To -7
                For c = b + 1 To -6
                    For d = c + 1 To -5
                        For e = d + 1 To -4
                            For f = e + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]+RC[" & e & "]+RC[" & f & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
     
                            Next
                        Next
                    Next
                Next
            Next
        Next
     
    'avec 7 variables'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        For a = -12 To -9
            For b = a + 1 To -8
                For c = b + 1 To -7
                    For d = c + 1 To -6
                        For e = d + 1 To -5
                            For f = e + 1 To -4
                                For g = f + 1 To -3
     
        strFormuleA = "=RC[" & a & "]+RC[" & b & "]+RC[" & c & "]+RC[" & d & "]+RC[" & e & "]+RC[" & f & "]+RC[" & g & "]"
        Range("M2:M1401").FormulaR1C1 = strFormuleA
     
    Range("X1000").End(xlUp)(2).Resize(1, 3).Value = Range("X1:Z1").Value
     
                                Next
                            Next
                        Next
                    Next
                Next
            Next
        Next
     
    ActiveWorkbook.Save
    Application.ScreenUpdating = True
     
    End Sub

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Au lieu de nous donner 100 lignes (de macro) à déchiffrer, si tu nous disais ce que tu veux faire ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 75
    Par défaut
    Bonsoir et merci de me consacrer un peu de votre temps.

    Je dois explorer toutes les combinaisons possibles en fonction du nombre de variables (ça c'est OK).
    Je ne connais pas l'instruction ou la formule qui me permettrait d'éviter d'incrémenter une par une toutes les variables, c'est pourquoi je suis obligé de décomposer de 2 à 7 variables
    Pour imager mes propos prenons pour exemple A en colonne A jusque H en colonne H
    A partir de ' avec 2 variables '''''''''''''', je teste 2 par 2 toutes les combinaisons possibles de A à H (AB, AC, .....GH)
    A partir de ' avec 3 variables ''''''''''''''', je teste 3 par 3 toutes les combinaisons possibles (ABC, ABD,...FGH)
    Ce que je cherche a faire c'est d'avoir une seule et même formule qui intègre le passage de toutes les combinaisons possibles de 2 à 7 variables

    j'espère avoir été clair

    Merci par avance

  6. #6
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir,
    comme je ne comprends pas la finalité, si je prends en brut tes explications,
    essayes déjà ce début de code pour les premières phases, tu devrais pouvoir adapter à tes besoins, j'ai laissé volontairement les variables inutilisées
    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
    Option Explicit
    Option Base 1
    Sub Totaux_Indicateur()
    Dim combi, nb_var As Integer, choix As String
    Dim a As Integer, b As Integer, c As Integer, d As Integer, e As Integer, f As Integer, g As Integer
    Dim x As Long, base
     
    base = Array("A", "B", "C", "D", "E", "F", "G", "H")
    choix = InputBox("Combien de variables ?", , 2)
    Set combi = CreateObject("Scripting.Dictionary")
    If choix = 2 Then
      For a = 1 To 8
        For b = 1 To 8 ' si on commence par "AA",sinon For b = 2
          If Not combi.exists(base(a)) Then
            combi.Add base(a) & base(b), CStr(base(a) & base(b))
            'ici le code pour metre la cmbinaison ou tu veux
          End If
        Next b
      Next a
      MsgBox "pour " & choix & " variables, vous avez" & _
          Chr(10) & "                " & combi.Count & Chr(10) & "   combinaisons possibles"
    End If
    If choix = 3 Then
      x = x + 1
      For a = 1 To 8
        For b = 1 To 8
          For c = 1 To 8
            If Not combi.exists(base(a)) Then
              combi.Add base(a) & base(b) & base(c), CStr(base(a) & base(b) & base(c))
        'ici le code pour metre la cmbinaison ou tu veux
            End If
          Next c
        Next b
      Next a
      MsgBox "pour " & choix & " variables, vous avez" & _
          Chr(10) & "                " & combi.Count & Chr(10) & "   combinaisons possibles"
    End If
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

Discussions similaires

  1. [XL-2010] Réduire temps d’exécution d'un boucle
    Par Mrfreeze117 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/01/2015, 14h28
  2. Réduire le traitement de ma boucle :(
    Par Odissine dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 02/03/2011, 17h10
  3. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 13h45
  4. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 21h06
  5. Réponses: 2
    Dernier message: 29/05/2002, 21h43

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