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 :

Matcher des nombres pour obtenir un certain total


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2006
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2006
    Messages : 239
    Par défaut Matcher des nombres pour obtenir un certain total
    Bonjour le forum,

    Je vous joins le code pour savoir ce qui cloche, car je l'ai fait tourner pendant 1h30 (repas) et aucun message n'est indiqué.
    Colonne A, une 50 de chiffres
    Colonne B, le montant a trouver avec les chiffres de la colonne A.

    Le code est installer sur : Feuil1(Feuil1)

    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
    Option Explicit
     
    Public Sub GetAllDecompo()
        Dim listNumber As New Collection
        Dim total As Double
        Dim result As Collection
        Dim i, j As Double
        Dim str As String
     
        Dim ws As Worksheet
        Set ws = Worksheets("Feuil1")
        ws.Range("C:C").ClearContents
     
        'On récupère les paramètres sur la feuille
        i = 1
        While ws.Cells(i, 1) <> ""
            listNumber.Add ws.Cells(i, 1).Value
            i = i + 1
        Wend
        total = ws.Cells(1, 2).Value
     
        'On lance la fonction
        Set result = decompo(listNumber, total)
     
        'On écrit les résultats
        For i = 1 To result.Count
            str = ""
            For j = 1 To result(i).Count
                str = str & result(i)(j) & "+"
            Next j
            str = Left(str, Len(str) - 1)
            ws.Cells(i, 3).Value = str
        Next i
    End Sub
     
    Private Function decompo(ByVal listN As Collection, ByVal total As Double) As Collection
        Dim c As New Collection
        Dim cTemp As Collection
        Dim newTotal As Double
        Dim tmpNb As Double
        Dim i As Double
     
        Dim tmpListN As Collection
     
        'S'il n'y a plus qu'un élément, on l'ajoute dans la collection s'il est égal au total
        If listN.Count = 1 Then
            If listN(1) = total Then
                Set cTemp = New Collection
                cTemp.Add total
                c.Add cTemp
            End If
        ElseIf listN.Count > 1 Then
            newTotal = total - listN(1)
            Set tmpListN = getCopy(listN)
            'Sinon, listN ne retrouve pas ses valeurs quand on remonte d'un cran dans la récursivité
            tmpNb = listN(1)
            tmpListN.Remove 1 'On enlève le premier nombre de la liste
     
            'On regarde si on peut faire le total avec les autres
            Set cTemp = decompo(tmpListN, total)
            For i = 1 To cTemp.Count
                c.Add cTemp(i)
            Next i
     
            'Puis on regarde si on peut faire avec les autres le total moins celui là
            If newTotal = 0 Then 'On a notre somme
                Set cTemp = New Collection
                cTemp.Add tmpNb
                c.Add cTemp
            ElseIf newTotal > 0 Then 'On regarde la somme avec le nouveau total
                Set cTemp = decompo(tmpListN, newTotal)
                For i = 1 To cTemp.Count
                    cTemp(i).Add tmpNb
                    c.Add cTemp(i)
                Next i
            End If
        End If
     
        Set decompo = c
    End Function
     
    Private Function getCopy(ByVal c As Collection) As Collection
        Dim c2 As New Collection
        Dim i As Double
        For i = 1 To c.Count
            c2.Add c(i)
        Next i
        Set getCopy = c2
    End Function
    Si quelqu'un peut me dire ce qui cloche dans le code, je le remercie d'avance.
    Bonne journée.

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Pas de boucle infinie pour moi.
    Juste que je ne comprends pas le but de la manoeuvre...
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  3. #3
    Membre émérite
    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
    Par défaut
    Citation Envoyé par Bernard67 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        'On écrit les résultats
        For i = 1 To result.Count
            str = ""
            For j = 1 To result(i).Count
                str = str & result(i)(j) & "+"
            Next j
            str = Left(str, Len(str) - 1)
            ws.Cells(i, 3).Value = str
        Next i
    Utilisation stupide de l'objet Collection pense à For Each

  4. #4
    Membre éclairé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2006
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2006
    Messages : 239
    Par défaut
    Bonjour le forum,

    Désolé du retard mais j'étais absent.

    Merci AlainTech, Montor.

    But de la manoeuvre :Ce sont des montants de factures en attente de paiement de différents clients(qui ont plusieurs factures à réglées).
    Le montant à trouver permettra de trouver quelles factures ont été réglées.

    Quelques chiffres de la colonne A :
    1143,98
    1433,53
    2170,76
    2483
    99978,86
    103653,82
    151991,01

    Le montant à trouver en B1
    139677,69

Discussions similaires

  1. Formule pour obtenir des nombres parmi 0, 1 et 2 ?
    Par Entibo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 23/12/2014, 00h03
  2. Réponses: 3
    Dernier message: 07/01/2008, 12h02
  3. Hauteurs des div pour obtenir 100% de la page
    Par lionheart33806 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/12/2006, 12h25
  4. Creation d'un composant pour saisir des nombres
    Par Sylmandel dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 05/06/2006, 10h09
  5. Tri d'une JTable pour des nombres
    Par chasse dans le forum Composants
    Réponses: 2
    Dernier message: 20/04/2006, 15h25

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