Microsoft 365 Lettrage débit/crédit via VBA

Idriss93

XLDnaute Nouveau
Bonjour,

Je suis comptable dans une entreprise et novice en VBA.

Mon besoin et de faire un lettrage d'un compte qui contient des centaines d'opérations afin d'identifier les opérations non rapprochées.

Explication :

Si les clés de compte de (colonne E) sont identiques et que les montants au débit (colonne J) sont identiques aux montants crédit (colonne K) alors afficher OK pour ces montants à la colonne N sinon KO.

Exécuter la macro quel que soit le nombre de ligne et non pas uniquement pour les 17 lignes sur le ficher.

Je vous prie de bien vouloir m'aider en me guidant vers une méthode VBA pour lettrer ce compte.

Cordialement.

Veuillez retrouver ci-dessous le modèle de fichier
 

Pièces jointes

  • Macro VBA à traiter.xlsx
    12.2 KB · Affichages: 34
Solution
Bonjour,
Voici une macro qui doit répondre à la question.
Macro à mettre en Module1 et exécuter
Bruno
VB:
Sub myOK()
Dim i As Boolean
[N2:N65000].ClearContents
bas = [E65000].End(3).Row
For k = 2 To bas
If Cells(k, 5) <> 0 Then
cle = Cells(k, 5): m_db = Cells(k, 10)
For lig = 2 To bas
If Cells(lig, 5) = cle And Cells(lig, 11) = m_db Then
If Cells(lig, 14) = "" Then Cells(lig, 14) = "OK": Cells(k, 14) = "OK": i = True: Exit For
End If
Next
If i = False And Cells(k, 14) = "" Then Cells(k, 14) = "KO"
i = False
End If
Next
End Sub

youky(BJ)

XLDnaute Barbatruc
Bonjour,
Voici une macro qui doit répondre à la question.
Macro à mettre en Module1 et exécuter
Bruno
VB:
Sub myOK()
Dim i As Boolean
[N2:N65000].ClearContents
bas = [E65000].End(3).Row
For k = 2 To bas
If Cells(k, 5) <> 0 Then
cle = Cells(k, 5): m_db = Cells(k, 10)
For lig = 2 To bas
If Cells(lig, 5) = cle And Cells(lig, 11) = m_db Then
If Cells(lig, 14) = "" Then Cells(lig, 14) = "OK": Cells(k, 14) = "OK": i = True: Exit For
End If
Next
If i = False And Cells(k, 14) = "" Then Cells(k, 14) = "KO"
i = False
End If
Next
End Sub
 

Idriss93

XLDnaute Nouveau
Bonjour,
Voici une macro qui doit répondre à la question.
Macro à mettre en Module1 et exécuter
Bruno
VB:
Sub myOK()
Dim i As Boolean
[N2:N65000].ClearContents
bas = [E65000].End(3).Row
For k = 2 To bas
If Cells(k, 5) <> 0 Then
cle = Cells(k, 5): m_db = Cells(k, 10)
For lig = 2 To bas
If Cells(lig, 5) = cle And Cells(lig, 11) = m_db Then
If Cells(lig, 14) = "" Then Cells(lig, 14) = "OK": Cells(k, 14) = "OK": i = True: Exit For
End If
Next
If i = False And Cells(k, 14) = "" Then Cells(k, 14) = "KO"
i = False
End If
Next
End Sub
Bonjour Bruno @youky(BJ) ,
La macro fonctionne à merveille.
Merci infiniment!! Tu me sauve.
j'ai beaucoup d'admiration pour des personnes comme toi prêt à prendre de leurs temps pour rendre service.
 

youky(BJ)

XLDnaute Barbatruc
Bonsoir,
Je n'ai pas rouvert le fichier
m_db est une variable que j'ai choisit comme ca.
Il devait y avoir une colonne DB ou quelque chose comme ça
Elle peut être remplacée par n'importe quel nom (sauf code VBA)
Il y en a 2 dans mon code, j'ai mis une autre variable cle qui est sans doute plus parlant
Bruno
 

job75

XLDnaute Barbatruc
Bonjour Idriss93, Bruno,

La macro de Bruno est tout à fait correcte mais travaillant sur les cellules elle prend du temps.

Avec un tableau VBA c'est beaucoup plus rapide :
VB:
Sub myOK2()
Dim bas&, tablo, k&, cle, m_db, lig&, i As Boolean
[N2:N65000].ClearContents
bas = [E65000].End(3).Row
tablo = Range("A1:N" & bas) 'matrice, plus rapide
For k = 2 To bas
    If tablo(k, 5) <> 0 Then
        cle = tablo(k, 5): m_db = tablo(k, 10)
        For lig = 2 To bas
            If tablo(lig, 5) = cle And tablo(lig, 11) = m_db Then
                If tablo(lig, 14) = "" Then tablo(lig, 14) = "OK": tablo(k, 14) = "OK": i = True: Exit For
            End If
        Next lig
        If i = False And tablo(k, 14) = "" Then tablo(k, 14) = "KO"
        i = False
    End If
Next k
Range("N1:N" & bas) = Application.Index(tablo, , 14) 'restitution
End Sub
Pour tester j'ai copié le tableau A2:N17 sur seulement 2000 lignes, chez moi les durées d'exécution sont :

- macro de Bruno => 13,5 secondes

- cette macro => 0,4 seconde.

A+
 
Dernière édition:

Idriss93

XLDnaute Nouveau
Bonjour Idriss93, Bruno,

La macro de Bruno est tout à fait correcte mais travaillant sur les cellules elle prend du temps.

Avec un tableau VBA c'est beaucoup plus rapide :
VB:
Sub myOK2()
Dim bas&, k&, cle, m_db, lig&, i As Boolean
[N2:N65000].ClearContents
bas = [E65000].End(3).Row
tablo = Range("A1:N" & bas) 'matrice, plus rapide
For k = 2 To bas
    If tablo(k, 5) <> 0 Then
        cle = tablo(k, 5): m_db = tablo(k, 10)
        For lig = 2 To bas
            If tablo(lig, 5) = cle And tablo(lig, 11) = m_db Then
                If tablo(lig, 14) = "" Then tablo(lig, 14) = "OK": tablo(k, 14) = "OK": i = True: Exit For
            End If
        Next lig
        If i = False And tablo(k, 14) = "" Then tablo(k, 14) = "KO"
        i = False
    End If
Next k
Range("N1:N" & bas) = Application.Index(tablo, , 14) 'restitution
End Sub
Pour tester j'ai copié le tableau A2:N17 sur seulement 2000 lignes, chez moi les durées d'exécution sont :

- macro de Bruno => 13,5 secondes

- cette macro => 0,4 seconde.

A+
Bonjour @job75 ,
Merci infiniment!!
Vous êtes vraiment géniaux
 

youky(BJ)

XLDnaute Barbatruc
Bravo Gérard,(job75)
Ravi de te croiser
Une fois de plus je suis devancé avec tes tablos.
Pourtant je les utilise mais pas assez souvent et tu es vite la pour le rappeler.
Je suis sur que c'est pas la dernière fois que tu vas passer derrière moi avec un tablo.
Au prochain tablo . . .
Bruno
 

Discussions similaires

  • Résolu(e)
Microsoft 365 Lettrage
Réponses
9
Affichages
1 K
Réponses
2
Affichages
508
Réponses
10
Affichages
787

Statistiques des forums

Discussions
312 165
Messages
2 085 882
Membres
103 010
dernier inscrit
Sys974