Explorer tableur & Recherche [.Find]

Maintenant que je possède mes deux tableaux tabSAP et tabBANK rempli du nom du fournisseur, de l'IBAN et du montant, il faut que les valeurs soit les mêmes dans les deux tableaux pour un fournisseur donné.

Oui c'est vrai qu'un tri est une option permettant de facilité la comparaison.

J'avais en tete de parcourir en lecture un des deux tableaux et pour chaque valeur, parcourir le deuxieme tableau pour savoir si elle est présente. Si les valeurs sont identiques dans les deux tableaux alors je marque dans mon word "Comparaison terminé, les fichiers sont identiques." ou dans le cas contraire : "Comparaison terminé : ERREUR, l'IBAN du fournisseurs "Entreprise1" du fichier SAP n'est pas egal a celui du fichier Banque. "

Il faut prendre en comtpe que les informations disposés dans les deux fichiers sont sensés etre égales.

Contexte :

MonEntreprise envoie un recapitulatif(doc_exemple2) des transactions à effectuer à la banque. La banque crée un nouveau fichier en prenant soin de garder seulement les transactions à faires(ils supprimes les "Aucun reglement") puis nous renvoie le nouveau document.

Le but de mon programme est de dire si oui ou non les valeurs on été modifier entre l'envoie et la reception à la compta.

Bonjour,

Si je comprends bien, le SAP est ce qui est transmis à la banque et le BANK le retour des opérations effectuées...

Désolé, pas eu le temps de me repencher sur la confection d'un tableau de comparaison. J'évite les questions réclamant une attention un peu soutenue dans mes périodes "médicalisées". Dès que j'ai les idées assez claires je m'y emploierai.

Cordialement.

Bonjour,

Merci beaucoup, te souhaitant un prompt rétablissement ...

Cordialement,

Merci,

Rien de très préoccupant, traitement récurrent à caractère qui reste préventif, ça perturbe les activités du fait que je dois boire beaucoup au moins les deux jours qui suivent (et il faut bien que l'eau entrée ressorte ... contexte peu favorable pour une réflexion structurée et suivie).

A+

Bonjour,

Petit complément : j'ai procédé à un tri par fournisseurs des tableaux SAP et BANK (ça pas de difficulté). J'ai aussi introduit une gestion d'erreur pour le montant SAP : en cas de montant non trouvé, appel à une fonction qui le recherche en partant de la fin de la ligne et le renvoie si elle le trouve, sinon renvoie "non détecté".

Function MontantSAP(tx As String)
    Dim mt, i%
    mt = Split(tx)
    For i = UBound(mt) To 0 Step -1
        If mt(i) <> "" Then
            If IsNumeric(Left(mt(i), 1)) Then
                MontantSAP = Val(mt(i)): Exit Function
            End If
        End If
    Next i
    MontantSAP = "non détecté"
End Function

Sub Tableaux()
    Dim tabBANK(), tabIG(2), tabSAP(), temp, dL%, i%, j%, k%, frs%
    'Tableau BANK
    With Workbooks.Open("C:\Users\[.....]\Documents\ComparateurSOX\" & "doc_exemple1.xlsx").Worksheets(1)
        dL = .Range("A" & .Rows.Count).End(xlUp).Row
        ReDim tabBANK(dL - 13, 2)
        tabIG(0) = "Nombre d'opérations banque : " & dL - 12
        tabIG(1) = "Numero de reference : " & Mid(.Range("A3"), 7, 7)
        tabIG(2) = .Range("B8").Value2
        For i = 13 To dL
            tabBANK(i - 13, 0) = .Range("A" & i)
            tabBANK(i - 13, 1) = Replace(.Range("C" & i), " ", "")
            tabBANK(i - 13, 2) = .Range("D" & i)
        Next i
    End With
    'Tri BANK
    For i = 0 To UBound(tabBANK, 1) - 1
        For j = i + 1 To UBound(tabBANK, 1)
            If tabBANK(j) < tabBANK(i) Then
                temp = Array(tabBANK(j, 0), tabBANK(j, 1), tabBANK(j, 2))
                For k = 0 To 2
                    tabBANK(j, k) = tabBANK(i, k): tabBANK(i, k) = temp(k)
                Next k
            End If
        Next j
    Next i
    'Tableau SAP
    Workbooks.OpenText "C:\Users\[....]\Documents\ComparateurSOX\propo.txt"
    With ActiveWorkbook.Worksheets(1)
        dL = .Range("A" & .Rows.Count).End(xlUp).Row
        For i = 1 To dL
            If .Cells(i, 1) Like "*Fournisseur*" Then
                If .Cells(i + 7, 1) Like "*Virement*" Then
                    ReDim Preserve tabSAP(2, frs)
                    temp = Split(.Cells(i + 1, 1), "|"): tabSAP(0, frs) = Trim(temp(1))
                    temp = Split(.Cells(i + 3, 1), "|"): tabSAP(1, frs) = Trim(Replace(temp(3), "IBAN:", ""))
                    On Error Resume Next
                    temp = Split(.Cells(i + 7, 1), ",")
                    If Err.Number = 0 Then
                        tabSAP(2, frs) = Val(temp(1))
                    Else
                        tabSAP(2, frs) = MontantSAP(.Cells(i + 7, 1))
                        Err.Clear
                    End If
                    On Error GoTo 0
                    frs = frs + 1: i = i + 7
                End If
            End If
        Next i
    End With
    'Tri SAP
    For i = 0 To UBound(tabSAP, 2) - 1
        For j = i + 1 To UBound(tabSAP, 2)
            If tabSAP(0, j) < tabSAP(0, i) Then
                temp = Array(tabSAP(0, j), tabSAP(1, j), tabSAP(2, j))
                For k = 0 To 2
                    tabSAP(k, j) = tabSAP(k, i): tabSAP(k, i) = temp(k)
                Next k
            End If
        Next j
    Next i
    'Comparaison SAP-BANK

Pour la comparaison à suivre, je suis un peu dans le brouillard... Ton exemple de fichier texte répétait un même fournisseur...

Donc, dans une liste SAP, est-ce qu'un fournisseur ne peut apparaître qu'une fois, ou plusieurs fois avec plusieurs transactions ?

Cordialement.

Non les fournisseurs n'apparaissent qu'une seul fois, sauf si c'est une filliale portant le meme nom mais dans tout les cas les coordonnées bancaires ne seront pas les mêmes.

Par rapport au Tri BANK, j'ai une petite erreur d'execution :

    'Tri BANK
    For i = 0 To UBound(tabBANK, 1) - 1
        For j = i + 1 To UBound(tabBANK, 1)
            If tabBANK(j) < tabBANK(i) Then '=L'indice n'appartient pas a la selection (concernant tabBANK)
                temp = Array(tabBANK(j, 0), tabBANK(j, 1), tabBANK(j, 2))
                For k = 0 To 2
                    tabBANK(j, k) = tabBANK(i, k): tabBANK(i, k) = temp(k)
                Next k
            End If
        Next j
    Next i

J'ai beaucoup de mal a analyser et corriger les erreurs ..

Curieux !

Je ne vois pas de possibilité d'erreur d'indice : les bornes sont cadrées sur les indices existants (UBound)...

Quelle ligne est surlignée en erreur ? Et quelle sont les valeurs de i et j (et k éventuellement) lors de l'erreur ?

les fournisseurs n'apparaissent qu'une seul fois, sauf si c'est une filliale portant le meme nom mais dans tout les cas les coordonnées bancaires ne seront pas les mêmes.

Ce qui laisse penser qu'il vaudrait mieux identifier sur l'IBAN plutôt que le nom fournisseur ?

Voici la ligne suligné :

If tabBANK(j) < tabBANK(i) Then

selon VB, j = 1 et i = 0 et k = 0 lors de l'erreur

    For i = 0 To UBound(tabBANK, 1) - 1
        For j = i + 1 To UBound(tabBANK, 1)
            If tabBANK(j) < tabBANK(i) Then
                temp = Array(tabBANK(j, 0), tabBANK(j, 1), tabBANK(j, 2))
                For k = 0 To 2
                    tabBANK(j, k) = tabBANK(i, k): tabBANK(i, k) = temp(k)
                Next k
            End If
        Next j
    Next i

par contre dans le code si dessus, j'ai surligné "temp" car il apparait en "incompatibilité de type"

Oui, l'IBAN est une source sûre

veux-tu la totalité de mon code actuel pour voir une éventuelle erreur de ma part ?

En effet ! C'est alors que le tableau ne contient qu'un élément, l'élément 0...

Je mettrais condition pour ne pas trier si rien à trier !!

L'erreur sur temp est liée : temp recueille l'élément à permuter juste avant, si cet élément n'est pas défini, ce n'est plus un tableau.

je cogite dessus depuis un moment, ca a pas l'air bien compliqué mais j'ai dû mal a comprendre malgré tout, peut tu m'expliquer ton code de tri ?

La méthode de tri est simple : une double-boucle, l'externe parcourt les éléments du premier à l'avant-dernier, l'interne permet de comparer chacun des précédents à tous les éléments qui suivent (par un parcours de l'élément suivant celui repéré par la boucle externe jusqu'au dernier). La comparaison teste si les deux éléments comparés sont ou non dans le bon ordre (voulu pour le tri). S'ils ne le sont pas on switche, soit on intervertit leur position. Si on trie en ordre croissant, du plus petit au plus grand, à la fin du premier de la boucle externe, le plus petit élément se trouvera à la première place, à la fin du second tour, le second plus petit élément se trouvera à la seconde place, etc. Chaque élément monte successivement à sa place, ce pourquoi on appelle cette méthode tri à bulles...

Cordialement.

    'Tri BANK
    For i = 0 To UBound(tabBANK, 1) - 1
        For j = i + 1 To UBound(tabBANK, 1)
                If i = 0 Or j = 0 Then
                  i = i + 1
                  j = j + 1
            If tabBANK(j) < tabBANK(i) Then
                temp = Array(tabBANK(j, 0), tabBANK(j, 1), tabBANK(j, 2))
                For k = 0 To 2
                    tabBANK(j, k) = tabBANK(i, k): tabBANK(i, k) = temp(k)
                Next k
                End If
            End If
        Next j
    Next i

J'ai surligné la condition que j'ai ajouté mais je ne sais pas ou la placer ... (si toute fois elle est juste .. j'en doute fort car l'erreur d'indice perciste)

Rechercher des sujets similaires à "explorer tableur recherche find"