Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/10/2011, 16h58   #1
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
Par défaut Code pour lister toutes les combinaisons

Bonjour,

Je cherche un code vba pour lister toute les combinaisons possibles en permuttant :
1 2 3 4 5 6 7 8 9 et 10.

Puis les mettre dans un tableau

Merci d'avance
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 08h49   #2
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
Bonjour,

Je pense que tu peux trouver la réponse par toit même
*exercice du prof ?*

faire tourner un exemple de résultat à la main, essaye avec:
  • 1 et 2
  • puis 1,2 et 3
  • puis 1,2,3 et 4 *stop après sinon ça devient chiant *

Reviens nous voir *avec un minimum de résultats*
et on te dira si ça va.

PS: Fait tes liste de chiffres dans un ordre logique (ex: commence par les 1, puis les 2, ...)
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 09h13   #3
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
Merci pour le tuyau, mais j'avais commencé à faire quelque chose du genre...

Et j'ai lu qu'il y a avait moyen de le faire avec une fonction récursive.

Ca serait plus "propre"...

Toutefois, merci pour le tuyau, je vais continuer à chercher

PS: Et non, j'ai 31 ans, c'est pas un exercice du prof. Je dev une macro excel qui doit tester un grand nombre de possibilités (3 628 800 dans le cas présent si mes calculs sont bons) pour donner un meilleur choix d'emplacement.
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 09h26   #4
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
C'est un langage VBA du coup, et non vb.net
le soucis peut très bien être réglé sur ce fofo puisque c'est un algo dont tu a besoin,
le langage derrière est générique (Boucle For, test IF, ...)

PS: à titre d'info, tout ce qui est macro Excel c'est dans: Office->Excel->Macros VBA Excel
PPS: J'attends ta suite
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 09h29   #5
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
Exact, c'est pour ca que j'ai posté ici.
Je me suis dit (peut-être à tord) qu'il y aurait plus de monde sur le fofo vb.net apte à me fournir une solution.
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 10h47   #6
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
Je suis en train de regarder pour "faire propre" avec la fonction récursive,
mais j'ai un doute qu'on puisse le faire aussi facilement que pour la Factorielle *grand classique des fonctions récursives*

étant donné que tu veux sortir des tableaux, si on joue avec la récursivité, on va se galerer, il faut:
  • gérer les tailles des tableaux
  • et l'ordre des données *surtout ne pas les écraser*

je pense que ce que je te propose c'est de faire une fonction à la mano "pas propre",
et si tu veux on essayera de plancher sur une fonction un peut plus évoluer *dite récursive*
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 11h00   #7
Expert Confirmé
 
Homme Philippe
ex Observeur CGG / Analyste prog.
Inscription : juin 2006
Messages : 1 708
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Localisation : France, Finistère (Bretagne)

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

Informations forums :
Inscription : juin 2006
Messages : 1 708
Points : 3 633
Points : 3 633
Salut, une simple recherche sur le site devrait être suffisante : http://www.google.fr/#sclient=psy-ab...w=1027&bih=719
__________________
Pensez à Voter, d'avance merci. ( Pouces en bas à la droite de Citer )
Balisez votre code après l'avoir indenté sous Excel via Smart Indenter
Autre utilitaire : MZ Tools 3.0 VBA

Contribution : Excel / Word / PDF avec Adobe Acrobat Pro / PDFCreator 1 2
kiki29 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 11h21   #8
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
Tes solutions fonctionnent pour des valeur à 2 chiffres,
mais je n'ai pas trouvé d'exemples qui nous montrent comment faire avec des valeurs à 10 chiffres
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 14h43   #9
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
Merci kiki29, je suis tombé sur pas mal de lien que j'avais déjà consulté, toutefois, je pense avoir trouvé une bonne piste pour coder ma fonction récursive ici :

Citation:
Envoyé par prgasp77 Voir le message
Salut. Imaginons que tu saches construire une telle liste de tableau pour N items :
[
{A, B, C},
{B, C, A},
...
]
Pour construire une liste similaire pour N+1 items, il suffit, pour chaque tableau de ta liste (dans l'exemple, pour chaque ligne), d'insérer le N+1-ième item à chaque emplacement possible :
[
{D, A, B, C},{A, D, B, C},{A, B, D, C},{A, B, C, D},
{D, B, C, A},{B, D, C, A},{B, C, D, A},{B, C, A, D},
...
]

Ainsi, du fait que tu n'as qu'un faible nombre d'items, je propose une solution récursive :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fonction arrangements(l : liste d'item)
Si taille de l = 1 Alors
   retourner l
Sinon
   Soient tete : item et queue : liste d'item telles que tete+queue=l
   Soit resultat : liste de (liste d'item)
   l' = arrangements(queue)
   Pour chaque liste arrangement de l'
      Pour chaque item i de arrangement
         Ajouter la liste arrangement[0..i-1]+tete+arrangement[i..fin] à resultat
      Fin Pour
   Fin Pour
   retourner resultat
Fin Si
source : http://www.developpez.net/forums/d10...e/#post6047715

Reste maintenant à en tirer le code...
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 15h39   #10
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
De retour tontonced

Je ne te serrai pas d'une grande aide, il y a une partie importante que je ne comprend pas ...
Citation:
Soient tete : item et queue : liste d'item telles que tete+queue=l
Soit resultat : liste de (liste d'item)
l' = arrangements(queue)
les Soient tete et soit resultat sont vraiment pas clair...
et qu'est-ce qu'il entend par "arrangement"

-------------------------------------------------------------------

Tu aura besoin de faire d'autre liste de chiffres comme ça?
ou c'est quelque chose d’exceptionnel?
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 16h17   #11
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
J'osais pas dire que c'était pas clair... Mais j'ai le même problème pour comprendre que toi
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2011, 16h18   #12
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
humm c'est une autre approche qui consiste à ajouter un chiffre avant et après chaque chiffre qui est dans le nombre.

.............123
........../
.......12 - 132
....../....\
..../.......312
..1
....\.......213
......\.../
.......21 - 231
..........\
...........321

Je vois bien la partie récursive mais alors comment coder .... *j'en fait pas tous les jours...*
je peux te donner un code qui va le faire mais ce serra que pour ton cas à 10chiffres
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/10/2011, 16h41   #13
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
Donne donne... en attendant mieux
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 16h06   #14
Membre Expert
 
Avatar de hunteshiva
 
Homme eric Maitre
Étudiant
Inscription : février 2010
Messages : 954
Détails du profil
Informations personnelles :
Nom : Homme eric Maitre
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 954
Points : 1 166
Points : 1 166
désolé pour le retard, petit contre temps.

bon pour ton code,
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
 
Sub Beta()
    'Déclaration des variables
    Dim Chaine, NextNumber, NewChaine As String
    Dim Longueur, i As Integer
    'Initialisation des variables
    Chaine = "123"
    NextNumber = "4"
    NewChaine = ""
    'Récupération de la longueur de la chaine
    Longueur = Len(Chaine)
    'Dimensionnement du tableau
    ReDim NewChaine(Longueur - 1)
    'Insertion du caratére
    For i = 0 To Longueur - 1
        NewChaine(i) = Left(Chaine, i) & NextNumber & Right(Chaine, i)
    Next
End Sub
Le code est encore à l'état de beta, il ne permet que de passer de la suite 123 -> aux 4 autres possibilités qui en découlent.
je l'ai pas testé mais c'est pour te donner un aperçu de la méthode à laquelle je pense.

PS: attention pour cette routine tu a besoin de considérer tes chiffres comme des lettres
hunteshiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 17h16   #15
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 899
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 899
Points : 7 185
Points : 7 185
Bonjour,

Une autre méthode qui peut être te conviendra
Ici on boucle sur 3 niveaux, mais le principe reste le meme sur x niveaux (par contre, pour la restitution faire attention au nombre de lignes

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim i1 As Byte
Dim i2 As Byte
Dim i3 As Byte
 
Dim iLigne As Long
 
iLigne = 1
 
For i3 = 1 To 10
    For i2 = 1 To 10
        For i1 = 1 To 10
            Range("A" & iLigne).Value = i1 & i2 & i3
            iLigne = iLigne + 1
        Next i1
    Next i2
Next i3
Et comme cela si on ne veut pas de doublons
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
Dim i1 As Byte
Dim i2 As Byte
Dim i3 As Byte
 
Dim iLigne As Long
 
iLigne = 1
 
For i3 = 1 To 10
    For i2 = 1 To 10
        If i2 <> i3 Then
            For i1 = 1 To 10
                If i1 <> i2 And i1 <> i3 Then
                    Range("A" & iLigne).Value = i1 & i2 & i3
                    iLigne = iLigne + 1
                End If
            Next i1
        End If
    Next i2
Next i3
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2011, 19h40   #16
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

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

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut
Peut être quelque chose dans ce gout la

Code :
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 Permute(ByRef StrTableau As String, ByVal PreSuFix As String)
Dim TabSplit
Dim i As Integer
 
 
If StrTableau = "" Then
    StrTableau = PreSuFix
Else
    TabSplit = Split(StrTableau, "¤")
 
    For i = 0 To UBound(TabSplit)
        StrTableau = StrTableau & "¤" & PreSuFix & TabSplit(i) & "¤" & TabSplit(i) & PreSuFix
    Next
End If
 
End Sub
 
 
Sub Utilisation()
Dim i As Integer
Dim StrTab As String
Dim TabResultat
 
For i = 1 To 10
    Permute StrTab, i
Next
 
TabResultat = Split(StrTab, "¤")
With Feuil1.Range("A1").Resize(UBound(TabResultat))
    'On passe les cellule en format texte pour éviter qu'excel n'exploite les valeurs avec un format scientifique
    .NumberFormat = "@"
    .Value = WorksheetFunction.Transpose(TabResultat)
End With
End Sub
Il doit falloir retravailler un peu les boucles car je ne trouve que 19000 et quelques résultats... le calculs qui te donne 3M de possibilité tient compte des doublon? 6 2 3 6 5 ?

Autre problème posé par mon code: je viens de voir que le 1 sera toujours présent, puis le 2... puis le 3, il n'y a donc pas toutes les solutions... il faudrait refaire appelle au code 10 fois en réduisant la borne de départ a chaque fois. de 1à10 puis de 2à10...jusqu'à 9à10, il suffit de mettre une boucle de plus dans la sub utilisation, je te laisse tester, je n'ai pas trop le temps

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/10/2011, 21h36   #17
Invité régulier
 
Inscription : octobre 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 2
Points : 7
Points : 7
Bonsoir à tous,

Vois l'algorithme de Jonhson-Trotter version VBA proposé par fred65200 dans ce lien.

http://www.developpez.net/forums/d42...ne-charactere/

Tu listeras les 3 628 800 permutations : factorielle de 10

Klin89
Klin89 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/11/2011, 15h03   #18
Invité de passage
 
Inscription : octobre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 7
Points : 1
Points : 1
Beaucoup de réponse à étudier (j'étais parti en vacances quelques temps)...

Merci à tous
tontonced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h58.


 
 
 
 
Partenaires

Hébergement Web