Incompréhension de code VBA
Bonjour, j'ai reçu une demande pour une macro que voici :
- Chaque jour on fait une extraction depuis Quantum avec les flux à enrichir qui contient des flux bancaires sur plusieurs comptes bancaires à feuille Non posted
- Chaque compte bancaire a des règles d’enrichissement (feuille MATRICE)
- Le MACRO doit me lire tous les comptes bancaires sur lesquels j’ai des flux bancaires et appliquer toutes les règles
- Le résultat du MACRO doit être affiché dans la feuille Non posted/colonne AA
Ce a quoi j'ai produit un code VBA que voici :
Sub AppliquerRegles()
Dim wsData As Worksheet, wsMatrice As Worksheet
Dim lastRowData As Long, lastRowRules As Long
Dim i As Long, j As Long
Dim critereTrouve As Boolean
Dim nomRegle As String
Dim champ As Range, valeurMatrice As Variant, valeurData As Variant
Dim colAA As Long: colAA = 27 ' colonne AA
Dim enTetes As Range
Dim c As Range
Set wsData = ThisWorkbook.Sheets("Non-posted")
Set wsMatrice = ThisWorkbook.Sheets("Matrice posting")
lastRowData = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
lastRowRules = wsMatrice.Cells(wsMatrice.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Efface l’ancienne colonne AA
wsData.Range(wsData.Cells(2, colAA), wsData.Cells(lastRowData, colAA)).ClearContents
' Récupérer les en-têtes des champs
Set enTetes = wsMatrice.Range("B1:Z1")
' Parcours chaque ligne de données
For i = 2 To lastRowData
critereTrouve = False
' Parcours chaque règle
For j = 2 To lastRowRules
nomRegle = wsMatrice.Cells(j, 1).Value
critereTrouve = True ' On suppose que la règle correspond jusqu'à preuve du contraire
For Each champ In enTetes
If champ.Value <> "" Then
valeurMatrice = wsMatrice.Cells(j, champ.Column).Value
valeurData = wsData.Cells(i, champ.Column).Value
If valeurMatrice <> "" Then
If valeurData <> valeurMatrice Then
critereTrouve = False
Exit For
End If
End If
End If
Next champ
If critereTrouve Then
wsData.Cells(i, colAA).Value = nomRegle
Exit For ' Une seule règle appliquée par ligne
End If
Next j
If Not critereTrouve Then
wsData.Cells(i, colAA).Value = "Aucune règle appliquée"
End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Traitement terminé !"
End SubLe problème étant que lorsque je lance la macro, le fichier Excel plante et parfois lorsqu'il se lance il me donne pas le résultat attendu alors qu'il correspond a la demande qu'on m'a fournit.
Savez vous d'où peut provenir le soucis ? Si oui je veux bien avoir des explications ou corrections.
Merci à vous et bonne journée à tous !! :)
Bonjour, une fois de plus je précise que le fichier correspondant serait bien utile pour pouvoir vous aider
A+
J'aurais bien aimer vous fournir le fichier mais le problème étant qu'il y a les IBAN de plusieurs clients dans le fichier donc je sais pas comment faire pour vous éclairer un peu plus :/
Bonjour,
vous pouvez éditez votre message afin de mettre le code VBA dans la balise adéquate pour une lecture aisée s'il vous plait ?
La balise se trouve sur la barre de création du message et elle est représentée par </>.
Une fois cliqué ce bouton vous ouvre une fenêtre où il suffit de coller le code et de valider.
Pour ce qui est de votre code, indiquez nous au moins le ligne qui se met en surbrillance lorsqu'il y a une erreur de fonctionnement en cliquant sur le bouton "débogage".
@ bientôt
LouReeD
bonjour,
J'aurais bien aimer vous fournir le fichier mais le problème étant qu'il y a les IBAN de plusieurs clients dans le fichier donc je sais pas comment faire pour vous éclairer un peu plus :/
c'est simple tu mets un fichier dans lequel tu as remplacé toutes les données sensibles par des données bidon cohérentes. Tu nous demandes de l'aide, aide-nous à t'aider.
Bonjour à tous,
Oui, pour anonymiser vos données vous pouvez aussi utiliser l'outil du site : Anonymisation de données pour Excel
Pour info c'est ce petit bloc là qui doit vous poser problème :
If valeurMatrice <> "" Then
If valeurData <> valeurMatrice Then
critereTrouve = False
Exit For
End If
End IfMoi de ce que je comprends c'est que, pour chaque règle, à la moindre différence entre le tableau matrice et le tableau Data alors le critère devient Faux. Faites attention le Exit For ne s'applique qu'à la boucle la plus proche, donc en l'occurrence ici c'est la boucle sur les "enTetes".
Re bonjour, je n'ai pas réussi a uploadé le fichier car trop volumineux même en optimisant, savez vous comment je peux faire ?
Merci Saboh12617, qu'est ce que je dois changer dans le code pour que cela ne s'applique pas qu'a la boucle la plus proche mais s'applique à toute les boucles ?
Bonjour,
Pour alléger le fichier en question :
- supprimez les feuilles inutiles
- si votre tableau fait 1000 lignes, laissez-en seulement 20 (représentatives)
- si vous avez des valeurs liées aux autres feuilles, sélectionnez-less et faites copier/coller valeurs uniquement. En principe pour le code VBA on peut se passer des fonctions.
Pour quitter des boucles imbriquées, on peut utiliser un Goto pour "sortir" là où l'on veut. Je vous invite à étudier ce mini code :
Sub ExempleGoto()
Dim i As Long, j As Long
For i = 1 To 10
Debug.Print "=========== i: " & i & " ============="
For j = 1 To 10
Debug.Print "j: " & j
If i = 5 And j = 3 Then
GoTo FinDeBoucle
End If
Next j
Next i
FinDeBoucle:
Debug.Print "fin du sub"
End Sub