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 :

[EXCEL] Formule pour un système d'équation


Sujet :

Macros et VBA Excel

  1. #21
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    eh bien, je partirai sur des boucles raccourcies.

    on trie les colonnes par ordre croissant.

    de base tout tester sur 30 lignes donne 30^5 opérations.

    je boucle sur la colonne A tant que An<Z

    A chaque A correspondant, je boucle sur B tant que An +Bm<Z

    idem sur C et D

    sur E je boucle tant que A+B+C+D+E>Z

    lorsque la condition est brisé je vérifie si A+B+C+D+E=Z

  2. #22
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    hum... sk8bcn je ne suis pas sur d'avoir compris la facon dont tu veux imbriquer tes boucles

  3. #23
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    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
    boucle1 (indice i) sur les lignes de A
     
    si Ai+max(B)+max(c)+max(d)+max(e)<Z ou Ai+min(b)+min(c)+min(d)+min(e)>z alors
     
    je saute cet élément de la boucle
     
    sinon
     
    je boucle sur B (indice j)
     
    si Ai+Bj>Z ou si Ai+Bj+max(c)+max(d)+max(e)<Z ou Ai +Bj+min(c)+min(d)+min(e)>Z alors
     
    je laisse tomber cet élement de ma boucle
     
    sinon
     
    je fais de meme en c et d
     
    si j'arrive jusqu'à E, plutot que de faire une boucle, je calcule Z-Ai-Bj-Ck-Dl et cherche si il existe un Em correspondant.
    Notez que je me suis tromper. J'ai considérez des équations de type Z=A+B+C+D+E sans boucler sur Z.

    Par ailleurs, reste la question: peut-on utiliser les memes nombres 2 fois?

    exemple: A+B =Z
    avec
    A B Z
    1 3 4
    2 2 5

    l'algorithme va trouver que 1+3=4
    puis 2+3=5

    toutefois, on utilise 3 deux fois. Est-ce légal?

  4. #24
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Il y a toujours une solution donc le cas que tu expose n'est pas possible dans les tableaux de valeurs que j aurai

    avec
    A B Z
    1 3 4
    2 2 4
    2 2 4

    Ceci est envisagable

  5. #25
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    erf, j'ai pas compris

    EDIT: si mince ok. étendons l'exemple/question
    A B Z
    1 3 4
    2 2 5
    4 3 6

    Ma question est:
    dois je avoir:
    1+3=4
    2+3=5
    4+2=6

    ou

    2+2=4
    2

  6. #26
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    effectivement dans ce cas la les deux solution son possible, mais je ne vais pas pousser le vise du programme a choisir qu une seul solution, je le ferais manuellement pour savoir la quelle est correcte

    Donc on aurait comme solution potentiel d'apres ton exemple :

    1 + 3 = 4
    et
    2 + 2 = 4

    Pour choisir entre ces deux cas, je ne pourrais le faire que tout seul suivant les données qu'il m'auront été fournis. J'ai expliqué un peu plus haut le but de cette formule, si tu est intrigué sur son utilisation

  7. #27
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    tiens pour le fun une petite procédure recursive..

    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
     
     
    Dim iNbCol As Integer
    Dim iNbLg As Integer
     
    Sub MaBoucle()
     Dim i As Integer
     iNbCol = Range("A1").CurrentRegion.Columns.Count - 1
     iNbLg = Range("A1").CurrentRegion.Rows.Count
     
      For i = 2 To iNbLg
       Mfr 1, "", 0, Cells(i, iNbCol + 1)
      Next
     
    End Sub
     
    '
    ' Ma procedure recursive
    '
    Sub Mfr(ByVal j As Integer, ByVal stformule As String, ByVal res As Long, Z As Long)
      Dim iLigne As Integer
      Dim l As Long
      Dim stNewFormule As String
      For iLigne = 2 To iNbLg
        Debug.Print "Test pour : " & Cells(iLigne, j).Address
        l = Cells(iLigne, j) + res
        stNewFormule = stformule & "+" & Cells(iLigne, j).Address
        If l <= Z Then
          If j + 1 <= iNbCol Then
              Mfr j + 1, stNewFormule, l, Z
          Else
             If l = Z Then
                 Debug.Print " ============== GAGNE === > ";
               Else
                  Debug.Print "...";
               End If
               Debug.Print stNewFormule & " =>" & l & " pour " & Z
          End If
        Else
            Debug.Print " Trop grand Abandon : " & stNewFormule & " = " & l
        End If
     
      Next
    End Sub

  8. #28
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Merci ca pourrait me servire, pourrait tu la commenter un peu ?

  9. #29
    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 546
    Points
    15 546
    Par défaut
    Hello,
    Comme ton problème m'intéresse et que les réponses de bbil sont toujours édifiantes, j'ai tenté une explication (en attendant la sienne - vu que qu'il arrive toujours après avec une meilleure explication )
    Tu m'en voudras pas, bbil, je me lance
    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
    Sub MaBoucle()
     Dim i As Integer
     iNbCol = Range("A1").CurrentRegion.Columns.Count - 1 ' Nb de colonnes (-1 -> colonne des Z retirée
     iNbLg = Range("A1").CurrentRegion.Rows.Count ' Nbre de lignes renseignées
    
      For i = 2 To iNbLg 'de la seconde ligne à la dernière
       Mfr 1, "", 0, Cells(i, iNbCol + 1) 'lance la procédure récursive avec la valeur de Z pour la ligne i
      Next
    
    End Sub
    
    '
    ' Ma procedure recursive
    '
    Sub Mfr(ByVal j As Integer, ByVal stformule As String, ByVal res As Long, Z As Long)
    'j = 1 au départ puis incrémenté ici (*)
    'stformule = "" au départ, puis = stNewFormule constituée ici (**) et validée 
    'là (*****) et ligne suivante
    'res = 0 au départ, puis = l (l est traité ici (***) et devient res ici (****)
    'Z = Cells(i, NoColonne des Z) => Z de chaque ligne
      Dim iLigne As Integer
      Dim l As Long
      Dim stNewFormule As String
      For iLigne = 2 To iNbLg
      'Là, iNbLg semble manquer mais suffit de reprendre la formule donnée dans "MaBoucle"    Debug.Print "Test pour : " & Cells(iLigne, j).Address
        l = Cells(iLigne, j) + res '(***) Somme des cellules
        stNewFormule = stformule & "+" & Cells(iLigne, j).Address '(**) Constitution de la formule (Résultat)
        'cette formule est transitoire et ne sera effective que si... lignes suivantes
        If l <= Z Then 'si l <= Z et... voir sinon ---> (*****)
          If j + 1 <= iNbCol Then '...si NoColonne <= NoColonne Z...
              Mfr j + 1, stNewFormule, l, Z '(*) (****) '... boucle sur Mfr avec la nouvelle formule
           Else '... sinon
               If l = Z Then '... si l = Z on passe à la ligne suivante des Z
                   Debug.Print " ============== GAGNE === > ";
                 Else 'sinon on continue
                   Debug.Print "...";
               End If
               Debug.Print stNewFormule & " =>" & l & " pour " & Z
          End If
        Else ' ---> on passe sans rien faire à la ligne suivante des valeurs (Next iLigne)
          Debug.Print " Trop grand Abandon : " & stNewFormule & " = " & l
        End If
      
      Next
    'quand toutes les lignes et colonnes ont été examinées pour un Z donné, on retourne
    'dans la procédure "MaBoucle()" pour lire le Z suivant
    End Sub
    Voilà.
    Le truc en rouge ? bbil va pas manquer de s'expliquer

  10. #30
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    non j'ai rien à rajouté, sauf que pour le truc en rouge, lors de la copie du code tu as oublié la déclaration des variables iNbCol et iNbLig.. en globale..

  11. #31
    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 546
    Points
    15 546
    Par défaut
    T'as raison, j'avais encore oublié de remonter l'ascenseur... Je t'ai dit, je suis indécrotable

  12. #32
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Hum merci pour les commentaires, je la testerais se weekend, mais est ce la solution a mon problème ? ou un exemple de comment résoudre mon problème ?

  13. #33
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par Gerard6969
    Hum merci pour les commentaires, je la testerais se weekend, mais est ce la solution a mon problème ? ou un exemple de comment résoudre mon problème ?
    ben c'est "une" solution .. si j'ai bien compris le sujet..

  14. #34
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    HA génial j'avais pas compris ça, je pensais que c'était un exemple sur le type de boucle que je pouvais faire, mais j'avais pas compris que l'exemple avait été adapté à mon problème


    Merci beaucoup je testerais tout ça se weekend, et je mettrais résolu si tout fonctionne bien.

  15. #35
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Bé merci beaucoup j'ai testé ta solution et elle fonctionne très bien, j'ai juste un petit problème c'est pour afficher les solutions, toi tu utilise la fonction debug.print (je rappel je suis novice), mais chez moi je ne trouve pas ou son afficher les solution (je devrais avoir une fenêtre de gestion des print, mais je ne la trouve pas), peut etre parceque j'utilise le visualbasic d'excel ?. Mon seul moyen d'afficher les solutions c est de remplacer la fonction debug.print par msgbox. Autant dire que c'est pas pratique.

    Alors aurait tu une idée de comment je pourrais visionner les résultats d'une façon qui soit plus éfficace ? (sachant que le VBA que j'utilise est celui d'excel!)

  16. #36
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    Peut etre une fonction qui me rajouterais les formules correcte dans une colone à coté de celle des résultats?

  17. #37
    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 546
    Points
    15 546
    Par défaut
    A la place de debugprint, tu peux coller le résultat dans iNbCol + 2
    iNbCol = Nombre de colonne -1
    iNbCol + 1 = colonne des Z
    iNbCol + 2 -> Tu colles ton résultat sur la ligne du Z sur la colonne suivante
    Tu sauras gérer ?
    Tu dis

  18. #38
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    J'avoue que si tu pouvais me rajouter la modification dans le code sa serait pas pour me deplaire, sinon je regarderais sa se weekend merci en tout cas

  19. #39
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 66
    Points : 30
    Points
    30
    Par défaut
    faut penser a incrementer les lignes aussi, sinon on va ecraser le résultat précédent a chaque fois je pense :/

  20. #40
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2015, 00h15
  2. [Toutes versions] Formule pour recuperer une valeur sur un autre fichier Excel
    Par bonilla dans le forum Excel
    Réponses: 2
    Dernier message: 26/06/2012, 12h19
  3. Algorithme de Runge-Kutta pour un système d'équations différentielles non linéaire
    Par lajoietristesse dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 09/01/2012, 22h46
  4. [Excel] formule pour une liste déroulante
    Par marsupilami34 dans le forum Excel
    Réponses: 2
    Dernier message: 02/02/2007, 22h44
  5. [Excel] séparateur pour les fichiers csv
    Par drinkmilk dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2005, 15h21

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