Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Idée de macro pour transposer facilement csv bancaire ?

lolo92130

XLDnaute Nouveau
Bonjour à toutes et à tous

Ma banque me permet de télécharger en csv le fichier de type banque.png
Pour chaque transaction, tout est sur plusieurs ligne, et ca diffère selon la banque de l'emetteur et le type de transaction
J'aimerai donc trouver une astuce ou développer une macro pour avoir tout sur un format tel que celui de Banque_cible.png, où les informations seraient classées et ordonnées sur plusieurs colonnes
Auriez-vous une idée pour faire ca assez simplement ou quelles fonctions utiliser svp?

Merci pour vos conseils
 

Pièces jointes

  • Banque.png
    26.5 KB · Affichages: 38
  • Banque_cible.png
    18.1 KB · Affichages: 38

lolo92130

XLDnaute Nouveau

Bonjour et merci pour ce retour. J'utilise également Excel 2016 sur un autre PC, plus que de 365 qui est Un peu déroutant. Ok je regarderai PowerQuery, je ne connais pas. Mais si des idées autres je suis également preneur.
Et oui les PNG dans le fil sont des screenshots des CSV pour illustrer la question, les CSV sont dans le zip.
Merci !
 

Staple1600

XLDnaute Barbatruc
Re

@lolo92130
Normalement, PowerQuery est également natif sur Excel 2016

Et voici de quoi illustrer mon propos

Yapluska essayer

Ensuite on t'aidera ici pour peaufiner la chose

Mais pour le moment, rideau! Deconnexion

Demain, faut retourner au taf
 

Staple1600

XLDnaute Barbatruc
Bonsoir

Voilà ce que cela donne avec PowerQuery
Et ci-dessous les étapes suivies
(code M)
PowerQuery:
let
    Source = Csv.Document(File.Contents("C:\Users\STAPLE\Fichiers_csv\Banque.csv"),[Delimiter=";", Columns=7, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    #"En-têtes promus" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"Date", type date}, {"Nature de l'operation", type text}, {"Debit", Int64.Type}, {"Credit", Int64.Type}, {"Devise", type text}, {"Date de valeur", type date}, {"Libelle interbancaire", type text}}),
    #"Lignes filtrées" = Table.SelectRows(#"Type modifié", each ([Date de valeur] <> null)),
    #"Valeur remplacée" = Table.ReplaceValue(#"Lignes filtrées",null,0,Replacer.ReplaceValue,{"Debit", "Credit"})
in
    #"Valeur remplacée"
 

lolo92130

XLDnaute Nouveau
Bonsoir JM

Vraiment c'est top et super gentil, je vais essayer ca de suite !
J'ai passé du temps hier soir à regarder de mon côté, et en regardant cette vidéo j'avais pas mal avancé mais une fonction évoquée ne marchait pas. (la formule entrée pour créer une colonne personnalisée vers 6'30" dans la vidéo). Il était déjà bien tard , donc j'avais tout mis en pause pour reprendre ca ce soir. Merci encore !
 

zebanx

XLDnaute Accro
Bonjour lolo92130, staple1600, le forum

Problématique très intéressante car déjà c'est courant d'avoir un fichier bancaire csv/excel qui soit présenté de cette manière.
Et ensuite, dans votre exemple :
- il y a une nombre de lignes différentes entre chaque enregistrement (entre deux lignes non vides colonne A).
Les steps sont impossibles
- les rubriques sont différentes sur la colonne B.

Cela complexifie le code ce qui le rend vraiment spécial et intéressant à produire.

Donc un fichier en VBA avec les explications sur la feuille "départ".
Je précise qu'il faut travailler sur un fichier excel et non sur un csv qui ne peut contenir qu'une feuille.

Belle journée à tous
zebanx
 

Pièces jointes

  • ED_banque_transpose_steps impossibles.xlsm
    87.7 KB · Affichages: 8
Dernière édition:

lolo92130

XLDnaute Nouveau

Bonjour Zebanx, staple1600 et le forum

Vraiment c'est super sympa de proposer des solutions
En VBA ca semble bien fonctionner (merci beaucoup @zebanx !), et en Power Query l'idée semblait super intéressante pour que ca puisse être repris dans le futur si besoin, j'arrive à faire calculer le nombre de lignes sous chaque transaction avec un index et en suivant la méthode indiquée dans le vidéo youtube précédemment indiquée, mais ensuite je sèche pour classifier le contenu de chaque ligne dans une colonne (ex si c'est "De/Pour" ca doit aller en colonne C, "Motif" en colonne D, "Date" en colonne G etc.. en reprenant l'onglet "Fin" de votre fichier Zebanx.

En tout cas merci beaucoup pout toutes vos propositions, c'est vraiment super et super gentil !
 

patricktoulon

XLDnaute Barbatruc
bonjour à tous
on pourrait avoir un exemple de fichier csv ou autre?
car a ce que j'ai vu ca parait bien simple cette histoire
pour info je ne pense pas que des step soient nécéssaires
une lecture continu et linéaire suffit
 

zebanx

XLDnaute Accro
Bonjour à tous, le forum

Merci patrick de t'intéresser à ce sujet.
Je n'en suis pas l'émetteur donc on va attendre le fichier de lolo92130.
>Si ce n'est pas le cas, en partant des images, je te proposerai "mon" csv (mais qui doit être factuellement très proche) c'est à dire notamment, comme sur la première image, des sauts de lignes en colonne 2 et pas toutes les informations dans une seule cellule par opération. C'est sur ces photos que j'ai codé pour le #8.
Ton retour m'intéresse déjà au vu du commentaire que tu as publié -).

Bonne journée
zebanx
 

job75

XLDnaute Barbatruc
Bonjour lolo92130, JM, zebanx, Patrick,

Téléchargez les fichiers zippés joints dans le même dossier (le bureau).

La macro dans le fichier .xlsm traite le fichier CSV :
VB:
Sub Transpose()
Dim ajout, chemin$, x%, y%, texte$, s, a, ss, i As Variant
ajout = Array("DE", "MOTIF", "REF", "REMISE", "DATE")
chemin = ThisWorkbook.Path & "\"
x = FreeFile
Open chemin & "CSV Source.csv" For Input As #x 'ouverture en lecture séquentielle
y = FreeFile
Open chemin & "CSV transposé.csv" For Output As #y 'ouverture en écriture séquentielle
Line Input #x, texte 'saute les titres
Print #y, "Date;Nature;" & Join(ajout, ";") & ";Débit;Crédit;Devise;Date de valeur;Libellé"
While Not EOF(x)
    Line Input #x, texte
    s = Split(texte, ";")
    If s(0) <> "" Then
        If IsArray(a) Then Print #y, Join(a, ";")
        ReDim a(1 To 12)
        If IsDate(s(0)) Then a(1) = CDate(s(0))
        a(2) = s(1): a(8) = s(2): a(9) = s(3): a(10) = s(4)
        If IsDate(s(5)) Then a(11) = CDate(s(5))
        a(12) = s(6)
    ElseIf UBound(s) > 0 Then
        texte = Replace(s(1), """", "") 'ôte tous les guillemets
        ss = Split(texte, ":")
        i = Application.Match(Trim(ss(0)), ajout, 0)
        If IsNumeric(i) And UBound(ss) > 0 Then a(i + 2) = Trim(ss(1))
    End If
Wend
Print #y, Join(a, ";") 'dernière ligne
Close #x
Close #y
MsgBox "Le fichier 'CSV transposé.csv' a été créé..."
End Sub
Les guillemets sont plus gênants qu'autre chose, je les supprime carrément...

A+
 

Pièces jointes

  • Transpose.zip
    16.2 KB · Affichages: 3
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le forum,

Une autre manière de faire, plus logique et plus rapide grâce au Dictionary :
VB:
Sub Transpose()
Dim d As Object, ajout, i As Byte, chemin$, x%, texte$, concat$(), n&, s, a, ss
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
ajout = Array("DE", "MOTIF", "REF", "REMISE", "DATE")
For i = 0 To UBound(ajout): d(ajout(i)) = i + 1: Next 'repère la position
chemin = ThisWorkbook.Path & "\"
x = FreeFile
Open chemin & "CSV Source.csv" For Input As #x 'ouverture en lecture séquentielle
Line Input #x, texte 'saute les titres
ReDim concat(0)
concat(0) = "Date;Nature;" & Replace(Join(ajout, ";"), "DE", "DE/POUR") & ";Débit;Crédit;Devise;Date de valeur;Libellé" 'titres du résultat
n = 1
While Not EOF(x)
    Line Input #x, texte
    s = Split(texte, ";")
    If s(0) <> "" Then
        If IsArray(a) Then ReDim Preserve concat(n): concat(n) = Join(a, ";"): n = n + 1
        ReDim a(1 To 12)
        If IsDate(s(0)) Then a(1) = CDate(s(0))
        a(2) = s(1): a(8) = s(2): a(9) = s(3): a(10) = s(4)
        If IsDate(s(5)) Then a(11) = CDate(s(5))
        a(12) = s(6)
    ElseIf UBound(s) > 0 Then
        texte = Replace(s(1), """", "") 'ôte tous les guillemets
        ss = Split(texte, ":")
        texte = Trim(ss(0))
        If UCase(texte) = "POUR" Then texte = "DE"
        i = d(texte) 'récupère la position
        If i * UBound(ss) > 0 Then a(i + 2) = Trim(ss(1))
    End If
Wend
ReDim Preserve concat(n): concat(n) = Join(a, ";")  'dernière ligne
Close #x
x = FreeFile
Open chemin & "CSV transposé.csv" For Output As #x 'ouverture en écriture séquentielle
Print #x, Join(concat, vbLf) 'restitution avec renvois à la ligne
Close #x
MsgBox "La fichier 'CSV transposé.csv' a été créé..."
End Sub
Pour tester j'ai recopié le tableau source sur 68 000 lignes, chez moi sur Win 11 Excel 2019 :

- macro du post #12 => 0,9 seconde

- macro de ce post => 0,4 seconde

- macro de zebanx (adaptée) => 0,6 seconde.

A+
 

Pièces jointes

  • Transpose.zip
    17.7 KB · Affichages: 9

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…