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 :

[E-07]Factorielle n arrangements répartis dans cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut [E-07]Factorielle n arrangements répartis dans cellule
    Bonjour à tous,

    Voici mon problème (Excel 2007) :

    Je cherche a remplir n des cellules avec tous les arrangements possibles d'entiers de 1 à n.
    ex 1,2,3 donne:

    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1

    (où chaque entier est dans une cellule)

    Voici le code que j'ai bricolé justement pour 1,2,3 :

    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
     
    Option Explicit
    Sub Factorielle()
    Dim i, j, k, N, Fact As Integer
     
    N = 1
    Fact = 3
     
    For i = 1 To Fact
        For j = 1 To Fact
            For k = 1 To Fact
                If i <> j And i <> k And j <> k Then
                    Cells(N, 1) = i
                    Cells(N, 2) = j
                    Cells(N, 3) = k
                    N = N + 1
                End If
            Next k
        Next j
    Next i
     
    End Sub
    Donc ok jusqu'à 3, mais comment faire un code pour 1,2,3, ... , n ?

    Merci beaucoup à tous ceux qui pourront m'aider!

    Vonwolf

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    Juste une question toute bête ...
    Quelle limite envisages-tu pour ton "n" ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut limite n
    C'est en fait une excellente question.

    n=9 puisque je suis sur 2007.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bon...

    Avec 9 tu es donc dans la limite de 2007 (à condition de ne pas envisager de distribuer ton appli, bien évidemment..)
    Question n° 2 (très importante) : tu es bien certain de ce qu'il ne s'agit pas là d'un exercice de cours que l'on t'impose, hein ... car alors ... ce devra rester ton exercice. (confirme-moi ce point)
    Question n° 3 : préfères-tu travailler avec des nombres de 0 à 8 ou des nombres de 1 à 9 ou avec des lettres de A à I , ou encore avec des objets d'une liste d'objets déterminée ?

    Avertissement (à tout hasard) : je vais choisir de travailler avec des collections. Celà va parfaitement "tourner" et tu auras tes permutations, comme tu le souhaites. Mais tu auras également les plus grandes difficultés à suivre et donc (à fortiori) à expliquer à des tiers (tu ne pourras donc pas utiliser sans crainte cette méthode s'il s'agit d'un exercice imposé, hein ...)

    tu dis...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut ça me va
    Je n'ai plus à rendre de devoir depuis un certain temps!
    C'est pour mon boulot, donc à la limite tant mieux si personne ne comprend!
    Je cherche les combinaisons de nombres 1 à 9.

    Quant aux collections, je prends. Même si je comprends ton astuce au cas où je serais un étudiant, est-ce la solution optimale en termes de simplicité de code et de performance?

    Merci pour ton aide

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Pour ton "boulot" ?

    Tiens !

    Je veux bien... (bien que je voie très mal l'intérêt de dresser une telle liste et, surtout, de la reconstituer à chaque fois... mais c'est ton affaire)

    Voilà donc le principe :
    une textbox nommée textbox1 (pour afficher le résultat) et un bouton Command1 (pour lancer)

    Code :

    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
    Option Explicit
     
    Private Function permutons(ByVal V As Collection) As Collection
      Dim NV As Integer, i As Long, j As Long, k As Long
      Dim FV As Variant
      Dim NP As Collection, R As Collection, NR As Collection
      If V.Count = 1 Then
        Set R = New Collection
        R.Add New Collection
        R.Item(1).Add V.Item(1)
        Set permutons = R
        Exit Function
      End If
      Set R = New Collection
      NV = V.Count
      For i = 1 To NV
        FV = V.Item(i)
        V.Remove i
        Set NP = permutons(V)
        For j = 1 To NP.Count
          Set NR = New Collection
          NR.Add FV
          For k = 1 To NP(j).Count
            NR.Add NP(j).Item(k)
          Next k
          R.Add NR
        Next j
        If i > V.Count Then V.Add FV Else V.Add FV, , i
      Next i
      Set permutons = R
    End Function
     
    Private Sub Command1_Click()
      Dim permutations As Collection, perm As Collection, V As Collection, NV As Integer, i As Long, j As Long
      Dim pt As String, txt As String, toto As String
      Do While Val(toto) = 0 Or Val(toto) > 9
        toto = InputBox("sur combien dxe chiffres ? (de 1 à 9 ?)")
      Loop
      NV = CInt(toto)
      'MsgBox NV
      Set V = New Collection
      textbox1.Text = "je travaille..."
      DoEvents
      textbox1.Visible = False
      textbox1.Text = ""
      For i = 1 To NV
         V.Add i
      Next i
      Set permutations = permutons(V)
      For i = 1 To permutations.Count
        pt = ""
        Set perm = permutations(i)
        For j = 1 To perm.Count
          pt = pt & perm.Item(j)
        Next j
        textbox1.SelText = pt & vbCrLf
      Next i
      textbox1.Visible = True
    End Sub
    Remarques :
    1) rapide jusqu'à 7
    2) à 8 : tu peux aller prendre un café à la machine à café de ton boulot (et le boire lentement)
    3) à 9 : tu préfèreras le lancer juste avant d'aller prendre ton repas à la cantine (et manger lentement, de préférence)

    4) je t'ai ici donné l'exemple de remplissage d'une textbox. Si tu veux remplir plutôt une feuille Excel, pas de problème ! en lieu et place du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textbox1.SelText = pt & vbCrLf
    tu "envoies" pt dans des cellules successives, en incrémentant simplement le numéro de ligne (et çà, tu sais faire, hein ...)

    5) comme "promis", tu vois que je me suis "arrangé" pour que tu aies ton résultat (c'est ce que tu voulais, n'est-ce-pas ?) , mais que la chose reste ésotérique et donc inexposable...(mais tu t'en moques, n'est-ce-pas ? ).

    Un conseil : garde tout simplement les résultats du 8 et du 9 dans un classeur (ou un fichier text) où les relire en cas de besoin plutôt que de relancer un tel traitement. Ainsi, tu pourras ne le lancer qu'une seule fois (quand tu en auras le temps) et, les autres fois, de contenter de relire les résultats (sans recommencer cette magnifique perte de temps !)

    Une question, maintenant (juste pour satisfaire ma curiosité personnelle) :
    A quoi peut dont, "professionnelement" parlant, servir d'avoir une telle liste ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 24
    Par défaut
    Merci ucfoutu pour le coup de main, ton code m'est bien utile! Et je vais pouvoir essayer de comprendre les collections

    Ces permutations représentent l'ordre des colonnes d'un tableau croisé dynamique, ce qui me permet de trouver un ordre optimal.

    Encore merci et bravo

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

Discussions similaires

  1. Image cellule d'un recordset dans cellule de MSFlexGrid
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/09/2005, 13h50
  2. [D7][DBGrid] Texte dans cellule particulière
    Par moulette85 dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/04/2005, 17h49
  3. Création liste dans cellules Excel en VBA
    Par yazoo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/04/2005, 14h46
  4. Export vers Excel et saut de ligne dans cellule
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h53
  5. [D7-EXCEL2000] Formule dans cellule Excel qui ne se calcule pas
    Par Albertolino dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/09/2003, 14h18

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