Transformation de mon fichier *.qif bancaire sur VBA

chrislagratte Messages postés 10 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 19 août 2013 - 11 août 2013 à 16:39
 chrislagratte - 20 août 2013 à 13:43
Bonjour à tous,

Je souhaiterais aujourd'hui modifier mes fichiers importés de mon site bancaire, afin de les adapter au format demandé par les logiciels de gestions de comptes (type Money).

Voici un exemple des fichiers générés par ma banque :

D08/08/13
T17.02
M REMBOURST CB DU 070813 LEROY MERLIN QUEV
PREMBOURST CB DU 070813 LEROY MER
^

D08/08/13
T-771.63
MVIREMENT FAVEUR TIERS VR. PERMANENT LOYER xxxx/xxxx AC
PVR. PERMANENT LOYER xxxx/xxxxx
^

D08/08/13
T-57.71
MFACTURE CARTE DU 080813 CARREFOUR LORIE LORIENT CARTE
PDU 080813 CARREFOUR LORIE LORIEN

..., que j'aimerais modifier sous le format suivant :

D08/08/13
T17.02
MREMBOURST CB DU 070813
PLEROY MER
^

D08/08/13
T-771.63
MVIREMENT FAVEUR TIERS VR. PERMANENT LOYER xxxx/xxxx AC
PVR. PERMANENT LOYER xxxx/xxxxx
^

D08/08/13
T-57.71
MFACTURE CARTE DU 080813 CARREFOUR LORIE LORIENT CARTE
PCARREFOUR LORIE LORIEN

En gros, je souhaite modifier,

- pour la variable "M" : si on rencontre le champ "FACTURE CARTE" -> Suppression de la partie suivant le champ "FACTURE CARTE".
- pour la variable "M" : si on rencontre le champ "REMBOURST CB" -> Suppression de la tabulation avant REMBOURST CB + Suppression de la partie suivant "REMBOURST CB"
- pour la variable "P" : si c'est une "FACTURE CARTE" pour la variable M -> Suppression de la partie "DU xxxxxx ".
- pour la variable "P" : si on rencontre le champ "REMBOURST CB" -> Suppression de"REMBOURST CB DU xxxxxx " (On garde uniquement le libellé)

J'ai essayé de mettre en oeuvre quelques boucles et conditions, mais je n'ai jamais manipulé de chaînes de caractère durant ma formation.

Merci de votre aide, je suis à votre écoute pour des précisions.

++

12 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 août 2013 à 23:18
Salut
pas clair
- pour la variable "M" : si on rencontre le champ "FACTURE CARTE" -> Suppression de la partie suivant le champ "FACTURE CARTE".

qu'est ce la partie suivante ?

selon tes données
MFACTURE CARTE DU 080813 CARREFOUR LORIE LORIENT CARTE
PDU 080813 CARREFOUR LORIE LORIEN

je trouve MFACTURE CARTE
quelle partie suivante je dois supprimer
selon ton résultat
MFACTURE CARTE DU 080813 CARREFOUR LORIE LORIENT CARTE
PCARREFOUR LORIE LORIEN

tu as supprimé le DU 080813 de la ligne suivante

aussi tu écris
- pour la variable "P" : si c'est une "FACTURE CARTE" pour la variable M -> Suppression de la partie "DU xxxxxx ".
tu veux dire si la ligne précedente est MFACTURE CARTE

question
après MFACTURE CARTE DU
la ligne suivante tu as toujours PDU blabla
1
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:59
Salut,

En effet, il n'était pas très cohérent. En appliquant ses "consignes", je suis arrivé aux données postées en #9 et elles me semblent déjà plus "logiques"...
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
13 août 2013 à 15:48
Bonjour,

La manipulation de chaines de caractères en VBA n'est pas quelque chose de très compliqué :
- Instr(start, botte_de_foin, aiguille) recherche une chaine de caractères dans une autre (utile pour trouver la fin d'une ligne...)
- Mid$(chaine, début, longueur) extrait une partie d'une chaine
- Left$(chaine, n) extrait les n premiers caractères de la chaine
- Right$(chaine, n) extrait les n derniers caractères de la chaine
- Split(chaine, délimiteur) découpe la chaine en un tableau selon le délimiteur : si tu lui donnes "a,b,c" avec "," comme délimiteur, elle renverra les 3 premières lettres de l'alphabet dans un tableau.

Il est possible de faire ce que tu cherches sans Split() ni des manipulations de chaines compliquées. Si tu te bases sur le fait qu'un enregistrement est totalement décrit lorsque "^" est rencontré, il te suffit de remplir des variables selon la première lettre de la ligne et de t'en servir (en recréant un autre fichier, par exemple) lorsque tu trouves "^". Tu dois donc avoir une boucle qui traite chaque ligne et un If qui porte sur le premier caractère... Attention toutefois : pour éviter un mélange d'informations entre enregistrements différents, efface les infos relatives à l'enregistrement en cours après chaque traitement... ça t'évitera de laisser un bug quasi-indétectable.

Je pense que le reste n'est plus très compliqué à coder, maintenant que l'analyse est faite ;)


Si tu veux t'essayer aux regex, y'a aussi moyen de le faire comme ça, mais alors teste bien parce que ça peut te jouer de vilains tours si tu ne fais pas attention à ce que tu demandes...
0
chrislagratte Messages postés 10 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 19 août 2013
13 août 2013 à 17:10
Bonjour,

Merci beaucoup pour la réponse.
Je viens de lire ton message (plusieurs fois...!) et j'avoue seulement être un peu noyé sous la vague d'informations!

Concrètement, prenons l'exemple de :

D08/08/13
T-57.71
MFACTURE CARTE DU 080813 CARREFOUR LORIE LORIENT CARTE
PDU 080813 CARREFOUR LORIE LORIEN

Comment t'y prendrais-tu pour passer à :

D08/08/13
T-57.71
MFACTURE CARTE DU 080813 CARREFOUR LORIE LORIENT CARTE
PCARREFOUR LORIE LORIEN

?

Je te remercie d'avance pour tes réponses qui aide beaucoup le pauvre "mécano" comme moi qui ne manipule que très peu souvent l'outil VBA ! ;-)

++
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
13 août 2013 à 17:19
(Je considère que tu as déjà un squelette de programme qui remplit les variables selon les noms des champs et qui parcourt les différents enregistrements)

(Pour éviter les surprises désagréable, déclare tes variables en les typant correctement et mets un Option Explicit en tête de module)

(Je gère mes erreurs avec Goto pour simplifier le tout... On dit souvent aux débutants qu'il ne faut pas s'en servir, mais ça simplifie bien le code et ça peut parfois être plus clair quand on n'en abuse pas)


Pour ce cas plus tordu que les autres, il faut utiliser une variable qui "avancera" dans la chaine :
'(code qui sera exécuté seulement si on tombe dans le bon "scénario"... n'oublie pas les If)
pos = Instr(1, P, " ")
If pos=0 Then Goto beurk 'Err est déjà pris, donc...
pos = Instr(pos, P, " ")
If pos=0 Then Goto beurk
P = Mid$(P, pos)
'P est désormais débarrassé de "DU xxxx"
'[...]
beurk:
MsgBox "Une erreur est survenue lors du parsing du fichier .qif à la ligne n°" & numligne
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:02
Petite correction :
pos = Instr(pos+1, P, " ") 'sinon ça sera d'office 1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chrislagratte Messages postés 10 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 19 août 2013
14 août 2013 à 16:34
Re,

J'ai testé cela sur mon fichier excel, et je n'ai pas de résultat positif.

Sub BNP()

n = 50

For k = 1 To n

'(code qui sera exécuté seulement si on tombe dans le bon "scénario"... n'oublie pas les If)
pos = InStr(k, P, " ")
If pos = 0 Then GoTo beurk 'Err est déjà pris, donc...
pos = InStr(pos, P, " ")
If pos = 0 Then GoTo beurk
P = Mid$(P, pos)
'P est désormais débarrassé de "DU xxxx"

beurk:

'j'ai enlevé la Msgbox

Next k

End Sub


J'ai déclaré les variables suivantes dans un autre module :

Option Explicit

Dim k As Integer

Dim pos As Integer

Dim P As String

Dim n As Integer


Qu'en penses-tu?

++
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:21
Mauvaise idée, les variables globales...
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:16
Avant tout, il faut lire le fichier texte. Une façon plus simple que celle que j'ai proposée existe où tu lis ligne par ligne le fichier cible MAIS il faut que les lignes soient délimitées par des CrLf (deux caractères). Pour le savoir, il suffit de voir si les lignes sont séparées correctement (et pas avec un petit carré) dans Notepad... Est-ce bien le cas ?
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:22
Finalement, selon la doc', Line Input fonctionne dans les deux cas. Donc c'est avec ça qu'il faut procéder.
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:50
Bien que plus lentes, c'est plus simple à utiliser... donc on va privilégier ça.
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:20
Ton exemple ne correspond pas à tes souhaits... ça devrait être ceci :
D08/08/13
T17.02
MREMBOURST CB[tout court]
PLEROY MER
^
D08/08/13
T-771.63
MVIREMENT FAVEUR TIERS VR. PERMANENT LOYER xxxx/xxxx AC
PVR. PERMANENT LOYER xxxx/xxxxx
^
D08/08/13
T-57.71
MFACTURE CARTE[tout court]
PCARREFOUR LORIE LORIEN
^
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
14 août 2013 à 23:57
Commence donc par le plus simple : lis le fichier cible ligne par ligne via Line Input (des exemples sont dispos sur le Net), remplis les variables selon le premier caractère de celles-ci et affiche un MsgBox à chaque fin d'enregistrement (ligne qui commence par "^"). Après, tu n'auras plus à faire que de simples manipulations de chaines.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 15/08/2013 à 00:50
Pour dépanner pour l'instant
Dim liststr() As String
Dim outstr() As String

Public Sub ReadFile(path As String)
'lis le fichier
Dim sFileText As String
Dim iFileNo As Integer
Dim count As Integer
Dim line As Integer
count = 0
line = 2
iFileNo = FreeFile
Open path For Input As #iFileNo
Do While Not EOF(iFileNo)
Input #iFileNo, sFileText
 ReDim Preserve liststr(count)
 liststr(count) = sFileText
  count = count + 1
 Loop
Close #iFileNo
End Sub

Public Sub Proceed()
 Dim iter As Integer
 Dim iter1 As Integer
 Dim var() As String
 Dim flag As Boolean
 Dim word As String
 flag = False
 For iter = 0 To UBound(liststr)
    var = Split(liststr(iter), " ")
    ReDim Preserve outstr(iter)
    
    
    outstr(iter) = liststr(iter)
    If flag Then
    outstr(iter) = Replace(liststr(iter), word, "")
    flag = False
    End If
    
   If InStr(1, liststr(iter), "M REMBOURST CB") Then
        word = ""
       word = word & var(0) & var(1) & " " & var(2) & " " & var(3) & " " & var(4)
       outstr(iter) = word
   End If
   If InStr(1, liststr(iter), "MFACTURE CARTE") Then
       word = ""
       flag = True
       word = var(2) & " " & var(3)
   End If
    If InStr(1, liststr(iter), "PREMBOURST CB") Then
       word = ""
       word = "P" & var(4) & " " & var(5)
       outstr(iter) = word
    End If
    If InStr(1, liststr(iter), "PFACTURE CARTE") Then
     
     '  word = ""
    End If
   
    
 Next iter
End Sub


pas du tout sur que cela fonctionne car je suppose que
il faut que les lignes soient délimitées par des CrLf (deux caractères).
et aussi c'est du vb6 et non du vba
0
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
15 août 2013 à 11:55
Ca ne supprime pas les "DU xxxxxx"...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 août 2013 à 15:28
bien vu
ça doit aller avec ça

Private Sub Proceed()
 Dim iter As Integer
 Dim iter1 As Integer
 Dim var() As String
 Dim flag As Boolean
 Dim word As String
 flag = False
 For iter = 0 To UBound(liststr)
    var = Split(liststr(iter), " ")
    ReDim Preserve outstr(iter)
    outstr(iter) = liststr(iter)
    
    If flag Then
    outstr(iter) = "P" & Replace(liststr(iter), var(0) & " " & var(1) & " ", "")
   
    flag = False
    End If
    
   If InStr(1, liststr(iter), "M REMBOURST CB") Then
        word = ""
       word = word & var(0) & var(1) & " " & var(2)
        outstr(iter) = word
   End If
   If InStr(1, liststr(iter), "MFACTURE CARTE") Then
       word = ""
       flag = True
       word = var(0) & " " & var(1)
       outstr(iter) = word
   End If
    If InStr(1, liststr(iter), "PREMBOURST CB") Then
       word = ""
       word = "P" & var(4) & " " & var(5)
       outstr(iter) = word
    End If
    
    
 Next iter
End Sub
0
chrislagratte Messages postés 10 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 19 août 2013
Modifié par chrislagratte le 16/08/2013 à 10:43
Salut,

J'ai essayé ta dernière macro, il y a une erreur de compilation sur la ligne
 ReadFile (""d:\E2273211.qif"")


Et pour te répondre, oui je veux ensuite écrire le résultat dans un fichier *.qif

merci encore!!

++
0
chrislagratte Messages postés 10 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 19 août 2013
16 août 2013 à 10:58
C'est bon j'ai résolu le problème, des " " en trop...
Par contre le résultat n'est écrit nul part...? Je pense qu'il nous manque une partie écriture du résultat de Proceed.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
16 août 2013 à 13:46
voila en complet
il ne reste plus qu'à le tester
Dim liststr() As String
Dim outstr() As String

Private Sub ReadFile(path As String)
'lis le fichier
Dim sFileText As String
Dim iFileNo As Integer
Dim count As Integer
Dim line As Integer
count = 0
line = 2
iFileNo = FreeFile
Open path For Input As #iFileNo
Do While Not EOF(iFileNo)
Input #iFileNo, sFileText
 ReDim Preserve liststr(count)
 liststr(count) = sFileText
  count = count + 1
 Loop
Close #iFileNo
End Sub

Private Sub Proceed()
 Dim iter As Integer
 Dim iter1 As Integer
 Dim var() As String
 Dim flag As Boolean
 Dim word As String
 flag = False
 For iter = 0 To UBound(liststr)
    var = Split(liststr(iter), " ")
    ReDim Preserve outstr(iter)
    outstr(iter) = liststr(iter)
    
    If flag Then
    outstr(iter) = "P" & Replace(liststr(iter), var(0) & " " & var(1) & " ", "")
   
    flag = False
    End If
    
   If InStr(1, liststr(iter), "M REMBOURST CB") Then
        word = ""
       word = word & var(0) & var(1) & " " & var(2)
        outstr(iter) = word
   End If
   If InStr(1, liststr(iter), "MFACTURE CARTE") Then
       word = ""
       flag = True
       word = var(0) & " " & var(1)
       outstr(iter) = word
   End If
    If InStr(1, liststr(iter), "PREMBOURST CB") Then
       word = ""
       word = "P" & var(4) & " " & var(5)
       outstr(iter) = word
    End If
    
    
 Next iter
End Sub

Sub test()
ReadFile ("d:\E2273211.qif")
Proceed
'change le nom du fichier s'il faut 
WritToQif "d:\E2273211A.qif"
End Sub

Private Sub WritToQif(path As String)
 Dim iFileNo As Integer
 Dim iter As Integer
  iFileNo = FreeFile
      'open the file for writing
  Open path For Output As #iFileNo
  For iter = 0 To UBound(outstr)
    Write #iFileNo, outstr(iter)
  Next iter
  Close #iFileNo
End Sub


0
chrislagratte Messages postés 10 Date d'inscription dimanche 11 août 2013 Statut Membre Dernière intervention 19 août 2013
Modifié par chrislagratte le 15/08/2013 à 10:56
Bonjour,

Oui, tout à fait, c'est clairement ce que je souhaite obtenir comme résultat. J'ai effectivement été "un peu" brouillon dans mes explications. ghuysmans99, tu as mis au clair l'objectif de ma demande dans le lien #8! C'est exactement la mise en forme qui pourra être traitée par la suite dans le logiciel de gestion financière. J'ai testé les solutions de cs_ShayW, je n'obtiens pour le moment pas de résultat (j'ai une erreur de compilation, je vais essayer de la résoudre...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 août 2013 à 15:15
à tester


Dim liststr() As String
Dim outstr() As String

Private Sub ReadFile(path As String)
'lis le fichier
Dim sFileText As String
Dim iFileNo As Integer
Dim count As Integer
Dim line As Integer
Dim word As String
count = 0
line = 2
iFileNo = FreeFile
Open path For Input As #iFileNo
Do While Not EOF(iFileNo)
Input #iFileNo, sFileText
 ReDim Preserve liststr(count)
 p = InStr(1, sFileText, "  ")
 If p > 1 Then
   word = Mid(sFileText, p, InStrRev(sFileText, "  ", Len(sFileText)))
 
   sFileText = Replace(sFileText, word, " ")
  End If
   
 liststr(count) = sFileText
  count = count + 1
 Loop
Close #iFileNo
End Sub

Private Sub Proceed()
 Dim iter As Integer
 Dim iter1 As Integer
 
 Dim var() As String
 Dim flag1 As Boolean
 Dim flag2 As Boolean
 Dim word As String
 flag = False
 iter = 0
 
 For iter = 0 To UBound(liststr)
    var = Split(liststr(iter), " ")
    ReDim Preserve outstr(iter)
    outstr(iter) = liststr(iter)
    
    If flag1 Then
     outstr(iter) = "P" & Replace(liststr(iter), var(0) & " " & var(1) & " ", "")
      flag1 = False
    End If
    If flag2 Then
     st = "P" & Replace(liststr(iter), var(0) & " " & var(1) & " " & var(2) & " ", "")
     outstr(iter) = st
     flag2 = False
    End If
    
    
    
        If InStr(1, liststr(iter), "M REMBOURST CB") Then
          outstr(iter) = var(0) & var(1) & " " & var(2)
         End If
        
       If InStr(1, liststr(iter), "MRETRAIT DAB") Then
           outstr(iter) = var(0) & " " & var(1)
          flag1 = True
      End If
      
      If InStr(1, liststr(iter), "MPRELEVEMENT") Then
         outstr(iter) = var(0)
        End If
       
        If InStr(1, liststr(iter), "MVIREMENT RECU TIERS") Then
           outstr(iter) = var(0) & " " & var(1) & " " & var(2)
        End If
        
         If InStr(1, liststr(iter), "MVIREMENT FAVEUR TIERS") Then
           outstr(iter) = var(0) & " " & var(1) & " " & var(2)
           flag1 = True
        End If
        
         If InStr(1, liststr(iter), "MPRLV EUROPEEN") Then
           outstr(iter) = "MPRELEVEMENT"
        End If
        
         If InStr(1, liststr(iter), "MCHEQUE N°") Then
           outstr(iter) = var(0)
           flag1 = True
        End If
        
        If InStr(1, liststr(iter), "MFACTURE CARTE") Then
             flag1 = True
             outstr(iter) = var(0) & " " & var(1)
        End If
        
        If InStr(1, liststr(iter), "MVRST ESPECES") Then
           word = var(0) & " " & var(1) & " " & var(2)
           word = Replace(word, var(0), "MVERSEMENT")
           outstr(iter) = word
           flag1 = True
        End If
        
          If InStr(1, liststr(iter), "MVIR EUROPEEN") Then
            outstr(iter) = "MVIREMENT RECU TIERS"
        End If
        
        If InStr(1, liststr(iter), "PREMBOURST CB") Then
          word = "P" & var(4) & " " & var(5)
          outstr(iter) = word
        End If
  Next iter
End Sub

Sub test()
ReadFile ("d:\E2273211.qif")
Proceed
'change le nom du fichier s'il faut 
WritToQif "d:\E2273211A.qif"
End Sub

Private Sub WritToQif(path As String)
 Dim iFileNo As Integer
 Dim iter As Integer
  iFileNo = FreeFile
      'open the file for writing
  Open path For Output As #iFileNo
  For iter = 0 To UBound(outstr)
    Print #iFileNo, outstr(iter)
  Next iter
  Close #iFileNo
End Sub

0
chrislagratte
20 août 2013 à 13:43
Merci cs_ShayW pour ce code, ça fonctionne super!!!

Je vais l'essayer sur une plus grande quantité d'opérations pour vérifier, mais je pense que c'est ok!
0
Rejoignez-nous