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 :

automatisation Rapprochement bancaire [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut automatisation Rapprochement bancaire
    Bonjour à tous,

    Ayant lu pas mal de fil à ce sujet, je viens vous solliciter pour un peu d'aide (un défi pour moi...)

    Je dois rapprocher débit/crédit, comme c'est souvent le cas, mais je bloque sur la façon de faire, je m'explique :

    5 colonnes => journal, n° opération, libellé, débit, crédit
    journal : 2 valeurs possibles, "LOAD" et "IG & UK"
    LOAD => ce qui est en banque (uniquement crédit)
    IG & UK => ce qui est en attente (débit ou crédit si annulation, donc à rapprocher si annulation dans le meme journal) ou à rapprocher avec LOAD

    le journal LOAD à un n° opération distinct
    dans le libellé des lignes LOAD, on retourve le n° d'opération des lignes IG&UK et le n° client est commun aux libellé des lignes LOAD et IG&UK...

    ce n'est pas très facile à expliquer, dites moi si un fichier pourrai aider...

    Merci pour votre aide, je suis perdu...

  2. #2
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Bonjour,

    Je suis pas certain d'avoir tout compris. Pour éviter tout malentendu, peux-tu joindre un fichier.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour QuestVba

    voici le fichier avec quelques explications à l'intérieur.

    Merci
    Fichiers attachés Fichiers attachés

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Points : 110
    Points
    110
    Par défaut
    Bonsoir,

    Voici un code que vous pourriez peut être adapter à vos besoins

    Ce code effectue le rapprochement sur base Débit/Crédit d'un même montant

    Code testé sur votre fichier

    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
    Sub Rapprochement()
     
        Dim Nb As Long, i As Long, j As Long, k As Long
        Dim Tb
     
        Application.ScreenUpdating = False
        With Worksheets("NOVEMBRE")
            Nb = .Cells(.Rows.Count, "A").End(xlUp).Row - 1
            If Nb > 0 Then
                Tb = .Range("A2").Resize(Nb, 8).Value
     
                For i = 1 To Nb
                    If Tb(i, 8) = Empty And Abs(Tb(i, 4)) > 0 Then
                        For j = 1 To Nb
                            If Tb(j, 8) = Empty And Abs(Tb(j, 5)) > 0 Then
                                If Abs(Abs(Tb(i, 4)) - Abs(Tb(j, 5))) < 0.0000000001 Then
                                    k = k + 1
                                    Tb(i, 8) = k
                                    Tb(j, 8) = k
                                    Exit For
                                End If
                            End If
                        Next j
                    End If
                Next i
     
                .Range("A2").Resize(Nb, 8).Value = Tb
                .Range("A2").Resize(Nb, 8).Sort Key1:=.Range("H3"), Order1:=xlAscending, Header:=xlNo
            End If
        End With
    End Sub
    _______________
    Cordialement

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonsoir Sogestion,

    en effet le code fonctionne parfaitement pour rapprocher les montant identiques, malheureusement j'ai, dans mon classeur original, trop de montants identiques pour que ce code fonctionne de manière optimale.

    Il faudrait rajouter, pour les montants identiques une condition entre les 5 derniers caractères du libellé (colonne C) des lignes qui ont en colonne A "LOAD", et le numéro "OP" (colonne B) des lignes qui ont en colonne A "IG&UK" pour que cela se rapproche de ce que j'essai de faire... encore que si il s'agit d'une annulation, ce serait deux lignes qui en colonne A aurait IG&UK avec un même libellé mais une numéro OP différent (et bien des montant identiques, un au crédit l'autre au débit)...

    Bref, un vrai casse-tête

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je suppose qu'on est avec les même montants débit et crédit sur une même opération d'un même client et qu'on est avec une seule ligne par opération.
    C'est mon hypothèse (à confirmer ou infirmer)
    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
    Sub Rapprochement()
    Dim Nb As Long, i As Long, j As Long, k As Long
    Dim Op As String, Client As String
    Dim Tb
     
    Application.ScreenUpdating = False
    With Worksheets(1)
        Nb = .Cells(.Rows.Count, 1).End(xlUp).Row
        Tb = .Range("A2:F" & Nb)
        For i = 1 To Nb - 2
            If IsEmpty(Tb(i, 5)) Then
                If IsEmpty(Tb(i, 6)) Then
                    Op = NumOp(Tb(i, 3))
                    Client = NumClient(Tb(i, 3))
                    For j = i + 1 To Nb - 1
                        If IsEmpty(Tb(j, 6)) Then
                            If Tb(j, 1) <> "LOAD" Then
                                If Tb(j, 2) = Op And NumClient(Tb(j, 3)) = Client Then
                                    k = k + 1
                                    Tb(i, 6) = k
                                    Tb(j, 6) = k
                                    Exit For
                                End If
                            End If
                        End If
                    Next j
                End If
            End If
        Next i
        .Range("A2:F" & Nb) = Tb
        .Range("A2:F" & Nb).Sort Key1:=.Range("F2"), Order1:=xlAscending, Header:=xlNo
    End With
    MsgBox "Rapprochment terminé"
    End Sub
     
    Private Function NumOp(ByVal Str As String) As String
    Dim n As Integer
     
    n = InStr(Str, "OP")
    If n > 0 Then NumOp = Mid(Str, n + 2)
    End Function
     
    Private Function NumClient(ByVal Str As String) As String
    Dim n As Integer
     
    n = InStr(Str, "OP")
    If n > 0 Then
        NumClient = Trim(Left(Str, n - 1))
    Else
        n = InStr(Str, "APP")
        If n > 0 Then NumClient = Mid(Str, n)
    End If
    End Function

  7. #7
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Points : 110
    Points
    110
    Par défaut
    Bonsoir

    Dans votre post vous signalez

    ... le n° client est commun aux libellé des lignes LOAD et IG&UK...
    Une suggestion :

    Prévoir une colonne supplémentaire dans votre fichier qui reprendrait le < numéro de client > qui serait donc le même pour les mouvements Débits/Crédits et constituerait une clé unique ce qui permettrait facilement un rapprochement par client

    Avec ce résultat il faudrait ensuite revoir er analyser la structure de votre fichier pour trouver la méthode la plus rationnelle pour obtenir le résultat souhaité car si j'ai bien compris les n° d'opération sont différents suivant le libellé de la colonne <A> LOAD / IG&UK ?

    ___________________
    Cordialement

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonsoir,

    Merci pour votre aide!!

    pour etre plus explicite, les lignes IG&UK sont des constatations, et LOAD ce qui est réellement passé en banque. Ce qui explique que le n° client se retrouve dans le libellé de chaque opération, car nécessaire pour un rappro manuel.

    Mercatog, pourrais tu m'expliquer un peu plus le code, parce que sur le fichier joint cela ne me donne rien... du tout!

    Sogestion, effectivement le numéro client est une clé, mais le numéro d'opération aussi (qui se trouve en fin de libellé pour LOAD => la banque et en colonne B pour IG&Uk => les constatations).

    Donc éventuellement faire une clé qui reprennent les deux ?
    J'en arrive à me perdre tout seul

  9. #9
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je suis désolé, une petit coquille à la ligne 11 du code, il fallait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            If Not IsEmpty(Tb(i, 5)) Then
    Code en entier commenté (applicable à la première feuille du classeur, sinon adapte la ligne 7 avec le nom de la feuille à traiter)

    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
    Sub Rapprochement()
    Dim Nb As Long, i As Long, j As Long, k As Long
    Dim Op As String, Client As String
    Dim Tb
     
    Application.ScreenUpdating = False
    With Worksheets(1)
        'nombre de lignes utilisées sur colonne A
        Nb = .Cells(.Rows.Count, 1).End(xlUp).Row
        'On efface la colonne F
        .Range("F2:F" & Nb).ClearContents
        'On travaille avec une variable tableau (on y ajoute aussi la colonne F qui devait être vide)
        Tb = .Range("A2:F" & Nb)
        'On parcourt toutes les enregistrements du tableau Tb (hormis le drnier enregistrement)
        For i = 1 To Nb - 1
            'Si le 5ème champs (colonne E) n'est pas vide, càd Crédit
            If Not IsEmpty(Tb(i, 5)) Then
                'Si le 6ème champs (colonne F) est vide, càd non encore traitée
                If IsEmpty(Tb(i, 6)) Then
                    'On récupère à l'aide de la fonction ci-dessous le n° de l'opération dans la variable Op
                    Op = NumOp(Tb(i, 3))
                    'On récupère ensuite à l'aide de la seconde fonction ci-dessous le n° du client dans la variable Client
                    Client = NumClient(Tb(i, 3))
                    'On boucle sur les enregistrements suivants
                    For j = 1 To Nb - 1
                        'Si le 6ème champs (colonne F) est vide, càd non encore traitée
                        If IsEmpty(Tb(j, 6)) Then
                            'Si FI n'est pas LOAD
                            If Tb(j, 1) <> "LOAD" Then
                                'si on trouve le n° d'opération Op en colonne B et n° client en colonne C alors on solde
                                If Tb(j, 2) = Op And NumClient(Tb(j, 3)) = Client Then
                                    'on incrémente le compteur de compte soldés k
                                    k = k + 1
                                    'et on inscrit ce compteur respectivement dans la colonne F au niveau de la ligne i crédit et la ligne j débit
                                    Tb(i, 6) = k
                                    Tb(j, 6) = k
                                    'et on sort de la boucle
                                    Exit For
                                End If
                            End If
                        End If
                    Next j
                End If
            End If
        Next i
        'après traitement de toutes les lignes, le tableau Tb est entièrement traité au niveau du remplissage du 6ème champs par le N° de compte
        .Range("A2:F" & Nb) = Tb
        'On tri la plage
        .Range("A2:F" & Nb).Sort Key1:=.Range("F2"), Order1:=xlAscending, Header:=xlNo
    End With
    MsgBox "Rapprochment terminé"
    End Sub
     
    'Fonction qui permet d'extraire le n° de l'opération éventuelle à partir du libellé
    Private Function NumOp(ByVal Str As String) As String
    Dim n As Integer
     
    n = InStr(Str, "OP")
    If n > 0 Then NumOp = Mid(Str, n + 2)
    End Function
     
    'Fonction qui permet d'extraire le n° du client en fonction de la nature du libellé
    Private Function NumClient(ByVal Str As String) As String
    Dim n As Integer
     
    n = InStr(Str, "OP")
    If n > 0 Then
        NumClient = Trim(Left(Str, n - 1))
    Else
        n = InStr(Str, "APP")
        If n > 0 Then NumClient = Mid(Str, n)
    End If
    End Function

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Merci Mercatog, toujours aussi impressionnant !!

    Je teste sur la version original du fichier (entier) lundi et vous revient!

  11. #11
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    @Mercatog

    Merci encore de votre sens du partage du savoir, de votre reflexion et analyse d'une situation qui débouche sur une solution : un code avec en prime des commentaires


    @zealot

    Effectivement le numéro client est une clé, mais le numéro d'opération aussi
    (qui se trouve en fin de libellé pour LOAD => la banque et en colonne B pour IG&Uk => les constatations).
    Donc éventuellement faire une clé qui reprennent les deux ?
    Il faut structurer vos bases de données en fonction de vos besoins

    Vous n'avez qu' un seul compte financier ?
    Vous n'avez jamais besoin soit de la date de l'opération ou du no de l'extrait de compte ?

    Je pense q'une clé composée structurée comme suit < NoClient + Nopération : 1112#75212 > présenterait certains avantages

    CléID a reprendre sur chaque Mvt Débit/Crédit

    Allegerait l'encodage des données < Libellé > tout en conservant une bonne lisibilité
    pour IG&Uk => les constatations se limiterait a une date

    Faciliterait l'archivage ou la suppression des mouvements soldés

    Si besoin la récupération du NoClient ou Nopération se ferait très simplement par la fonction Split()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ' CleID = "1112#75212"
    '---------------------------------
     
    Sub RecupereCode(CleID As String)
     
        Dim Clit As String, OP As String
     
        Clit = Split(CleID, "#")(0)
        OP = Split(CleID, "#")(1)
     
        MsgBox Clit & " - " & OP
     
    End Sub
    _________________
    Cordialement

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Bonjour Sogestion, Mercatog,

    @Sogestion, je comprend tout à fait vos interrogations. J'ai effectivement plusieurs comptes financiers, mais je ne m'occupe pas des autres personnellement. J'y serai peut-être amené, mais pour le moment je me concentre sur ma partie... et avant de m'attaquer à l'amélioration des autres process internes, autant bien comprendre ce que je fais.

    J'ai bien pensé à une clé NoClient+NoOpération, mais le problème vient du rapprochement avec les dates d'opération dans les libellés. En effet quand j’essaie avec des "simples" formules excel (clé + rappro auto en fonction de la clé + rappro manuel pr ce qui est annulé dans le même journal IG&UK), je dois quand même rapprocher manuellement ce qui est libellé xx.xx.13 (soit les opérations prévues pour 2013 avec même numéro d'opération que pour 2012, cad des ventilations sur + de 12 mois...).

    Ce qui m'amène à la question que je souhaitais poser à Mercatog :
    Le code fonctionne parfaitement, mais ne rapproche pas ce qui concerne 2013. C'est tout à fait ce que je cherche à faire, mais je ne comprend pas comment cela se fait ?
    Qu'est ce qui fait qu'il privilégie un libellé avec par exemple 15.11.12 au lieu de 15.11.13 ?

    Seconde question :
    Il m'a rapproché
    IG&UK--l-- 76705--l-- AU 15.11.12 APP 444933--l-- 125,00
    LOAD--l-- 550--l-- APP 444933 OP76705--l-- --l-- 62,50

    Si j'ai une écriture soldée par deux ventilations: avec APP 444933-1 en libellé (dans ce cas précis par exemple), est ce que la fonction NumClient récupère quand même le bon compte client ? Peut-il rapprocher à ce moment là en fonction des montant et/ou num clients ?

  13. #13
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour Sogestion, zealot37

    Merci Albert pour les propos, c'est gentil de votre part.

    @zealot37
    Le code précédent fonctionne avec l'hypothèse décrite que je reporte ici:
    Je suppose qu'on est avec les même montants débit et crédit sur une même opération d'un même client et qu'on est avec une seule ligne par opération.
    C'est mon hypothèse (à confirmer ou infirmer)
    C'est à dire que le code proposé ne s'occupe guère des montants ni des dates.
    Il cherche chaque ligne à rapprocher par rapport au n° d'opération et au n° du client. Il fait une boucle et quand il trouve la première donnée où les n° d'opération et n° de clients concordent il fait le rapprochement sans se soucier si les montants sont égaux ou si la date est la bonne.

    Maintenant et pour avancer, il faudra analyser les possibilités sur les données avant d'attaquer le codage (qui sera en fin de compte une traduction fidèle de l'analyse faite)

  14. #14
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Février 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Février 2012
    Messages : 75
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    mais le problème vient du rapprochement avec les dates d'opération dans les libellés
    Sur base de vos différents post, j'ai toujours compris que le rapprochement devait s'effectuer sur base de 2 Critères : < NoClient et NoOpération >

    Je me permet de vous rappeler l'hypothèse de Mercatog

    Je suppose qu'on est avec les même montants débit et crédit sur une même opération d'un même client et qu'on est avec une seule ligne par opération.
    C'est mon hypothèse (à confirmer ou infirmer)
    Vous conviendrez que ce texte est précis : < sur une même opération d'un même client >

    _____________________
    Cordialement

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    J'en convient

    Effectivement l'hypothèse fonctionne dans la majorité des cas, et j'aurai du préciser dès le départ que j'ai quelques exceptions, si peu pour beaucoup de lignes que je n'y ai pas pensé:
    Je peux avoir un libellé IG&UK comportant une date pour 2013 (ex : 15.11.13) avec un montant identique à la ligne avec le libellé pour 2012 et la ligne LOAD, ou encore un NumClient avec "-1" à la fin (ex : 438726-1) avec un montant identique au NumClient sans "-1" mais différent de la ligne LOAD (ce dernier étant le somme des deux autres)

  16. #16
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Un petit fichier exemple où figure ces différents cas de figure serait le bien venu.

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Voici le fichier exemple
    A la dernière ligne apparait le NumClient avec "-1", les précédentes sont avec un libellé 2013.
    Fichiers attachés Fichiers attachés

  18. #18
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Sur une autre hypothèse:
    Solder LES lignes Crédit d'un même client et une même opération avec LA ligne débit correspondante. Les montants débit et crédit sont les mêmes.
    Le rapprochement ne tient pas compte des dates.

    Code commenté et modifié par rapport au précédent:
    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
    Option Explicit
     
    Sub RapprochementBis()
    Dim Nb As Long, i As Long, j As Long, k As Long, n As Long, p As Long, Deb As Long, Tmp As Long
    Dim OpDeb As String, OpCred As String, CliDeb As String, CliCred As String
    Dim Debit, Credit
    Dim S As Double
    Dim c As Range
     
    Application.ScreenUpdating = False
    With Worksheets(1)
        'nombre de lignes utilisées sur colonne A
        Nb = .Cells(.Rows.Count, 1).End(xlUp).Row
        If Nb > 2 Then
            'On efface la colonne F
            .Range("F2:F" & Nb).ClearContents
            'On tri le tableau sur montants crédits ensuite débit
            .Range("A2:F" & Nb).Sort Key1:=.Range("D2"), Order1:=xlDescending, Key2:=.Range("E2"), Order1:=xlDescending, Header:=xlNo
            'On cherche la première ligne Credit
            Set c = .Range("E2:E" & Nb).Find("*", LookIn:=xlValues, lookat:=xlPart)
            If Not c Is Nothing Then
                Deb = c.Row
                Set c = Nothing
                If Deb > 2 Then
                    'On travaille avec 2 variables tableaux (on y ajoute aussi la colonne F qui devait être vide)
                    Debit = .Range("A2:F" & Deb - 1)
                    Credit = .Range("A" & Deb & ":F" & Nb)
                    'On parcourt toutes les enregistrements du tableau Tb (hormis le drnier enregistrement)
                    For i = 1 To Deb - 2
                        'Si le 6ème champs (colonne F) est vide, càd non encore traitée
                        If IsEmpty(Debit(i, 6)) Then
                            'On récupère à l'aide de la fonction ci-dessous le n° de l'opération dans la variable Op
                            OpDeb = Debit(i, 2)
                            'On récupère ensuite à l'aide de la seconde fonction ci-dessous le n° du client dans la variable Client
                            CliDeb = NumClient(Debit(i, 3))
                            'On boucle sur les enregistrements suivants
                            For j = 1 To Nb - Deb + 1
                                'Si le 6ème champs (colonne F) est vide, càd non encore traitée
                                If IsEmpty(Credit(j, 6)) Then
                                    OpCred = NumOp(Credit(j, 3))
                                    CliCred = NumClient(Credit(j, 3))
                                    'si on a les mêmes clients et opérations entre credit et debit
                                    If OpDeb = OpCred And CliDeb = CliCred Then
                                        If Tmp = 0 Then Tmp = j
                                        'on cumul les crédits
                                        S = S + Credit(j, 5)
                                        'et on marque la ligne par -1 en 6ème colonne
                                        Credit(j, 6) = -1
                                        'si la valeur débit est soldée par la somme S des valeurs crédits
                                        If Abs(S - Debit(i, 4)) < 0.01 Then
                                            'on incrémente le compteur de compte soldés k
                                            k = k + 1
                                            'et on inscrit ce compteur  dans la colonne F au niveau de la ligne i debit
                                            Debit(i, 6) = k
                                            'et dans toutes les lignes n marquée par notre -1
                                            For n = Tmp To j
                                                If Credit(n, 6) = -1 Then Credit(n, 6) = k
                                            Next n
                                            'et on sort de la boucle
                                            Exit For
                                        End If
                                    End If
                                End If
                            Next j
     
                            'On supprime les indicteurs -1 au cas où on a pas trouvé de rapprochment
                            p = Application.Min(j, Nb - Deb + 1)
                            If Tmp = 0 Then Tmp = p
                            For n = Tmp To p
                                If Credit(n, 6) = -1 Then Credit(n, 6) = Empty
                            Next n
                            'on réinitialise les variables de cumul
                            S = 0
                            Tmp = 0
                        End If
                    Next i
     
                    'après traitement de toutes les lignes, les Tableaux Debit et Credit sont entièrement traités au niveau du remplissage du 6ème champs par le N° de compte
                    .Range("A2:F" & Deb - 1) = Debit
                    .Range("A" & Deb & ":F" & Nb) = Credit
                    'On tri la plage
                    .Range("A2:F" & Nb).Sort Key1:=.Range("F2"), Order1:=xlAscending, Header:=xlNo
                End If
            End If
        End If
    End With
    MsgBox "Rapprochment terminé"
    End Sub
     
    'Fonction qui permet d'extraire le n° de l'opération éventuelle à partir du libellé
    Private Function NumOp(ByVal Str As String) As String
    Dim n As Integer
     
    n = InStr(Str, "OP")
    If n > 0 Then NumOp = Mid(Str, n + 2)
    End Function
     
    'Fonction qui permet d'extraire le n° du client en fonction de la nature du libellé
    Private Function NumClient(ByVal Str As String) As String
    Dim n As Integer
    Dim Tmp As String
     
    n = InStr(Str, "OP")
    If n > 0 Then
        Tmp = Trim(Left(Str, n - 1))
        If InStr(Tmp, "-") Then Tmp = Split(Tmp, "-")(0)
        NumClient = Tmp
    Else
        n = InStr(Str, "APP")
        If n > 0 Then NumClient = Mid(Str, n)
    End If
    End Function

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2012
    Messages : 63
    Points : 39
    Points
    39
    Par défaut
    Le code fonctionne parfaitement.
    En revanche, je ne m'explique pas pourquoi, lorsqu'il y a du 2013 il prend en premier 2012 (alors qu'il me semble que dans le tri ligne18 2013 apparait avant 2012..)

    De plus, quand je rajoute un tri par la colonne C, puis par F en fin de procédure, cela permet de voir les lignes pour un même client, avec une opération différente, le meme libellé en colonne A et C et un montant identique. Est-il possible de rajouter le compteur à ces cas la ?

    Et, merci pour toute ces explications et le temps passé dessus, j’apprends beaucoup

  20. #20
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    En revanche, je ne m'explique pas pourquoi, lorsqu'il y a du 2013 il prend en premier 2012 (alors qu'il me semble que dans le tri ligne18 2013 apparait avant 2012..)
    Tu peux être plus explicite avec un exemple concret par rapport au dernier fichier?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. automatisation Rapprochement bancaire
    Par auran dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 09/05/2014, 17h48
  2. automatisation Rapprochement bancaire
    Par winnie100 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 16/03/2014, 18h03
  3. [XL-97] Rapprochement bancaire (Suite)
    Par Atos79 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/02/2013, 18h53
  4. [XL-2007] Macro pour rapprochement bancaire
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/07/2012, 16h32

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