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 Combinaison VBA


Sujet :

Macros et VBA Excel

  1. #21
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Oui le code de mayekeul est sympa, il genere bien les toutes les combinaisons et avec les variables en entrée.

    Par contre 4 problèmes :

    - Çà générè la matrice sur toute la feuil xls et moi j'ai d'autres données sur le reste de la feuil.
    - Et le résultat est en ligne au lieu d'être sur une colonne.
    - Qd j'ai essayé totalsysteme = 20 et système=4 çà ne marche plus
    - le temps de traitement est assez long car il construit toute la matrice avant de l'afficher

  2. #22
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    - le temps de traitement est assez long car il construit toute la matrice avant de l'afficher
    Ça, tu peux le régler facilement si tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.SreenUpdating = false 'en début de code, après Sub ..... et
    Application.SreenUpdating = True 'avant End Sub
    En outre, au lieu de l'écrire, tu peux créer un tableau -> dimensionné selon le nombre d'index -> Tablo(N) où N = 2 ^ NbTotalSysteme de Mayekeul.
    Il ne te reste plus qu'à affecter ton tableau à la plage correspondante
    en limitant ce tableau à l'index correspondant au nombre de colonnes et de lignes. Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = Nbn -1 to 1
         NbIndex = NbIndex + i
    Next
    Où Nbn correspond au nombre de chiffres (zéros + uns) et donc au nombre de lignes que doit comporter ta plage, et le nombre de colonnes = NbIndex / Nbn
    Après quoi tu retournes ton tableau en faisant un copier/collage spécial transposé.
    Tu peux aussi inverser lignes et colonnes mais je ne sais pas à combien de colonnes tu as droit sur Excel 2007
    Tu crois pouvoir faire ça ?
    Bonne soirée

    Edit
    Ma remarque "Tu peux aussi inverser lignes et colonnes mais je ne sais pas à combien de colonnes tu as droit sur Excel 2007" est idiote puisque tu n'insères pas le tableau complet dans ta feuille mais qu'une partie.

  3. #23
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Slt,

    Je suis finalement parti sur la solution de mayekeul.

    C'est a dire que je génère la matrice dans une autre feuille toujours en mode ligne (ce qui est bien car ainsi ça limite moins le nbre de solution qu'en colonne..).

    Ensuite je passe dans une autre procédure pour faire mon copier / coller transposer pour passer en colonne dans une autre feuil.

    Tous ce passe bien sauf ... que dans la génération de la matrice j'ai un problème une erreur '1004' lorsque je dépasse NbTotalSysteme > 16.

    Voici le code de mayekeul un peu modifié.

    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
     
    Sub Matrice()
    Application.ScreenUpdating = False
     
    Dim nbRow, NbOne, NbSysteme, NbTotalSysteme As Long
    Dim I, J, K, R As Long
     
    'Setup
    NbSysteme = Sheets("setup").Cells(12, 11).Value 'Nbre de system.
    NbTotalSysteme = Sheets("setup").Cells(9, 11).Value 'Nbre de system total to load.
     
    'Total de sequences possible
    nbRow = 2 ^ NbTotalSysteme
    Sheets("Matrice").Range("A1").CurrentRegion.ClearContents
     
    'affichage de la matrice
    For I = 1 To NbTotalSysteme
        NbOne = nbRow / (2 ^ I)
        R = 1
        For J = 1 To 2 ^ (I - 1)
            Sheets("Matrice").Range(Sheets("Matrice").Cells(R, I), Sheets("Matrice").Cells(R + NbOne - 1, I)) = 1
            Sheets("Matrice").Range(Sheets("Matrice").Cells(R + NbOne, I), Sheets("Matrice").Cells(R + NbOne * 2 - 1, I)) = 0
            R = R + NbOne * 2
        Next J
    Next I
     
    'Garder les séquences comprenant nbSysteme 0
    For I = nbRow To 1 Step -1
        plage = Sheets("Matrice").Range(Sheets("Matrice").Cells(I, 1), Sheets("Matrice").Cells(I, NbTotalSysteme))
        R = Application.WorksheetFunction.Sum(plage)
        If Not R = NbSysteme Then Sheets("Matrice").Rows(I).Delete
    Next I
    Application.ScreenUpdating = True
    End Sub
    QQ'un a une idée d'ou ça peut venir ?

    Merci.
    Cdlt
    Ludo.

  4. #24
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Tu ne travailles pas sur la version 2007 d'Excel, alors tu n'as que 65536 lignes et
    2 ^ 16 = 65536
    C'est bien ce que je craignais et c'est pourquoi je t'avais conseillé le tableau.
    Je n'ai pas effacé mes explications, tu peux toujours les relire.
    Maintenant, si tu as besoin d'autres conseils, on est toujours là

  5. #25
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    J'essayerai ce soir chez moi avec la version 2007 mais il me semble que c'est le même problème ...

    Est ce que le code ci-dessus devrais marcher avec la version 2007 ? Y'a pas un méthode différente pour déclarer les variables ou autres ?

  6. #26
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Bonsoir
    si j'ai bien compris voila le code de quelques minutes
    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
    Sub test()
    nb_total_systeme = 6
    nb_systeme = 4
     
    ReDim Tmps(nb_total_systeme)
    incs = 1
    For rrr = 1 To 2 ^ nb_total_systeme
    x = rrr
    cy = 0
    For ddd = 1 To nb_total_systeme
    z = x \ 2
    s = x Mod 2
    x = z
    cy = cy + s
    Tmps(ddd - 1) = s
    Next ddd
    If cy = nb_systeme Then
    For dds = 1 To nb_total_systeme
    Cells(dds, incs) = Tmps(dds - 1)
    Next dds
    incs = incs + 1
    End If
    Next rrr
    End Sub
    Voir aussi http://www.developpez.net/forums/sho...48#post3254148

  7. #27
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Joli code.
    Juste une précision : Ne sois pas étonné, sur Excel 97 et au delà de 256 colonnes, même problème que précédemment. Sauf erreur de ma part, tu seras limité à nb_total_systeme = 10 soit 1200 combinaisons, à moins de passer la suite du résultat sur les (nb_total_systeme) lignes suivantes.

  8. #28
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Bon effectivement le problème venait du fait que mon fichier était enregistré sous excel 2003 donc limité aux 65xxx lignes.

    J'ai donc sauvegardé en 2007 puis testé avec nb_total_systeme à >> 20 << je ne sais pas trop combien ça fait de combinaison mais c'est l'horreur ça va faire + de 5 heures que ça tourne et toujours pas rendu la main sur la construction de la matrice

    Merci delphidelphi j'essayerai ton code demain au taff

    Par contre je ne sais pas si je vais continuer a utiliser Excel/VBA pour faire la matrice... une autre solution serait de faire ça en C# en sortir un fichier .csv avec toutes les combinaisons et ensuite faire le reste sous xls..

    A Voir.
    Bonne soirée.
    Ludo.

  9. #29
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    OH oui je sais ça il faut changer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(dds, incs) = Tmps(dds - 1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(incs, dds) = Tmps(dds - 1)
    ou recherche par pagination
    1ere boucle de 1 à x
    2eme boucle de x à y
    3eme boucle de y à 2 ^ nb_total_systeme
    Ça, tu peux le régler facilement si tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Application.SreenUpdating = false 'en début de code, après Sub ..... et
    Application.SreenUpdating = True 'avant End Sub

  10. #30
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Yop,

    Super code delphidelphi, il est bcp plus fast que celui de mayekeul.

    Merci a tous
    Ludo.

  11. #31
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Cette macro est plus rapide
    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
     
    Sub test()
    nb_total_systeme = 20
    nb_systeme = 10
     
     With Application
            CalcMode = .Calculation
           .Calculation = xlCalculationManual
           .ScreenUpdating = False
           .EnableEvents = False
    End With
    ReDim Tmps(nb_total_systeme)
    incs = 1
    For rrr = 1 To 2 ^ nb_total_systeme
    x = rrr
    cy = 0
    For ddd = 1 To nb_total_systeme
    z = x \ 2
    s = x Mod 2
    x = z
    cy = cy + s
    Tmps(ddd - 1) = s
    Next ddd
    If cy = nb_systeme Then
    Range(Cells(incs, 1), Cells(incs, nb_total_systeme)) = Tmps
    incs = incs + 1
    End If
    Next rrr
    With Application
          .ScreenUpdating = True
          .EnableEvents = True
          .Calculation = CalcMode
    End With
    End Sub
    Cette macro est plus rapide et insert les elements surplus a cote des premiers
    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 test()
    nb_total_systeme = 20
    nb_systeme = 10
     
     With Application
            CalcMode = .Calculation
           .Calculation = xlCalculationManual
           .ScreenUpdating = False
           .EnableEvents = False
    End With
    ReDim Tmps(nb_total_systeme)
    incs = 1
    pging = 0
    For rrr = 1 To 2 ^ nb_total_systeme
    x = rrr
    cy = 0
    For ddd = 1 To nb_total_systeme
    z = x \ 2
    s = x Mod 2
    x = z
    cy = cy + s
    Tmps(ddd - 1) = s
    Next ddd
    If cy = nb_systeme Then
    Range(Cells(incs, 1 + arapage), Cells(incs, arapage + nb_total_systeme)) = Tmps
    incs = incs + 1
    If incs > 65536 Then
    incs = 1
    pging = pging + 1
    arapage = pging * nb_total_systeme
    End If
    End If
     
    Next rrr
    With Application
          .ScreenUpdating = True
          .EnableEvents = True
          .Calculation = CalcMode
    End With
    End Sub

  12. #32
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    hello,

    ça à l'air cool, je va essayer taleur!

    Alleï Bonjour chez vous!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. boucle en vba pour charger
    Par presser dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/03/2009, 17h54
  2. boucle sous VBA catia
    Par purp31 dans le forum Général VBA
    Réponses: 1
    Dernier message: 05/03/2009, 19h01
  3. Problème pour réaliser une macro "de boucles" dans VBA
    Par philou7176 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2008, 15h41
  4. Boucles en VBA Excel
    Par JPR1347 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/08/2008, 21h15
  5. Traiter 100 fichiers avec une boucle sous VBA excel
    Par sebastien06 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/04/2008, 09h39

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