Fermeture de plusieurs fichiers txt sous Excel
Bonjour à vous tous,
J'en appelle à vous car j'ai beau cherché et je n'ai rien trouvé à ce sujet.
J'ai créé, enfin, mis bout à bout différentes lignes de codes pêchées sur les forums, pour créer une macro qui m'ouvre plusieurs fichiers txt sous Excel en me lesconvertissant,transforme et récupère les données dans le fichier contenant la macro.
Je me retrouve avec x fichiers .txt ouvert sous excel (2010) et je souhaite les fermer sans sauvegarder grâce un bouton sur le fichier
contenant les données récupérées et la macro.
Le début du code concernant l'ouverture des fichiers :
Sub Extract_Files()
Dim filenames As Variant
Dim L As Integer
L = 1
'Efface les infos du tableau
derln = Range("A" & Rows.Count).End(xlUp).Row
Range("A7:G" & derln).Select
Selection.ClearContents
' définit le tableau d'après une variable et True pour une sélection
' multiple
filenames = Application.GetOpenFilename(, , , , True)
counter = 1
' ubound détermine le nombre d'éléments du tableau
While counter <= UBound(filenames)
'Ouverture des fichiers sélectionnés
Workbooks.OpenText filenames(counter), Origin:= _
xlMSDOS, StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1) _
, Array(27, 1), Array(29, 4), Array(35, 1), Array(44, 1), Array(51, 1), Array(61, 1)), _
DecimalSeparator:=".", TrailingMinusNumbers:=True
'Afficher le nom du fichier
Range("I1").FormulaR1C1 = "=CELL(""nomfichier"")"
'Copie et Colle les valeurs du nom de fichier afin de figer le nom du fichier
Range("I1").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=FalseDans l'espoir d'avoir été clair.
Je vous remercie par avance de vos propositions.
Bonne soirée.
Bonjour,
à mettre dans la boucle, après les opérations effectués avec le fichier texte,
Workbooks(Dir(filenames(i))).Close SaveChanges:=FalseÉdit: oups, modifier filenames(i) par filenames(counter)
Bonjour à tous,
Merci à sabV pour sa rapide proposition.
J'ai testé cette ligne de commande et malheureusement cela ne me convient pas complètement.
J'ai inséré ce code dans la boucle et, effectivement, cela me ferme bien le ou les fichiers ouvert par cette boucle.
'Ferme le fichier .txt
'MsgBox Oui + Non
Select Case MsgBox("VOULEZ VOUS FERMER LES FICHIERS", vbYesNo + vbQuestion + vbDefaultButton2, "ATTENTION")
Case vbYes
Workbooks(Dir(filenames(counter))).Close SaveChanges:=False
End Select
'incrémentation du compteur
counter = counter + 1
WendJe garde cette partie, car elle est utile.
Merci encore
Malheureusement cette macro ne fonctionne pas si je l'affecte à un bouton "Fermer les Fichiers" sur le classeur principal.
Sub Ferme_Fichiers()
Workbooks(Dir(filenames(counter))).Close SaveChanges:=False
End SubCela me renvoie une "Erreur de Compilation" / "Sub ou Function non définie"
Aussi, comment puis-je Fermer tous les fichiers ouvert par la boucle après l'exécution de la macro ?
Ci-dessous la capture d'écran :
Pour être plus clair, par le clic sur le bouton "Fermer Fichiers", je souhaite fermer uniquement les fichiers SOL_DAL_xxxxx et garder le fichier "Extract Fichiers Comptages" ouvert car il s'agit de mon fichier maître.
Je sais que rien n'est impossible en informatique, mais là, j'ai des doutes !
Si quelqu'un a l'idée de Génie, je suis preneur.
Bon, c'est pas le tout, faut aller au boulot....
Bonne journée à tous.
Cordialement.
Bonjour,
pourriez-vous me dire quel est la raison de ne pas fermer le fichier txt dès lors le traitement terminé ?
Édit: s.v.p. j'aimerais voir votre macro au complet.
Bonjour,
Et en faisant une requête sur les différents fichiers ?
Je n'ai pas testé le code ci-dessous mais c'est une piste car les fichiers ne sont pas ouvert dans le sens où on l'entend. Il y aura certainement des modifs à apporter mais c'est une piste :
Sub Test()
Dim filenames As Variant
Dim I As Integer
Dim Lgn As Long
'Efface les infos du tableau
With ActiveSheet: .Range(.Cells(7, 1), .Cells(.Rows.Count, 7).End(xlUp)).ClearContents: End With
filenames = Application.GetOpenFilename(, , , , True)
If filenames = False Then Exit Sub
Lgn = 7
For I = 1 To UBound(filenames)
'exécute une requête et récupère les valeurs sur la feuille active à partir de "A7", à adapter
With ActiveSheet.QueryTables.Add("TEXT;" & filenames(I), ActiveSheet.Range("A" & Lgn))
.TextFileSemicolonDelimiter = True 'ici, le délimiteur est le point-virgule (;)
.Refresh 'met à jour
.Delete 'supprime la requête pour ne garder que les valeurs sans lien
End With
With ActiveSheet: Lgn = .Cells(.Rows.Count, 1).End(xlUp).Row + 1: End With
Next I
End SubBonjour à tous,
Édit: s.v.p. j'aimerais voir votre macro au complet.
sabV a entièrement raison ... !!!
Première étape : Fournir le code complet ...
Seconde étape : Comprendre la proposition de sabV
Troisième étape : Intégrer le tout proprement ...
Pour l'instant ... 'back to square one' .... il faut franchir la première étape ...
Bonjour à tous,
J'ai bien pris note de votre demande.
J'ai testé la macro de Thezé, mais non, cela bloque la procédure à :
If filenames = False Then Exit Sub
Je vous mets en PJ le fichier de traitement ainsi que 2 fichiers à traiter.
Tout fonctionne bien, la fermeture ou non des fichiers .txt au cours de la procédure marche nickel.
Pour répondre à SabV, je souhaite garder ouvert les fichiers présentant une anomalie, la corrigée en ouvrant le / les fichiers txt avec le bloc-notes, puis les fermer par le bouton "Fermer le/les Fichiers" de l'onglet Menu.
J'ai créé volontairement une anomalie sur le fichier : PAT-DAL2001-NAN-17082017 pour test.
Ne riez pas lorsque vous verrez le code.
Je ne suis pas du métier..... je colle bout à bout des morceaux et prie pour que cela fonctionne.....
Merci de votre aide.
Bien cordialement.
Re,
C'est quoi qui bloque ? L'instruction "If filenames = False Then Exit Sub" arrête le code si aucune sélection de fichier n'a été faite !
La fonction GetOpenFilename retourne soit la valeur False si aucune sélection de fichier n'a été faite soit un tableau de string dans le cas contraire (d'où la déclaration en Variant pour la variable)
bonjour
voila une macro import de fichier TxT avec modification de la date a toi de voir
A+
Maurice
Private Sub ChoixFicTxt()
Dim dossier As FileDialog
ChoixChemin = ActiveWorkbook.Path & Application.PathSeparator
Set dossier = Application.FileDialog(msoFileDialogFilePicker)
With dossier
.AllowMultiSelect = False
.InitialFileName = ChoixChemin
.Title = "Choix d'un fichier TXT"
.Filters.Clear
.Filters.Add "Fichier Csv ", "*.txt*", 1
If .Show = -1 Then
Chemin = .SelectedItems(1)
LireMan Chemin
End If
End With
Set dossier = Nothing
End Sub
Sub LireMan(NomFichier)
Dim Ar() As String
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlManual
End With
Rows("1:" & Rows.Count).Clear
Sep = " "
Lig = 1
' -----------------------------------------
On Error Resume Next
Open NomFichier For Input As #1
Do While Not EOF(1)
Line Input #1, Chaine
Ar = Split(Application.Trim(Chaine), Sep)
Col = 1
For X = LBound(Ar) To UBound(Ar)
Tmp = Application.Trim(Ar(X))
Select Case Col
Case 1
Temp = Right(Tmp, 8)
Cells(Lig, Col).Value = DateSerial(Left(Temp, 4), Mid(Temp, 5, 2), Right(Temp, 2))
Case Else
Cells(Lig, Col).Value = Tmp
End Select
Col = Col + 1
Next
Lig = Lig + 1
Loop
Close #1
' -----------------------------------------
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.CutCopyMode = False
.Goto [A1], True
End With
End SubBonjour à Tous,
Pour répondre à Theze, j'ai retesté aujourd'hui et je confirme : cela bloque:
Merci tout de même.
Mais le problème initial de fermeture des fichiers en dehors de la boucle de la procédure ne m'est pas résolu.
Bien cordialement.
Bonjour à Tous again,
Pour répondre à archer :
Merci mais cela ne m'aide pas dans ma recherche.
Mon problème est la fermeture des fichiers restés ouverts après la procédure.
Voir mes fichiers exemples.
J'ai beau fouiller, je ne trouve rien à ce sujet depuis que Excel ouvre des instances indépendantes et non plus des "classeurs".
Donc je crois que c'est Impossible....
Bien cordialement.
Bonjour
ma macro fait une lecture de fichier Txt donc il est pas ouvert
j'ais fait des modife regarde bien si ça te va
A+
Maurice
Bonjour à tous,
Je viens d'avoir une révélation au sujet de mon problème de fermeture des fichiers txt restés ouvert.
Dans mon fichier principal gérant la macro, sur l'onglet récapitulant toutes les infos extraites lors du traitement,
j'ai en colonne H le nom des fichiers ayant été ouvert :
J'ai donc le nom des fichiers potentiellement ouvert.
De ce fait, ne serait-il pas possible de créer une boucle interrogeant cette colonne H à partir de H7 jusqu'à dernière ligne pour contrôler si le fichier contenant la valeur en H est actif ou non ?
Si oui, tu fermes le fichier,
Si non, tu passes à la valeur suivante.
S'il est nécessaire d'avoir le chemin complet, pas de problème je peux modifier le code en ce sens.
Je sollicite donc votre aide car je ne suis pas très fort dans les boucles....
En fouillant dans mes anciens messages, j'ai retrouvé une idée de "gmb" datant du mois d'octobre 2016 au sujet de modification de raison sociales par traitement par lot.
Celui-ci me proposait de créer un tableau virtuel avec : CreateObject("Scripting.Dictionary")
Ne serait-il pas possible de mettre le nom des fichiers ouvert dans ce tableau, et créer la boucle pour la fermeture des fichiers dans ce
tableau ?
Bon week end à Tous
Bien cordialement.
Bonjour à tous,
une possibilité serait de créer une liste sur une feuille temporaire, avec Dir(filenames(counter))
Sub Ferme_Fichiers()
With Sheets("Tempo")
For i = 1 To .Cells(Rows.Count).End(xlUp).Row
Workbooks(.Cells(i, 1)).Close SaveChanges:=False
Next
End Subne serait-il pas possible de créer une boucle interrogeant cette colonne H à partir de H7 jusqu'à dernière ligne pour
Sub Ferme_Fichiers()
With Sheets("Tempo") 'à adapter
For i = 7 To .Cells(Rows.Count, "H").End(xlUp).Row
Workbooks(.Cells(i, 1)).Close SaveChanges:=False
Next
End SubBonjour Archer,
Je viens de regarder ta modif.
J'ai bien compris ta procédure malheureusement j'ai besoin de garder le fichier txt ouvert lorsque celui-ci contient une anomalie de
date....
Par contre, je garde sous le coude gauche tes fonctions concernant la gestion du nom de fichier :
Function FilenameWithoutExt(ByVal strPath As String)
Dim intI As Integer
strPath = Filename(strPath)
intI = InStrRev(strPath, ".", -1, vbTextCompare)
If intI = 0 Then
FilenameWithoutExt = strPath
Else
FilenameWithoutExt = Left(strPath, intI - 1)
End If
End Function
Function Filename(ByVal strPath As String) As String
' Trouver le dernier backslash, s'il y en a un...
Dim intI As Integer
intI = InStrRev(strPath, "\", -1, vbTextCompare)
' Renvoyer la partie après le backslash
Filename = IIf(intI = 0, strPath, Mid(strPath, intI + 1))
End Function
Function FileExt(ByVal strPath As String) As String
' Ne conserver que le nom de fichier
strPath = Filename(strPath)
' Trouver le dernier point
Dim intI As Integer
intI = InStrRev(strPath, ".", -1, vbTextCompare)
FileExt = IIf(intI = 0, "", Mid(strPath, intI + 1))
End FunctionMerci pour cela.
Bien cordialement
Bonsoir SabV,
Je viens de tester sur mon onglet "Menu", la colonne H comportant le nom des fichiers
Sub Ferme_Fichier()
With Sheets("Menu")
For i = 7 To .Cells(Rows.Count, "H").End(xlUp).Row
Workbooks(.Cells(i, 1)).Close SaveChanges:=False
Next
End With
End SubLa procédure stoppe sur : Workbooks(.Cells(i, 1)).Close SaveChanges:=False
Je pensais que c'était parce que dans la liste, certains fichiers sont déjà fermés et pas d'autres, mais ce n'est pas cela.
J'ai aussi rajouté un End With car le débogueur le réclamait.....
Merci quand même et Vive le Québec.
Bonne soirée.
oups, désolé c'est un erreur de ma part.
est ce que cela résolu votre problème de fermeture de fichier ?
Bonjour à Tous,
Je viens de trouver une alternative à mon problème de fermeture par lot de fichiers ouvert.
Un code de Dan datant de 2011.
Je l'ai un peu adapté pour mes fichiers :
Sub test()
Dim wb As Workbook
For Each wb In Workbooks
If UCase(wb.Name) Like "SOL*" Then wb.Close SaveChanges:=False: Exit For
Next wb
End SubCela me permet via un bouton "Ferme les Fichiers" de les fermer un à un.
Mais est-il possible d'intégrer le code de SabV afin de supprimer le Like "SOL*" pour que cela boucle sur les valeurs de la colonne H de la feuille "Menu" ? :
Sub Ferme_Fichier()
With Sheets("Menu")
For i = 7 To .Cells(Rows.Count, "H").End(xlUp).Row
Workbooks(.Cells(i, 1)).Close SaveChanges:=False
Next
End With
End SubN'étant pas de la partie, je ne vois pas du tout comment imbriquer ces deux boucles.
Merci d'avance pour votre aide.
Cordialement.
Bonjour à tous,
Razorback35,
c'est à tester,
Sub Ferme_Fichier()
For i = 7 To Sheets("Menu").Cells(Rows.Count, "H").End(xlUp).Row
wName = Sheets("Menu").Cells(i, 1)
Workbooks(wName & ".txt").Close SaveChanges:=False 'àdapter l'extention de vos fichiers texte
Next
End SubBonjour à Tous,
Merci SabV pour ta proposition.
Malheureusement cela ne fonctionne pas non plus.
La procédure s'arrête à :
Workbooks(wName & ".txt").Close SaveChanges:=False 'àdapter l'extention de vos fichiers texte
J'ai testé avec une extension .csv en me disant que peut-être lors de la conversion du fichier par excel le fichier devenait un csv, mais non.
J'ai pensé qu'il fallait peut-être enregistré le fichier pour qu'il devienne effectivement un .csv, mais là non plus, cela ne marche pas.
Je te remercie pour ton aide, et je vais me contenter du code de Dan :
Sub test()
Dim wb As Workbook
For Each wb In Workbooks
If UCase(wb.Name) Like "SOL*" Then wb.Close SaveChanges:=False: Exit For
Next wb
End Subqui permet de fermer un fichier à chaque clic sur le bouton de commande.
Encore merci à toi pour tes efforts.
Je laisse malgré tout ce sujet ouvert, je pars en vacances, et le fermerai à mon retour s'il n'y a pas de nouvelles propositions.
Bon courage à tous.
Bien cordialement.