Macro qui ne fonctionne plus depuis MàJ

Bonjour à tous,

J'ai créé une macro qui me permet d'importer un fichier banque au format csv de mon dossier téléchargement vers mon fichier excel, de le "nettoyer", l'organiser, qu'il soit exploitable dans le tableau de destination.

Cette macro fonctionnait jusqu'à la mise à jour que j'ai faite, je pense.

Depuis j'ai une erreur d'exécution 1004

capture d ecran 2023 09 08 a 09 38 04

avec un problème à la ligne:

.Refresh BackgroundQuery:=False

si j'outre passe, un nouveau problème survient à la ligne:

Range("H" & lig).Value = Range("h" & lig).Value & " " & Range("B" & i).Value

Puis, là aussi, si je rend la ligne muette, un dernier problème survient à la ligne:

Selection.SpecialCells(xlCellTypeBlanks).Select

Après vérification, le chemin vers le fichier texte est correct

/Users/jeremie/Downloads/0036700027000854.csv

Quelqu'un aurait-il une idée du problème?

Par avance merci

' Import Fichier CSV
Application.CutCopyMode = False
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;/Users/jeremie/Downloads/0036700027000854.csv", Destination:=Range( _
"$A$1"))
.Name = "0036700027000854"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.RefreshPeriod = False
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 8
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

' Traitement
Dim i As Long, lig As Long
For i = 1 To Range("B" & Rows.Count).End(xlUp).Row
If Range("A" & i).Value <> "" Then
lig = i
Range("H" & lig).Value = Range("B" & i).Value
Else
Range("H" & lig).Value = Range("h" & lig).Value & " " & Range("B" & i).Value
End If
Next

' Suppression Colonne B
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select

' Suppression Ligne Vide
Columns("A:A").Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.EntireRow.Delete
Range("A1").Select

' Mise à Jour JPrix
Columns("B:C").Select
Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:= _
xlReplaceFormula2
Selection.NumberFormat = "#,##0.00 $"
Range("A1").Select
End Sub

Edit modo : code à mettre entre balises avec le bouton </> merci d'y faire attention la prochaine fois

Bonjour

- avez-vous essayé en désactivant cette ligne à problème
- avez-vous fait ce code avec votre MAC ou avec excel windows ?

Crdlt

Bonjour et merci pour votre intérêt.

Oui j'ai essayé en désactivant la ligne, du coup j'arrive sur une autre erreur, comme mentionné dans mon premier message.

J'utilise Excel sur Mac.

re

J'utilise Excel sur Mac.

Oui j'ai vu

Pas facile là...

Est-ce possible de voir le fichier (sans données confidentielles) que vous avez une fois l'import effectué et ce, de manière à ce que j'analyse les lignes après importation ?


Edit : à partir de la mention Traitement, essayez votre code comme ceci

' Traitement
Dim i As Long, lig As Long
For i = 1 To Range("B" & Rows.Count).End(xlUp).Row
    lig = i
    If Range("A" & i).Value <> vbNullString Then
        Range("H" & lig).Value = Range("B" & i).Value
    Else
        Range("H" & lig).Value = Range("h" & lig).Value & " " & Range("B" & i).Value
    End If
Next i

' Suppression Colonne B
Columns("B:B").Delete

' Suppression Ligne Vide
Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

' Mise à Jour JPrix
With Columns("B:C")
    .Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:=xlReplaceFormula2
    .NumberFormat = "#,##0.00 $"
End With
Range("A1").Select
End Sub

Si ok avec ce que je propose, pensez à

Crdlt

Alors j'ai rendu la ligne muette

'.Refresh BackgroundQuery:=False

Du coup, avec vos modifications plus d'erreurs mais je n'ai aucunes entrées qui apparait dans mon tableau.

Edit: Je vous joint un extrait du fichier à importé, modifié

Ok mais votre fichier n'est pas fait avec excel ....
c'est numbers non ?

C'est un fichier téléchargé depuis ma banque au format csv.

Je l'ai ouvert avec numbers pour le modifier et vous l'envoyer mais je réalise que c'est une erreur et que j'aurais dû vous envoyer le fichier csv d'origine.

Pardon pour la négligence et pour la perte de temps, je répare mon erreur de ce pas

EDIT: ci-joint le fichier csv modifié

Pour l'importation vous avez fait votre code avec l'enregistreur automatique d'excel et avec le MAC ?

Ensuite comment obtenez vous les données en colonne B car le code envoie tout en colonne A

Le code avait été créé sous excel mac en m'inspirant de macros trouvé par-ci par-là.

Le but est d'obtenir le fichier joint (obtenu lorsque la macro fonctionnait )

Dans le fichier csv, certaines opérations apparaissent sur plusieurs lignes il fallait donc réunir pour que chaque opération soit sur une ligne.

capture d ecran 2023 09 08 a 19 03 22

Re

Le code avait été créé sous excel mac en m'inspirant de macros trouvé par-ci par-là.

Ok mais la meilleure façon pour ce genre de d'importation c'est utiliser l'enregistreur automatique d'excel et après vous arrangez le code.
Ce qui serait intéressant c'est de voir ce que le code importation met sur votre feuille (donc avant traitement)

Je vous conseille d'ailleurs de diviser le code en deux parties.
Refaites le test sur ce code :

Sub test()
With ActiveSheet
    .Cells.Delete
    With .QueryTables.Add(Connection:= _
            "TEXT;/Users/jeremie/Downloads/0036700027000854.csv", Destination:=Range("$A$1"))
        .Name = "0036700027000854"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .RefreshPeriod = False
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 8
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End With
End Sub

Attention à ce que la ligne Name contienne bien le bon du fichier CSV ici --> 0036700027000854

Si cela ne fonctionne pas utilisez l'enregistreur automatique d'excel pour regénérer le code.

Bonjour Dan,

Le dernier code fonctionne, l'import du fichier a bien lieu .

Du coup, est-il possible d'aller plus loin et de réparer les autres étapes du code pour que cela fonctionne comme avant ?

Par avance merci

EDIT:

Heuuuuu...... je viens de retester mon code sur le fichier d'origine, après avoir testé votre code sur un fichier copie, et cela a fonctionné à nouveau

Je comprends pas trop là, je reteste cela cet après midi pour essayer de comprendre.

Bonjour

Heuuuuu...... je viens de retester mon code sur le fichier d'origine, après avoir testé votre code sur un fichier copie, et cela a fonctionné à nouveau

Je pense que lorsque vous exécutez votre code, excel crèè un lien avec votre fichier Csv et le conserve. Donc lorsque vous relancez le code il vaut mieux effacer toute votre feuille avant de réimporter les données. Ce que je fais avec la ligne "....delete"

Réessayez avec ce code dans lequel, on évite de mettre le répertoire user/jeremie...

Sub test()
Dim fichier

fichier = Application.GetOpenFilename

With ActiveSheet
    .Cells.Delete
    With .QueryTables.Add(Connection:= _
            "TEXT;" & fichier, Destination:=Range("$A$1"))
        .Name = "0036700027000854"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .RefreshPeriod = False
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 8
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End With
End Sub

Une fois fait, ce serait intéressant de me montrer la feuille avec vos données
On pourrait appeler le code pour mettre en forme depuis ce code

Cordialement

Bonjour Dan

Je ne sais pas si j'ai été clair mais c'est bien mon ancien code qui fonctionne à nouveau. Je pense que c'est l'utilisation de votre code test qui a débridé quelque chose.

J'ai pour habitude de bien effacer les lignes importées avant une nouvelle importation, je supprime aussi la ligne nouvellement créée dans le gestionnaire de noms, après chaque importation, sinon j'ai des problèmes lorsque je veux sauvegarder du fichier.

Cependant mon code est certainement très approximatif et ne peut-être qu'amélioré votre aide est donc toujours la bienvenue .

Ci-joint le csv et la feuille avec mes données (si c'est bien cela que vous me demandiez).

10classeur1.xlsm (18.78 Ko)

Bonjour

En tenant compte de la vue dans votre post --> https://forum.excel-pratique.com/s/goto/1159813 et de votre dernier post au sujet du gestionnaire de noms voici les 2 codes à placer dans votre fichier.

1. Importation des données

Sub Importer()
Dim fichier
Dim nm

With ActiveSheet
    .Cells.Delete 'vider feuille
    For Each nm In ThisWorkbook.Names 'supprimer noms dans gestionnaire de noms
        nm.Delete
    Next nm

    fichier = Application.GetOpenFilename 'choix fichier

    With .QueryTables.Add(Connection:= _
            "TEXT;" & fichier, Destination:=Range("$A$1"))
        .Name = "0036700027000854"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .RefreshPeriod = False
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 65001
        .TextFileStartRow = 8
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = True
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End With
Call traitement
End Sub

2. Traitement des données

Sub traitement()
Dim i As Integer, lig As Integer

With ActiveSheet
    'Traitement
    For i = 1 To .Range("B" & Rows.Count).End(xlUp).Row
        If .Range("A" & i).Value <> vbNullString Then
            lig = i
            .Range("H" & lig).Value = .Range("B" & i).Value
        Else
            .Range("H" & lig).Value = .Range("h" & lig).Value & " " & .Range("B" & i).Value
        End If
    Next i

    ' Suppression Colonne B
    .Columns("B:B").Delete

    ' Suppression Lignes Vides
    .Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

    ' Mise à Jour JPrix
    With .Columns("B:C")
        '.Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:=xlReplaceFormula2
        .NumberFormat = "#,##0.00 $"
    End With

    'Titres
    .Rows("1:1").Insert Shift:=xlDown
    .Cells(1, 1) = "Date"
    .Cells(1, 2) = "Debit"
    .Cells(1, 3) = "Crédit"
    .Cells(1, 4) = "Devise"
    .Cells(1, 5) = "Date Valeur"
    .Cells(1, 6) = "Libellé interbancaire"
    .Cells(1, 7) = "Nature opération recalculé"
End With
End Sub

Faites un test

REM : Pense à préciser votre version excel à jour dans le profil de compte (MAC 2004, MAC 2011, MAC 2016 ???

Si ok et terminé pensez à

Cordialement

Bonjour Dan,

Ça fonctionne plutôt bien tout cela

Dernières petites choses et je pense que cela sera parfait.

Si j'affecte la macro "traitement" à un bouton, il ne se passe rien, pourtant tout se déroule bien lorsque je lance la macro via le VBA,

Est-il possible de fusionner "traitement" et "importer" pour n'en faire qu'une ?

Aussi, le fichier csv que j'importe depuis la banque aura toujours le nom 0036700027000854 et sera toujours dans le même dossier.

(En réalité il y a 3 csv différents qui correspondent à un compte différents mais chacun aura toujours le même numéro et sera toujours dans le même dossier)

Si je remplace "TEXT;" & fichier par "TEXT;/Users/jeremie/Downloads/0036700027000854.csv" il ne m'importe pas le fichier directement, il y a une étape en plus dans laquelle je dois choisir le fichier et son emplacement.

Est-il possible, lorsque je clique sur un bouton, que la macro importe directement le fichier 0036700027000854.csv de mon dossier téléchargements?

Enfin, cette ligne de code ne risque t'elle pas de supprimer toutes les lignes du gestionnaires de noms ?

For Each nm In ThisWorkbook.Names 'supprimer noms dans gestionnaire de noms

J'ai des lignes dans ce gestionnaire qui ne doivent pas être supprimées.

L'idéal serait de supprimer la ligne, dans le gestionnaire de noms, créé par l'import alors que là, elle supprime la ligne de l'import précédent, je sais pas si je suis clair

EDIT: pour la dernière demande, j'ai essayé en plaçant cette partie du code

For Each nm In ThisWorkbook.Names 'supprimer noms dans gestionnaire de noms
nm.Delete
Next nm

après Call traitement ça fonctionne mais je sais pas si c'est judicieux...

Si c'est le cas cela efface toutes les lignes du gestionnaires de noms, même celles que je ne veux pas effacer ?

Re

Si j'affecte la macro "traitement" à un bouton, il ne se passe rien, pourtant tout se déroule bien lorsque je lance la macro via le VBA,

Bah si mais vous devez enlever ou désactiver l'instruction "Call Traitement" dans la première macro


Est-il possible de fusionner "traitement" et "importer" pour n'en faire qu'une ?

Oui c'est possible mais je ne vous le conseille pas. Il vaut mieux avoir deux petites macros plutot qu'une grande. C'est plus facile à lire et à adapter si besoin.

Si vous voulez tout de même et si les deux macros se suivent et sont l'une en dessous de l'autre, il suffit d'enlever :
- 1er code Importer : les deux dernières lignes --> "call traitement" et "end sub"
- 2ieme code Traitement : la ligne "Sub traitement()"

Si je remplace "TEXT;" & fichier par "TEXT;/Users/jeremie/Downloads/0036700027000854.csv" il ne m'importe pas le fichier directement, il y a une étape en plus dans laquelle je dois choisir le fichier et son emplacement.

Est-il possible, lorsque je clique sur un bouton, que la macro importe directement le fichier 0036700027000854.csv de mon dossier téléchargements?


Dans le code importer, :
1. remplacez:

With .QueryTables.Add(Connection:= "TEXT;" & fichier, Destination:=Range("$A$1"))

par ceci

With .QueryTables.Add(Connection:= "TEXT;/Users/jeremie/Downloads/0036700027000854.csv", Destination:=.Range("$A$1"))


2. désactivez
la ligne --> fichier = application....


For Each nm In ThisWorkbook.Names 'supprimer noms dans gestionnaire de noms

Je vous ai mis cette instruction au début à cause de votre bug sur la ligne Refresh......
Cela permettait de repartir avec une feuille vierge car comme dit précédemment je pense qu'excel garde quelque chose en mémoire lors de l'importation qui fait buguer lorsque vous relancez l'opération
Si vous la mettez après le "call traitement" cela ne va pas aller car vous allez effacer tous les noms
Faites comme ceci :

Dans le code importer que je vous ai donné dans mon post précédent et considérant que le nom de votre fichier CSV est toujours identique, remplacez toute la boucle "For each nm ...." par celle ci-dessous

For Each nm In ThisWorkbook.Names
If nm.Name Like "*0036700027000854*" Then nm.Delete
Next nm

Rem : oubliez pas la mise à jour de votre version excel

Cordialement

Bonjour Dan,

Désolé pour le délais de la réponse, semaine chargée.

Tout fonctionne parfaitement, je vous remercie pour votre temps passé à m'aider.

Bien à vous

Rechercher des sujets similaires à "macro qui fonctionne maj"