VBA import fichier txt depuis un dossier

Résolu/Fermé
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 - 22 avril 2022 à 12:20
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 - 22 avril 2022 à 16:24
Bonjour à tous,

Je dois importer une quantité énorme de lignes dans excel depuis un gros fichier que j'ai split.

J'obtiens donc exactement 34 fichier txt de 1 000 000 de lignes.

J'ai farfouillé sur internet et j'ai trouvé comment importer tous les fichiers dans différentes feuilles sur excel (ce qui fonctionne correctement).

J'aimerais pouvoir faire en sorte que ça ouvre l'ensemble des fichiers sans m'ouvrir la fenêtre de sélection des fichiers. Que ça le fasse automatiquement car il y aura des mises à jour régulières. Je pense que c'est la partie xFilesToOpen que je dois modifier mais je ne sais pas comment le faire.

Voici le code récupéré :
Sub CombineTextFiles()
'updateby Extendoffice
Dim xFilesToOpen As Variant
Dim I As Integer
Dim xWb As Workbook
Dim xTempWb As Workbook
Dim xDelimiter As String
Dim xScreen As Boolean
On Error GoTo ErrHandler
xScreen = Application.ScreenUpdating
Application.ScreenUpdating = False
xDelimiter = "|"
xFilesToOpen = Application.GetOpenFilename("Text Files (*.txt), *.txt", , "Kutools for Excel", , True)
If TypeName(xFilesToOpen) = "Boolean" Then
MsgBox "No files were selected", , "Kutools for Excel"
GoTo ExitHandler
End If
I = 1
Set xTempWb = Workbooks.Open(xFilesToOpen(I))
xTempWb.Sheets(1).Copy
Set xWb = Application.ActiveWorkbook
xTempWb.Close False
xWb.Worksheets(I).Columns("A:A").TextToColumns _
Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, Semicolon:=False, _
Comma:=False, Space:=False, _
Other:=True, OtherChar:="|"
Do While I < UBound(xFilesToOpen)
I = I + 1
Set xTempWb = Workbooks.Open(xFilesToOpen(I))
With xWb
xTempWb.Sheets(1).Move after:=.Sheets(.Sheets.Count)
.Worksheets(I).Columns("A:A").TextToColumns _
Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, Semicolon:=False, _
Comma:=False, Space:=False, _
Other:=True, OtherChar:=xDelimiter
End With
Loop
ExitHandler:
Application.ScreenUpdating = xScreen
Set xWb = Nothing
Set xTempWb = Nothing
Exit Sub
ErrHandler:
MsgBox Err.Description, , "Kutools for Excel"
Resume ExitHandler
End Sub

Je suis un néophyte en programmation mais en général j'arrive à bidouiller pour que ça marche ^^

Merci beaucoup d'avance pour votre aide !!
Configuration: Windows / Chrome 100.0.4896.127
A voir également:

7 réponses

yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 Ambassadeur 1 559
22 avril 2022 à 12:48
bonjour,
Tu m'expliques pas comment le code pourrait déterminer quels fichiers traiter.
Merci d'utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2
22 avril 2022 à 13:10
Pardon désolé pour le code. Faut-il que je le remette avec les balises comme demandé (si oui, je choisis "basic" ?) ? Il s'agit d'un code en VBA sur excel.

Plus précisément, lorsque je lance le code, j'ai une fenêtre qui s'ouvre me demandant de sélectionner les fichiers txt à importer. J'aimerais pouvoir faire en sorte que la fenêtre ne s'ouvre pas et que ça m'importe directement les fichiers txt d'un dossier comme par exemple : "D:\Utilisateurs\Tchy\Bureau\test"
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559
Modifié le 22 avril 2022 à 13:28
ceci est un exemple de code qui parcourt tous les fichiers .txt d'un dossier:
Dim nomdossier As String, nomcompletfichier As String
Dim fso As Scripting.FileSystemObject, dossier As Scripting.Folder, fichier As Scripting.File
nomdossier = ThisWorkbook.Path
Set fso = New Scripting.FileSystemObject
Set dossier = fso.GetFolder(nomdossier)
For Each fichier In dossier.Files
    If Right(fichier.Name, 4) = ".txt" Then
        nomcompletfichier = nomdossier + "\" + fichier.Name
        Debug.Print nomcompletfichier
        ' Set xTempWb = Workbooks.Open(nomcompletfichier)
    End If
Next fichier


EDIT: pour le faire fonctionner, tu dois ajouter "Microsoft Scripting Runtime" dans les références de ton projet.
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2
22 avril 2022 à 13:59
Merci pour le retour

Je suis désolé mais je suis vraiment néophyte. Je viens déjà d'activer le " Microsoft Scripting Runtime". Pour le moment, je n'ai plus de message d'erreur :)

Lorsque j'exécute le code que tu m'as fait parvenir, il n'y a rien qui se passe. Je suppose qu'il faut que je mette ce code dans le gros code que j'ai. De ce que je comprends du code que tu m'as envoyé, la partie ThisWorkBook.Path renvoie à l'emplacement du fichier excel et après ça passe en revu les fichier txt présent dans le dossier

Cependant, je n'arrive pas à savoir comment mettre ton code sur celui présent.
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559
22 avril 2022 à 14:22
peut-être:
Option Explicit

Private Sub af()
Dim nomdossier As String, nomcompletfichier As String
Dim fso As Scripting.FileSystemObject, dossier As Scripting.Folder, fichier As Scripting.File
Dim xWb As Workbook, xTempWb As Workbook, xDelimiter As String
nomdossier = ThisWorkbook.Path
Set fso = New Scripting.FileSystemObject
Set dossier = fso.GetFolder(nomdossier)
For Each fichier In dossier.Files
    If Right(fichier.Name, 4) = ".txt" Then
        nomcompletfichier = nomdossier + "\" + fichier.Name
        Set xTempWb = Workbooks.Open(nomcompletfichier)
        xTempWb.Sheets(1).Move after:=xWb.Sheets(xWb.Sheets.Count)
        xWb.Worksheets(xWb.Sheets.Count).Columns("A:A").TextToColumns _
                Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, _
                ConsecutiveDelimiter:=False, _
                Tab:=False, Semicolon:=False, _
                Comma:=False, Space:=False, _
                Other:=True, OtherChar:=xDelimiter
    End If
Next fichier
End Sub
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2
Modifié le 22 avril 2022 à 14:38
J'ai modifié "OtherChar:=xDelimiter" par OtherChar:="|" pour mon fichier. Cependant (que je modifie ou non) j'ai ce message d'erreur : Erreur d'exécution '91' : variable objet ou variable de bloc with non définie

En gros ça m'a ouvert un fichier dans la première feuille et c'est tout.
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559
22 avril 2022 à 14:46
Il est utile de m'informer à quelle ligne de code l'erreur se produit.
Suggestion:
Option Explicit

Private Sub af()
Dim nomdossier As String, nomcompletfichier As String
Dim fso As Scripting.FileSystemObject, dossier As Scripting.Folder, fichier As Scripting.File
Dim xWb As Workbook, xTempWb As Workbook, xDelimiter As String
nomdossier = ThisWorkbook.Path
Set xWb = ThisWorkbook
Set fso = New Scripting.FileSystemObject
Set dossier = fso.GetFolder(nomdossier)
xDelimiter = "|"
For Each fichier In dossier.Files
    If Right(fichier.Name, 4) = ".txt" Then
        nomcompletfichier = nomdossier + "\" + fichier.Name
        Set xTempWb = Workbooks.Open(nomcompletfichier)
        xTempWb.Sheets(1).Move after:=xWb.Sheets(xWb.Sheets.Count)
        xWb.Worksheets(xWb.Sheets.Count).Columns("A:A").TextToColumns _
                Destination:=Range("A1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, _
                ConsecutiveDelimiter:=False, _
                Tab:=False, Semicolon:=False, _
                Comma:=False, Space:=False, _
                Other:=True, OtherChar:=xDelimiter
    End If
Next fichier
End Sub
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559 > yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025
Modifié le 22 avril 2022 à 14:50
J'ai supposé que le fichier dans lequel il fallait tout importer était le fichier dans lequel se trouve le code VBA.
0

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

Posez votre question
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2
22 avril 2022 à 15:13
Magnifique ça fonctionne parfaitement. En plus, je n'ai plus besoin de l'énorme code que j'avais trouvé.

Merci beaucoup, cette partie là est bonne. Il ne me reste plus qu'à travailler sur les résultats obtenus et à tout automatiser.

Encore merci
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559
22 avril 2022 à 15:28
peut-être utile d'ajouter
xTempWb.Close

avant
end if 


Peux-tu marquer la discussion comme résolue?
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2
22 avril 2022 à 15:35
Merci pour la précision.

Si je le rajoute avant le "End if" j'ai un message d'erreur : Erreur Automation" qui apparaît juste après la première importation.

J'ai essayé de le mettre juste après le "Next fichier", ça fait toutes les importations mais j'ai quand même ce même message d'erreur
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559
22 avril 2022 à 16:08
En effet, cela semble une mauvaise idée d'ajouter ce Close, désolé!
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2 > yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025
22 avril 2022 à 16:10
Merci beaucoup déjà de m'avoir énormément avancé ! C'est déjà parfait :)
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2
22 avril 2022 à 15:51
J'ai essayé également d'automatiser au début l'action de "Microsoft Scripting Runtime" présent dans le chemin de répertoire : C:\Windows\system32\scrrun.dll

J'ai mis ce code

Sub test1()
Dim xRef As String
xRef = "C:\Windows\system32\scrrun.dll"
ThisWorkbook.VBProject.References.AddFromFile xRef
End Sub


Et j'ai le message d'erreur Erreur d'exécution 1004, erreur définie par l'application ou par l'objet. Alors que quand je vais dans outils, référence et sur microsoft scripting runtime, le chemin d'accès est bon.

Je me permets de rajouter cette demande, je pense que vous allez pouvoir m'aider
0
yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025 1 559
22 avril 2022 à 16:10
Automatiser quoi?
Il suffit d'ajouter une fois la référence, via le menu, et de sauver le fichier.
0
tchitchy Messages postés 42 Date d'inscription mercredi 28 avril 2010 Statut Membre Dernière intervention 22 avril 2022 2 > yg_be Messages postés 23429 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 16 janvier 2025
22 avril 2022 à 16:24
Effectivement je suis un âne. J'ai juste à supprimer les feuilles existante pour lancer la macro d'importation quand il y a une MAJ

Merci beaucoup pour toute ton aide et ton temps
0