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 :

faire un programme qui permet de retrouver un montant


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de mouss4rs
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    884
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 884
    Par défaut faire un programme qui permet de retrouver un montant
    Bonjour,

    Je me posai une question:

    Est-il possible de faire une macro qui permet de rechercher selon 4 critere dans un autre fichier ?

    Par exemple nous aurions:

       time       phase      entité   item      montant
    2012.12 P_VISEE3 E_BEEFRA I_S-P        424
    le but est de retrouver les mêmes time, phase, entité, item dans un autre fichier, on aurait par exemple ceci dans l'autre fichier:

    time       phase      entité   item      montant
    2012.12 P_VISEE3 E_BEEFRA I_S-P        300
    2012.12 P_VISEE3 E_BEEFRA I_S-P          40
    2012.12 P_VISEE3 E_BEEFRA I_S-P          20
    2012.12 P_VISEE3 E_BEEFRA I_S-P           4
    ici on peut voir directement que 300+40-20+4 font 424.

    ce que j'aimerai faire c'est ça !

    retrouver un montant sur les 4 mêmes critères.
    les opérations pour retrouver le montants ne sont que les addidtions et les soustraction.

    Je ne sais pas vraiment comment m'y prendre...

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Si c'est possible pour toi, tu pourrais insérer une colonne dans laquelle tu concatènes les valeurs de time phase entité item
    Ensuite, tu peux faire un SOMME.SI sur cette colonne pour retrouver les montants.

    Reste à voir si la concaténation ne sera pas trop longue.
    J'ai déjà eu un problème avec une concaténation qui contenait trop de caractère et qui causait un problème avec SOMME.SI, mais je pense que ça arrive seulement s'il n'y a que des chiffres (?), ce qui n'est pas ton cas...

  3. #3
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Bonjour mouss4rs

    Tout dépend comment les données sont structurées dans tes fichiers pour qu'on puisse savoir où commence et où finit la séquence 2012.12 P_VISEE3 E_BEEFRA I_S-P.
    Il est peut-être possible alors d'utiliser la commande FIND.

    Docmarti

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour mouss4rs,

    ici on peut voir directement que 300+40-20+4 font 424.
    ce que j'aimerai faire c'est ça !

    Si tu veux mon avis, tu n'es pas au bout de tes peines

    Cordialement.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 258
    Par défaut
    Je pense que ca n'est pas si compliqué.
    Enfait, tu n'as pas 4 criteres mais juste la concaténation de 3 chaines de caracteres

    Tout dépend de la mise en forme des données et surtout de la mise en forme des résultats que tu souhaites.

    Est ce que tu as une feuille qui contient la liste de l'ensemble des choix possibles ou faut il la construire?

    Si elle existe, un simple somme.si basé sur une concaténation te permettra de répondre au probleme.
    S'il faut la construire, une petite boucle en macro sera facile à créer.

    Maintenant il faut se jeter à l'eau et commencer à proposer une solution que l'on pourra t'aider à améliorer.

    Christophe

  6. #6
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Ce n'est peut-être pas aussi simple.
    Outre le fait que 300+40-20+4 font 324 , la difficulté va dépendre du nombre d'éléments de la liste sur lesquels il faut porter la recherche. S'il n'y a que 4 éléments qui ont la référence 2012.12 P_VISEE3 E_BEEFRA I_S-P, il suffit de trouver ces 4 éléments sans se préoccuper de l'opération. Par contre, si la recherche doit porter sur une liste de 50 éléments ayant la référence 2012.12 P_VISEE3 E_BEEFRA I_S-P, il faut examiner les combinaisons de 4 nombres parmi 100 nombres (50 positifs et 50 négatifs), soit 3921225 combinaisons afin de trouver celles qui satisfont au résultat.

    Cordialement.

  7. #7
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Voici une fonction FIND Multi-Criteres :

    Copyright Docmarti 2013

    Choisir vLookIn = xlValues ' si les éléments recherchés risquent d'être le résultat d'une formule
    Sinon vLookIn = xlFormulas

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    Sub GO_Find_Multi_Criteres()
     
        Dim r As Range 'Le champ de recherche
     
        Dim vLookIn As Long
        vLookIn = xlValues 'xlValues 'xlFormulas
     
        Set f1 = ThisWorkbook.Worksheets("Feuil1")
     
        If vLookIn = xlValues Then
            f1.Columns.AutoFit
            f1.Cells.ShrinkToFit = True
        End If
     
        'les criteres se trouvent en $A2:$D2, le total a rechercher en $E2
        Ligne = 2
        OffSet_Total = 4
        TotalRechercher = f1.Cells(Ligne, 1).Offset(0, OffSet_Total).Value
     
        ReDim crit(4)
     
        For i = 1 To 4
     
            If vLookIn = xlValues Then
                crit(i) = f1.Cells(Ligne, i).Text
            Else
                crit(i) = f1.Cells(Ligne, i).Value
            End If
     
        Next
     
        Dim w2 As Workbook
     
        Set w2 = ThisWorkbook 'Le classeur où effectuer la recherche
     
        Set f2 = w2.Worksheets("Retrouver_un_montant")
     
        Set r = f2.Cells 'La recherche s'effectue sur toute la feuille
        Set r = f2.Columns("A:O") 'ou définir un champ restreint
     
        Set Result = DataFind(r, TotalRechercher, OffSet_Total, crit, vLookIn)
     
        If Result Is Nothing Then
            MsgBox "Aucun resultat", , TotalRechercher
        Else
     
            For Each c In Result.Areas
                Debug.Print c.Address
            Next
     
            MsgBox Result.Address, , TotalRechercher
     
        End If
     
    If vLookIn = xlValues Then
            f1.Cells.ShrinkToFit = False
        End If
     
    End Sub
     
    Function CheckCriteres(c, crit, WhereLookIn)
     
        Set CheckCriteres = c
     
        ok = False
        For i = 2 To 4
     
            If WhereLookIn = xlFormulas Then
                TheData = c.Offset(0, i - 1).Value
            Else
                TheData = c.Offset(0, i - 1).Text
            End If
     
            If TheData <> crit(i) Then
                Set CheckCriteres = Nothing
                Exit Function
            End If
     
        Next
     
    End Function
     
    Private Function DataFind(r, TotalRechercher, OffSet_Total, crit, WhereLookIn)
     
        Dim ResultCrit As Range
        Set ResultCrit = Nothing
     
        If WhereLookIn = xlValues Then
            r.Columns.AutoFit
            r.ShrinkToFit = True
        End If
     
        v = crit(1)
     
        Set DataFind = Nothing
        Set ResultCrit = Nothing
     
        Set rg = r.Find(v, LookAt:=xlWhole, LookIn:=WhereLookIn, After:=r.Cells(r.Cells.Rows.Count, r.Cells.Columns.Count), SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
     
        If rg Is Nothing Then
     
            Set DataFind = Nothing
        Else
     
            Set ResultCrit = CheckCriteres(rg, crit, WhereLookIn)
            FirstAddress = rg.Address
            Do
                Set rg = r.FindNext(rg)
                If ResultCrit Is Nothing Then
                    Set checkcrit = CheckCriteres(rg, crit, WhereLookIn)
                    If Not checkcrit Is Nothing Then
                        Set ResultCrit = checkcrit
                    End If
                Else
                    Set checkcrit = CheckCriteres(rg, crit, WhereLookIn)
                    If Not checkcrit Is Nothing Then
                        Set ResultCrit = Application.Union(ResultCrit, checkcrit)
                    End If
                End If
            Loop While Not rg Is Nothing And rg.Address <> FirstAddress
        End If
        If Not ResultCrit Is Nothing Then
            For i = 1 To ResultCrit.Areas.Count
     
                Total = 0
     
                For Each c In ResultCrit.Areas(i)
                    Total = Total + c.Offset(0, OffSet_Total).Value
                Next
     
                If Total = TotalRechercher Then
     
                    If DataFind Is Nothing Then
                        Set DataFind = ResultCrit.Areas(i)
                    Else
                        Set DataFind = Application.Union(DataFind, ResultCrit.Areas(i))
                    End If
                    'ResultCrit.Areas(i).Select
                Else
     
                End If
            Next i
        End If
     
        If WhereLookIn = xlValues Then
            r.ShrinkToFit = False
        End If
     
    End Function

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/03/2008, 08h37
  2. Réponses: 4
    Dernier message: 13/12/2007, 22h09
  3. Réponses: 2
    Dernier message: 10/09/2007, 13h03
  4. comment faire un programme qui calcul la somme ?
    Par jahjouna dans le forum C++
    Réponses: 18
    Dernier message: 13/12/2006, 00h33
  5. Faire un programme qui plante et noter le plantage
    Par cedricgirard dans le forum Langage
    Réponses: 9
    Dernier message: 22/03/2006, 16h36

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