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 SubEdit 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.
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
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 Withpar ceci
Fichier = Application.GetOpenFilename
If Fichier = False Then Exit SubLA 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 Subbonjour,
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 SubSub 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 SubVersion 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 SubFaites 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 subDites moi si cela fonctionne
Le reste à voir plus tard
Ok le souci vient de l'instruction Getopen qui, je l'avais oublié (désolé....
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 selectionnesVoici 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 selectedfilesJe 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 subDites moi
Si ok et terminé pensez à

