Probleme de memoire
Bonjour à tous,
je suis sur un exercice dans lequel
- j'ouvre un dossier
- j'ouvre chaque dossier text du fichier
- je met en place un compteur pour connaitre le nombre de fichier ouvert
Il y a 74000 fichiers a traité hors la boucle s'arret au 2400e fichier
je voulais donc savoir si avec cette macro les fichiers reste en mémoire?
merci d'avance
Sub compteur()
Dim sf As Object 'déclare la variable sf (Système de Fichiers)
Dim ca As String 'déclare la variable ca (Chemin d'Accès)
Dim d As Object 'déclare la variable d (Dossiers)
Dim fs As Object 'déclare la variable fs (FichierS)
Dim f As Object 'déclare la variable f (Fichier)
Dim cl As Workbook 'déclare la variable cl (CLasseur)
Dim exercice As Workbook 'déclare la variable exercice
'variable code de traitement
Dim c As Range
Dim TaValeur As String
Application.ScreenUpdating = False
ca = "C:\wamp64\www\annuaire_mairie\annuaire_txt" 'définit le chemin d'accès (à adapter à ton cas)'
Set sf = CreateObject("Scripting.FileSystemObject") 'définit le système de fichiers sf
Set d = sf.GetFolder(ca) 'définit le dossier d
Set fs = d.Files 'définit les fichiers fs
For Each f In fs 'boucle sur tous les fichiers f
Workbooks.Open (ca & "\" & f.Name) 'ouvre le fichier
Set cl = ActiveWorkbook 'définit le classeur cl (la variable cl sera utilisée pour le traitement des données)
'ton code de traitement
Workbooks("exercice.xlsm").Worksheets("traitement").Range("a2") =
Workbooks("exercice.xlsm").Worksheets("traitement").Range("a2").Value + 1
cl.Close SaveChanges:=FalseThen
Next f 'prochain fichier de la boucle
End Sub
Bonjour,
Vous ne devriez pas ouvrir chaque fichier pour lire le contenu,
voici un exemple,
Sub test_lire()
'ajouter la référence Microsoft Scripting Runtime
Dim oFl As Scripting.file
Dim oTxt As Scripting.TextStream
Dim texte()
Dim i As Integer
fileName = "C:\MonFichier_test_lire.txt" '<--à adapter
Set oFSO = New Scripting.FileSystemObject
Set oFl = oFSO.GetFile(fileName)
Set oTxt = oFl.OpenAsTextStream(ForReading)
While Not oTxt.AtEndOfStream
i = i + 1
ReDim Preserve texte(i)
texte(i) = oTxt.ReadLine
Wend
Sheets("Feuil1").[A1].Resize(UBound(texte)) = Application.Transpose(texte)
End Sub
sabV vous êtes un amour de répondre aussi rapidement.
est ce que je peux vous demander quelques explications sur ce code?
est ce que je peux vous demander quelques explications sur ce code?
oui
Sub test_lire()
'ajouter la référence Microsoft Scripting Runtime
Dim oFl As Scripting.file
Dim oTxt As Scripting.TextStream
Dim texte()
Dim i As Integer
fileName = "C:\MonFichier_test_lire.txt" '<--à adapter je vois que sur cette ligne c'est un nom de fichier l'objectif de ma macro c'est de bouclé sur chaque fichier afin de faire des vérifications de données et de les traités si celle-ci sont vrai. hors sur cette ligne il faut identifié un fichier precis? est ce bien cela?
Set oFSO = New Scripting.FileSystemObject
Set oFl = oFSO.GetFile(fileName)
Set oTxt = oFl.OpenAsTextStream(ForReading)
While Not oTxt.AtEndOfStream
i = i + 1
ReDim Preserve texte(i)
texte(i) = oTxt.ReadLine
Wend
Sheets("Feuil1").[A1].Resize(UBound(texte)) = Application.Transpose(texte)
End Sub
pour une boucle sur chaque fichiers du répertoire choisi,
Sub Test_Lire_Fichiers_Texte()
'ajouter la référence Microsoft Scripting Runtime
Dim fd As FileDialog, rw As Long, lignes, i
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.AllowMultiSelect = False
oFolder = fd.SelectedItems(1)
rw = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set sfoFolder = fso.GetFolder(oFolder)
For Each oFile In sfoFolder.Files
Open oFile For Binary As #ff
Temp = String(FileLen(oFile), " ")
Get #ff, , Temp ' Récupère tout le fichier
Close #ff
lignes = Split(Temp, vbCrLf)
For i = LBound(lignes) To UBound(lignes)
rw = Cells(Rows.Count, 1).End(xlUp).Row + 1
Cells(rw, 1) = lignes(i)
Next i
Next
End Sub
désolé mais je ne comprend pas ce code...
Bonjour,
Un autre exemple dans le même esprit mais avec la fonction Dir(). Les commentaires sont dans le code :
Sub Test()
Dim Tbl
Dim I As Integer
Dim Tampon As String
Dim Dossier As String
Dim Fichier As String
'chemin du dossier à adapter
Dossier = "E:\Dossier 1\Dossier 2\"
'tous les fichiers texte du dossier
Fichier = Dir(Dossier & "*.txt")
'boucle sur ces derniers...
Do While (Len(Fichier) > 0)
'ouvre le fichier en mode binaire
Open Dossier & Fichier For Binary As #1
'dimensionne le tampon pour qu'il puisse recevoir
'le contenu du fichier texte en cours puis récup !
Tampon = Space$(LOF(1))
Get #1, , Tampon
'splite le fichier par ligne
Tbl = Split(Tampon, vbCrLf)
'réparti les valeur sur les colonnes ligne par ligne dans la feuille active à partir de A1
I = I + 1
Range(Cells(I, 1), Cells(I, UBound(Tbl))).Value = Tbl
Close #1
'au suivant...
Fichier = Dir()
Loop
End Sub
merci Theze pour ton retour, je me bas pour trouver des solutions ^^
je voulais savoir si je veux récupéré des données en fonction d'une méthode find sur la colonne A pour les renvoyer sur une autre feuille?
j'ai essayé d'appliquer une action dans la boucle mais rien alors que si je met une action juste après la boucle pas de soucis.
Pour info je test un petit msgbox pour voir si l'action est prise en compte....
Sub Test()
Dim Tbl
Dim I As Integer
Dim Tampon As String
Dim Dossier As String
Dim Fichier As String
'chemin du dossier à adapter
Dossier = "E:\Dossier 1\Dossier 2\"
'tous les fichiers texte du dossier
Fichier = Dir(Dossier & "*.txt")
'boucle sur ces derniers...
Do While (Len(Fichier) > 0)
'ouvre le fichier en mode binaire
Open Dossier & Fichier For Binary As #1
'dimensionne le tampon pour qu'il puisse recevoir
'le contenu du fichier texte en cours puis récup !
Tampon = Space$(LOF(1))
Get #1, , Tampon
'splite le fichier par ligne
Tbl = Split(Tampon, vbCrLf)
'réparti les valeur sur les colonnes ligne par ligne dans la feuille active à partir de A1
I = I + 1
Range(Cells(I, 1), Cells(I, UBound(Tbl))).Value = Tbl
'si je met un msg box ici rien ne se passe.
Close #1
'au suivant...
Fichier = Dir()
Loop
'si je met une msgbox ici le msgbox s'affiche.
End Sub
Re,
Voici le code avec des boites de messages (j'ai aussi mis une gestion des fichiers contenant qu'une seule ligne). Utilises les balise Code, le bouton </> (mettre le code entre les deux balises) :
Sub Test()
Dim Tbl
Dim I As Integer
Dim Tampon As String
Dim Dossier As String
Dim Fichier As String
'chemin du dossier à adapter
Dossier = "E:\Dossier \Dossier 2\"
'tous les fichiers texte du dossier
Fichier = Dir(Dossier & "*.txt")
'boucle sur ces derniers...
Do While (Len(Fichier) > 0)
'ouvre le fichier en mode binaire
Open Dossier & Fichier For Binary As #1
'dimensionne le tampon pour qu'il puisse recevoir
'le contenu du fichier texte en cours puis récup !
Tampon = Space$(LOF(1))
Get #1, , Tampon
'splite le fichier par ligne
Tbl = Split(Tampon, vbCrLf)
'réparti les valeur sur les colonnes ligne par ligne dans la feuille active à partir de A1
I = I + 1
If UBound(Tbl) > 0 Then Range(Cells(I, 1), Cells(I, UBound(Tbl))).Value = Tbl Else Cells(I, 1).Value = Tbl
MsgBox "Nom du fichier en cours : " & Fichier _
& vbCrLf & _
"Nombre de caractères : " & Len(Tampon)
Close #1
'au suivant...
Fichier = Dir()
Loop
MsgBox "Le dossier '" & Dossier & "' possède " & I & " fichiers !"
End Sub