Erreur 91 impossible à corriger

Bonjour,
J'essaie de réaliser une macro pour importer automatiquement les données d'un fichier .csv dans une feuille.
J'ai un erreur 91 que je n'arrive pas à corriger l11.
L'un d'entre vous aurait-il une idée ?
Voici le code :

Sub CsvImport()
Dim Fichier As String, Chemin As String, RepArchive As String
Dim LastLig As Long, NewLig As Long
Dim Wbcsv As Workbook
Dim c As Range
Dim Tablo

Application.ScreenUpdating = False 'Inhibe le rafraichissement affichage

With Application.FileDialog(msoFileDialogFolderPicker) 'Ouvre la boite de dialogue pour sélection de dosiier
.Show
If .SelectedItems.Count = 1 Then Chemin = .SelectedItems(1)
End With

If Chemin <> "" Then
RepArchive = "C:\Users\user\Desktop\CSV\Archives\"
Chemin = Chemin & "\"
Fichier = Dir(Chemin & "*.csv") 'Le premier fichier csv trouvé
Do While Fichier <> "" 'On fait une boucle jusqu'à ce qu'on ne trouve plus de fichier csv
Name Chemin & Fichier As Replace(Chemin & Fichier, ".csv", ".txt") 'On renomme le csv en txt
Fichier = Replace(Fichier, ".csv", ".txt") 'On remplace l'extension dans notre variable
Set Wbcsv = Workbooks.Open(Chemin & Fichier) 'On ouvre le fichier csv qu'on affecte à la variable Wbcsv
With Wbcsv.Sheets(1)
LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row 'LastLig est la dernière ligne remplie du fichier csv ouvert
End With
With ThisWorkbook.Worksheets("Feuil1")
For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig) 'Pour chaque cellule de A2:Axxx
NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'La première cellule vide de la colonne 1 de Feuil1 de ce classeur
Tablo = Split(c.Value, ",") 'On sépare les données par rapport au séparateur (ICI LA VIRGULE)
.Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) + 1)).Value = Tablo 'On copie
Next c
End With
Wbcsv.Close 'On ferme le fichier csv
Set Wbcsv = Nothing 'On libère la variable
Name Chemin & Fichier As Replace(RepArchive & Fichier, ".txt", ".csv") 'On re modifie l'extension et le répertoire de notre fichier
Fichier = Dir() 'On cherche le fichir csv suivant
Loop 'On reboucle
End If
End Sub

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

Merci d'avance

bonsoir,

je ne parviens pas à obtenir cette erreur avec to n code. Code pour lequel il conviendrait que tu utilises la balise code (</>) lorsque tu le mets sur ce forum.

bonjour h2so4,xTomTomx,

vous avez l'erreur à quelle ligne ?

Votre code est assez limpide, mais dites-nous en clair ce que vous avez voulu faire. Laissez le code de côté pour le moment.

Pour moi, le problème vient du choix de la sauvegarde dans un dossier système C:\Users

erreur

Si on change de lecteur, il n'y a plus d'erreur :

RepArchive = "E:\Users\user\Desktop\CSV\Archives\"

Bonjour à tous,
Je vous remercie grandement pour votre temps :)
L'idée initiale était d'automatiser l'import de données csv via une macro; on colle un fichier .csv dans un dossier créée à cet effet, et, en executant la macro, les données sont collées dans le tableur pour l'exploitation.

L'erreur 91 apparait à ce niveau là.
NB : je suis sous mac et j'ai lu que ce problème était récurrent sous cette version

image

Merci pour l'intérêt que vous portez à ce problème :)

Tom

En tout cas, je prends note de ce que vous m'avez dit, je vais essayer de mon coté sur une autre machine pour voir si c'est lié à ma version d'Excel pour Mac en prenant en compte vos remarques

Bonjour,

Je m'insère juste dans ce fil juste pour vous faire une remarque.

Si vous êtes sur MAC, le répertoire que vous mentionnez n'est pas correct de même que les antislash.

Vous devriez avoir un genre de répertoire comme ceci --> /user/votre nom utilisateur/....

Crdlt

C'est exact, mais le problème persiste.

Merci pour votre aide

vous pouvez déjà remplacer ces lignes

'With Application.FileDialog(msoFileDialogFolderPicker) 'Ouvre la boite de dialogue pour sélection de dosiier
'.Show
'If .SelectedItems.Count = 1 Then Chemin = .SelectedItems(1)
'End With

par ceci

Fichier = Application.GetOpenFilename
If Fichier = False Then Exit Sub

LA variable Fichier vous renverra l'adresse complète sur votre MAC pour ouvrir votre fichier
Plus bas il faudra réanalyser le code. Je ne suis pas allé plus loin dans votre souci mais chemin et RepArchive ne serviraient plus puisque fichier vous renvoie l'info
En gros quel est le but du code ?

L'idée initiale était d'automatiser l'import de données csv via une macro; on colle un fichier .csv dans un dossier créée à cet effet, et, en executant la macro, les données sont collées dans le tableur pour l'exploitation.

L'erreur 91 apparait à ce niveau là : .Show

Edit : je viens d'essayer sous Window, la macro s'exécute, mais lorsque que l'explorateur de fichier s'ouvre, aucun fichier n'est visible.

Edit 2 : je n'ai plus d'erreur 91 en effectuant les modifications recommandées (Version Mac). Cependant, j'ai une erreur 13 à la ligne :

If Fichier = False Then Exit Sub

bonjour,

aucun fichier n'est visible.

normal, tu utilises une instruction pour sélectionner un répertoire (folder). il t'affiche donc la liste des répertoires, pas celle des fichiers.

L'erreur 91 apparait à ce niveau là : .Show

Ce n'est pas là le souci. C'est la ligne avant qui ne peut s'exécuter sous MAC.
Essayez avec ce que je vous ai donné mais vous devez sélectionner le fichier
Si maintenant vous voulez parcourir tous les fichiers CSV sélectionnés d'un répertoire, là ce sera différent.

Vous avez tout à fait raison, j'ai modifié.
Mon nouveau problème : Erreur 52 "Nom ou numero de fichier incorrect"; je travaille dessus là

J'ai bien effectué les modifications selon vos recommandations.
J'essaie de résoudre en parallèle le code pour la version Mac et la version Windows.
Je détaillerai mon avancement sur ce post. Quand j'aurais finis, y a-t-il un endroit où je peux déposer ces fichiers pour les laisser accessible à tout le monde. C'est le genre d'automatisation qui peut être utile pour un grand nombre d'utilisateur.

Version Mac

Erreur 13 à cette ligne :

If Fichier = False Then Exit Sub
Sub importCSV()
Dim Fichier As String, Chemin As String, RepArchive As String
Dim LastLig As Long, NewLig As Long
Dim Wbcsv As Workbook
Dim c As Range
Dim Tablo

Application.ScreenUpdating = False                                                                 'Inhibe le rafraichissement affichage

Fichier = Application.GetOpenFilename
If Fichier = False Then Exit Sub

If Chemin <> "" Then
    RepArchive = "/Users/tomcoemet/Desktop/CSV"
    Chemin = Chemin & "\"
    Fichier = Dir(Chemin & "*.csv")                                                                'Le premier fichier csv trouvé
    Do While Fichier <> ""                                                                         'On fait une boucle jusqu'à ce qu'on ne trouve plus de fichier csv
        Name Chemin & Fichier As Replace(Chemin & Fichier, ".csv", ".txt")                         'On renomme le csv en txt
        Fichier = Replace(Fichier, ".csv", ".txt")                                                 'On remplace l'extension dans notre variable
        Set Wbcsv = Workbooks.Open(Chemin & Fichier)                                               'On ouvre le fichier csv qu'on affecte à la variable Wbcsv
        With Wbcsv.Sheets(1)
            LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row                                         'LastLig est la dernière ligne remplie du fichier csv ouvert
        End With
        With ThisWorkbook.Worksheets("Feuil1")
            For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig)                                  'Pour chaque cellule de A2:Axxx
                NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1                                  'La première cellule vide de la colonne 1 de Feuil1 de ce classeur
                Tablo = Split(c.Value, ",")                                                        'On sépare les données par rapport au séparateur (ICI LA VIRGULE)
                .Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) + 1)).Value = Tablo         'On copie
            Next c
        End With
        Wbcsv.Close                                                                                'On ferme le fichier csv
        Set Wbcsv = Nothing                                                                        'On libère la variable
        Name Chemin & Fichier As Replace(RepArchive & Fichier, ".txt", ".csv")                     'On re modifie l'extension et le répertoire de notre fichier
        Fichier = Dir()                                                                            'On cherche le fichir csv suivant
    Loop                                                                                           'On reboucle
End If
End Sub

Version Window :

Je parviens à sélectionner le fichier, et après j'ai : "erreur 52 Nom ou numero de fichier incorrect".

Sub importCSV()
Dim Fichier As String, Chemin As String, RepArchive As String
Dim LastLig As Long, NewLig As Long
Dim Wbcsv As Workbook
Dim c As Range
Dim Tablo

Application.ScreenUpdating = False                                                                 'Inhibe le rafraichissement affichage

With Application.FileDialog(msoFileDialogFilePicker)                                             'Ouvre la boite de dialogue pour sélection de dosiier
    .Show
    If .SelectedItems.Count = 1 Then Chemin = .SelectedItems(1)
End With

If Chemin <> "" Then
    RepArchive = "C:\Users\allia\Desktop\CSV"
    Chemin = Chemin & "\"
    Fichier = Dir(Chemin & "*.csv")                                                                'Le premier fichier csv trouvé
    Do While Fichier <> ""                                                                         'On fait une boucle jusqu'à ce qu'on ne trouve plus de fichier csv
        Name Chemin & Fichier As Replace(Chemin & Fichier, ".csv", ".txt")                         'On renomme le csv en txt
        Fichier = Replace(Fichier, ".csv", ".txt")                                                 'On remplace l'extension dans notre variable
        Set Wbcsv = Workbooks.Open(Chemin & Fichier)                                               'On ouvre le fichier csv qu'on affecte à la variable Wbcsv
        With Wbcsv.Sheets(1)
            LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row                                         'LastLig est la dernière ligne remplie du fichier csv ouvert
        End With
        With ThisWorkbook.Worksheets("Feuil1")
            For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig)                                  'Pour chaque cellule de A2:Axxx
                NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1                                  'La première cellule vide de la colonne 1 de Feuil1 de ce classeur
                Tablo = Split(c.Value, ",")                                                        'On sépare les données par rapport au séparateur (ICI LA VIRGULE)
                .Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) + 1)).Value = Tablo         'On copie
            Next c
        End With
        Wbcsv.Close                                                                                'On ferme le fichier csv
        Set Wbcsv = Nothing                                                                        'On libère la variable
        Name Chemin & Fichier As Replace(RepArchive & Fichier, ".txt", ".csv")                     'On re modifie l'extension et le répertoire de notre fichier
        Fichier = Dir()                                                                            'On cherche le fichir csv suivant
    Loop                                                                                           'On reboucle
End If
End Sub

Faites deux macros différentes. Une pour MAC et une autre pour windows.
une fois que les deux fonctionneront sur chacun des OS, je vous donnerai une code pour exécuter le bon code

Essayez votre code-ci sur MAC

Sub CsvImportMAC()
Dim LastLig As Long, NewLig As Long
Dim Wbcsv As Workbook
Dim c As Range
Dim Tablo
Dim fichier, selectedfiles

Application.ScreenUpdating = False 'Inhibe le rafraichissement affichage
selectedfiles = Application.GetOpenFilename(FileFilter:="CSV Files (*.CSV), *.CSV", MultiSelect:=True)

If selectedfiles = False Then Exit Sub 'si pas de fichiers selectionnes

For Each fichier In selectedfiles
    Set Wbcsv = Workbooks.Open(fichier)
    LastLig = Wbcsv.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row

    With ThisWorkbook.Worksheets("Feuil1")
        For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig) 'Pour chaque cellule de A2:Axxx
            NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'La première cellule vide de la colonne 1 de Feuil1 de ce classeur
            Tablo = Split(c.Value, ",") 'On sépare les données par rapport au séparateur (ICI LA VIRGULE)
            .Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) + 1)).Value = Tablo 'On copie
        Next c
    End With
    Wbcsv.Close 'On ferme le fichier csv
    Set Wbcsv = Nothing 'On libère la variabl
Next fichier
End sub

Dites moi si cela fonctionne

Le reste à voir plus tard

selectedfiles = Application.GetOpenFilename(FileFilter:="CSV Files (*.CSV), *.CSV", MultiSelect:=True)

Erreur 1004 à cette ligne. Voici le détail:

Edit : même erreur en désactivant la sélection multiple

capture d e cran 2023 10 25 a 13 13 38

Ok le souci vient de l'instruction Getopen qui, je l'avais oublié (désolé.... ), ne fonctionne pas et qui contrairement à celle-ci fonctionne --> Application.Dialogs(xlDialogOpen).Show
Mais dans votre cas, cela ne fonctionnera peut être pas car le fichier sélectionné est directement converti dans une nouveau fichier excel.
Là il faudrait traiter par rapport à ce nouveau fichier.
Dites moi si vous avez un bug après le choix du ou des fichiers

Pensez à voir ce fil --> https://forum.excel-pratique.com/s/goto/1147263 dans lequel on avait eu le souci pour des images et trouvé une solution en renommant le fichier.

Dim fichier, selectedfiles

Application.ScreenUpdating = False 'Inhibe le rafraichissement affichage
selectedfiles = Application.Dialogs(xlDialogOpen).Show()

If selectedfiles = False Then Exit Sub 'si pas de fichiers selectionnes

Voici les modifications que j'ai apporté. Cela fonctionne un peu mieux, je sélectionne mon fichier dans la boite de dialogue, un .csv. le fichier est sélectionné. La boite de dialogue se ferme.
J'ai essayé en sélectionnant 2 fichiers, même résultat.

Erreur 13 à cette ligne : "Incompatibilité de type".

For Each fichier In selectedfiles

Je cherche à avancer en m'aidant de TDebug.Print TypeName(fichier). Mais rien ne se passe, je n'arrive pas à afficher le type.

Edit : j'ai trouvé un moyen

Range("A1").Value = TypeName(fichier)

Empty

Erreur 13 à cette ligne : "Incompatibilité de type".
For Each fichier In selectedfiles

Oui c'est logique. Il faut adapter le code complet. Je vous ai juste proposé l'instruction Application.dialogs pour faire un test

Essayez avec ce code complet :

Sub CsvImport()
Dim LastLig As Long, NewLig As Long
Dim Wbcsv As Workbook
Dim c As Range
Dim i As Integer
Dim Tablo

Application.ScreenUpdating = False 'Inhibe le rafraichissement affichage

Application.Dialogs(xlDialogOpen).Show

For i = Workbooks.Count To 1 Step -1

    Set Wbcsv = ActiveWorkbook

    If Right(Workbooks(i).Name, 3) = "csv" Then'verifier extensio Csv
        LastLig = Wbcsv.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
        With ThisWorkbook.Worksheets("Feuil1")
            For Each c In Wbcsv.Sheets(1).Range("A2:A" & LastLig) 'Pour chaque cellule de A2:Axxx
                NewLig = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'La première cellule vide de la colonne 1 de Feuil1 de ce classeur
                Tablo = Split(c.Value, ",") 'On sépare les données par rapport au séparateur (ICI LA VIRGULE)
                .Range(.Cells(NewLig, 1), .Cells(NewLig, UBound(Tablo) + 1)).Value = Tablo 'On copie
            Next c
        End With
        Wbcsv.Close
        Set Wbcsv = Nothing
    End If
Next i
End sub

Dites moi

Si ok et terminé pensez à

Rechercher des sujets similaires à "erreur impossible corriger"