Rapprochement automatique

Bonjour à tous et toutes,

Je viens vers vous car je suis bloqué sur un sujet et je n'arrive pas à trouver de solution à celui-ci.

Je voudrais que la macro fasse le rapprochement entre deux onglets grâce à plusieurs critères (colonnes surlignées en jaune pour chacun des onglets) :

- le code du centre

- la date de l'écriture

- le montant

J'ai donc pensé à faire des =SI concaténés mais l'affiche des informations souhaitées sont un problème pour moi avec le peu d'expérience que j'ai en VBA.

Une fois le rapprochement fait que certaines informations concernant celui-ci apparaissent dans des colonnes prédéfinies (en-tête bleu ciel) comme le n° de la ligne correspondante de l'autre onglet, la date et le montant.

Par exemple ci les données ci-dessous de l'onglet "Source" (1ere image) sont trouvées dans l'onglet "Banque" (2nd image) en ligne 30, j'aimerais avoir dans l'onglet "Source" le numéro de ligne où les données ont été retrouvé (ici la ligne 30)

image image

Dans l'onglet "Banque" il est possible que plusieurs montants identique apparaissent, comme dans la seconde image, mais c'est bien la première ligne à prendre en compte, les autres lignes ne sont pas nécessaires.

Vous trouverez ci-joint le fichier pour que mes explications soient plus claires, n'hésitez pas si vous avez des questions.

Je m'excuse par avance si les codes que vous verrez ne sont pas optimisés car je ne suis pas maître en la matière concernant le VBA.

Merci pour votre aide ou votre orientation concernant mon problème.

12macro-rappro.xlsm (284.43 Ko)

Hello,

A tester :

Sub Rapprochement()

    Dim varSource As Variant, varBanque As Variant
    Dim i As Long, j As Long, x As Long
    Dim strKeys As String

    varSource = Worksheets("Source").[A1].CurrentRegion
    varBanque = Worksheets("Banque").[A1].CurrentRegion

    Worksheets("Source").[j2:l10000].ClearContents
    Worksheets("Banque").[q2:s10000].ClearContents

    x = 2
    For i = (LBound(varSource) + 1) To UBound(varSource)
        strKeys = varSource(i, 1) & varSource(i, 2) & VBA.Abs(varSource(i, 4))
        For j = (LBound(varBanque) + 1) To UBound(varBanque)
            If varBanque(j, 1) & varBanque(j, 11) & VBA.Abs(varBanque(j, 12)) = strKeys Then
                Worksheets("Source").Range("j" & x) = j
                Worksheets("Source").Range("k" & x) = varSource(i, 2)
                Worksheets("Source").Range("l" & x) = varSource(i, 4)
                Worksheets("Banque").Range("q" & x) = i
                Worksheets("Banque").Range("r" & x) = varBanque(j, 11)
                Worksheets("Banque").Range("s" & x) = varBanque(j, 12)
                x = x + 1
                Exit For
            End If
        Next j
    Next i
    MsgBox "fin"
End Sub

Bonjour à toi Rag02700,

Tout d'abord merci de t'être penché sur mon sujet.

Cela fonctionne parfaitement mais je voudrais savoir s'il y a encore moyen d'améliorer les résultats affichés.
En effet comme tu le vois dans les deux images on trouve une correspondance pour ces deux montants, même date et même centre. Par contre le résultat est affiché sur la deuxième ligne de chacun des onglets.

Penses-tu que l'on peut afficher le résultat sur les lignes correspondantes, c'est-à-dire que sur l'onglet "Source" (1ère image) en ligne 241 je retrouve le résultat de l'onglet "Banque" et que sur l'onglet "Banque" (2nd image) en ligne 12 je retrouve le résultat de l'onglet "Source" ?

image image

Encore merci et en espérant qu'une solution est envisageable pour mon second problème.

Bonne journée

Hello,

Si j'ai bien compris ce que tu veux :

Sub Rapprochement()

    Dim varSource As Variant, varBanque As Variant
    Dim i As Long, j As Long, x As Long
    Dim strKeys As String

    varSource = Worksheets("Source").[A1].CurrentRegion
    varBanque = Worksheets("Banque").[A1].CurrentRegion

    Worksheets("Source").[j2:l10000].ClearContents
    Worksheets("Banque").[q2:s10000].ClearContents

    x = 2
    For i = (LBound(varSource) + 1) To UBound(varSource)
        strKeys = varSource(i, 1) & varSource(i, 2) & VBA.Abs(varSource(i, 4))
        For j = (LBound(varBanque) + 1) To UBound(varBanque)
            If varBanque(j, 1) & varBanque(j, 11) & VBA.Abs(varBanque(j, 12)) = strKeys Then
                Worksheets("Source").Range("j" & x) = j
                Worksheets("Source").Range("k" & x) = varBanque(j, 11)
                Worksheets("Source").Range("l" & x) = varBanque(j, 12)
                Worksheets("Banque").Range("q" & x) = i
                Worksheets("Banque").Range("r" & x) = varSource(i, 2)
                Worksheets("Banque").Range("s" & x) = varSource(i, 4)
                x = x + 1
                Exit For
            End If
        Next j
    Next i
    MsgBox "fin"
End Sub

Rag02700,

Je n'ai pas du m'exprimer assez clairement. Pour essayer de me faire comprendre plus facilement je joints deux captures écrans du résultats que je souhaiterais.

Dans le premier onglet en ligne 254 je retrouve la correspondance du numéro de ligne du second onglet, la date et le montant et inversement pour la seconde image.

image image

J'espère avoir été un peu plus clair dans mes explications cette fois-ci.

Tu veux mettre le résultat directement à coté des colonnes jaunes et laissé tomber les colonnes bleues ?

Dsl j'arrive pas bien à te suivre

Bonjour Rag02700,

Désolé de ma réponse tardive.

J'ai fait deux autres captures d'écrans en essayant d'être plus clair sur ceux-ci. Ne tiens pas compte des résultats j'ai fait en sorte que ceux-ci soient parlant mais ils ne sont pas juste, c'est juste pour avoir l'idée du résultat souhaitait.

Dans l'onglet "Banque" (1ère image), en ligne 13 j'ai un résultat qui me renvoie la ligne 14 de l'onglet "Source" ainsi que la date et le montant correspondant. Et quand tu regardes l'onglet "Source" (2nd image) en ligne 14 j'ai le résultat de la ligne 13 de l'onglet "Banque" qui ressort avec les données car correspondance entre les lignes des deux onglets sur les critères dont nous avons parlé au début (centre, date, montant).

Pareil pour la ligne 26 de l'onglet "Banque" et ligne 55 pour l'onglet "source" ainsi de suite et s'il n'y a pas de correspondance alors aucune info sur la ligne.

image image

J'espère que je suis plus clair et plus facile à suivre ce coup-ci.

Hello,

Comme ceci :

Sub Rapprochement()

    Dim varSource As Variant, varBanque As Variant
    Dim i As Long, j As Long
    Dim strKeys As String

    varSource = Worksheets("Source").[A1].CurrentRegion
    varBanque = Worksheets("Banque").[A1].CurrentRegion

    Worksheets("Source").[j2:l10000].ClearContents
    Worksheets("Banque").[q2:s10000].ClearContents

    For i = (LBound(varSource) + 1) To UBound(varSource)
        strKeys = varSource(i, 1) & varSource(i, 2) & VBA.Abs(varSource(i, 4))
        For j = (LBound(varBanque) + 1) To UBound(varBanque)
            If varBanque(j, 1) & varBanque(j, 11) & VBA.Abs(varBanque(j, 12)) = strKeys Then
                Worksheets("Source").Range("j" & i) = j
                Worksheets("Source").Range("k" & i) = varSource(i, 2)
                Worksheets("Source").Range("l" & i) = varSource(i, 4)
                Worksheets("Banque").Range("q" & j) = i
                Worksheets("Banque").Range("r" & j) = varBanque(j, 11)
                Worksheets("Banque").Range("s" & j) = varBanque(j, 12)
                Exit For
            End If
        Next j
    Next i
    MsgBox "fin"
End Sub

Bonjour Rag02700,

Merci beaucoup c'est parfait comme ça, c'est bon j'ai réussi à me faire comprendre.

Désolé pour mes mauvaises explications au départ.

J'ai juste une question pour finir, peux-tu m'expliquer ce bout de code je ne l'ai jamais vu auparavant ?

VBA.Abs(varSource(i,4))

Encore merci pour ton aide et le temps que tu y as consacré.

Cordialement,

Hello,

Abs => retourne la valeur absolue d'un nombre

VBA. => est la bibliothèque que j'utilise, car j'utilise un tableau et donc la fonction Excel ABS ne peut pas être utilisée. Je spécifie la bibliothèque que j'utilise.

++

Rechercher des sujets similaires à "rapprochement automatique"