Sélectionner et Importer fichier txt dans Excel
Bonjour,
Complètement débutant, quasiment sans notion, je souhaiterais, dans un classeur excel :
- aller sélectionner un fichier txt sur des supports variables DD ou USB (exemple de fichier à importer en pièce jointe)
- importer ce fichier txt dans un classeur excel de la façon suivante :
- les 8 caractères suivants en format txt
- les 8 caractères suivants en format txt
- les 4 caractères suivants en format heure
- les 4 caractères suivants en format heure
- les 7 caractères suivants (O/N) dans 7 colonnes différentes en les transformant en O=1 et N=0
- les 6 caractères suivants en format txt
- les 6 caractères suivants en format txt
Je suis conscient de faire faire le travail, mais, en étudiant ensuite la macro, j'espère pouvoir me lancer.
A bientôt 54 ans, j'ai beau aller voir dans différents forums, j'ai un peu de mal à me lancer
Grand merci par avance
Bonsoir,
A toi de commencer par fournir un fichier texte dont le contenu répond à ce que tu demandes !
Cordialement.
Bonsoir,
Merci de votre réponse aussi rapide
Un fichier du type joint
Encore merci
La macro ouvre le fichier txt, le traite, place le résultat sur une feuille.
Pour finaliser, il me faudrait avoir les éléments d'environnement et que tu précises le processus...
Je propose un classeur dédié au traitement : tu notes dans une cellule le nom du fichier, dans une autre le chemin du dossier, et la macro opère à partir de ces informations.
De même, il faudrait savoir si chaque fichier traité ira dans un classeur spécifique ou un classeur les regroupant d'une part.
Et sous quel nom l'enregistrer et dans quel dossier (chemin)
Eventuellement aussi si tu souhaites pouvoir traiter plusieurs fichiers txt simultanément.
Cordialement.
Regarde aussi si le résultat en Feuil1 te convient ou si tu souhaites une mise en forme particulière (là je me suis contenté d'un ajustement automatique des largeurs de colonnes).
Bonjour et merci.
En fait, je souhaiterais ouvrir le classeur et par un bouton de commande situé sur la feuille excel, afficher une boite de dialogue qui invite à aller chercher le fichier txt sur le DD ou sur un autre support. Ce n'est jamais le même fichier, ce sont des fichiers hebdomadaires.
A la sortie de cette boite de dialogue, quand le chemin et le fichier ont été choisis, le programme se lance automatiquement (Si pas de fichier trouvé, pas de processus de traitement, rester simplement sur la feuille),
Le txt me fournit des interventions par jour (L, M, M ,J, V, S D).
Or, il m'est nécessaire aussi de connaitre le nombre d'interventions dans la période nocturne 20h00 - 05h00 en chevauchement sur 2 jours, soit L/M, M/M, M/J etc... (ça, je pense que je saurai faire)
Au risque de paraitre exigent, serait-il possible d'avoir "en marge" des explications afin de pouvoir à l'avenir monter d'autres petites manips ?
La mise en page, quant à elle, n'a pas d'importance. C'est un document de travail, pas de présentation.
Merci par avance et bonne journée
Bonjour,
Résumons-nous :
- Une boîte de dialogue d'ouverture de fichier où tu iras toi-même sélectionner le fichier à ouvrir... OK !
- Pour l'enregistrement : il conviendrait de préciser :
• soit on ne l'enregistre pas, on le l'affiche et à toi de poursuivre !
• soit on l'enregistre, il faut donc noter quelque part son nom et le chemin du dossier...
• ...ou même mécanisme qu'à l'ouverture, boîte de dialogue et c'est toi qui ira désigner le dossier et indiquera le nom !
Les jours je suppose que ce sont les 7 colonnes 1/0 qui les indiquent...
Si les heures indiquent un horaire de début et fin d'intervention, on peut effectivement te comptabiliser celles situées dans une plage déterterminée ou les signaler dans la 15e colonne...
(Il conviendrait de préciser si c'est "à cheval sur 2 jours [soit commencée avant minuit et terminée après] ou située dans la plage horaire 20:00/05:00.)
Si la mise en forme te convient, pas de raison d'y retoucher.
Je noterai quelques commentaires dans le code, qui te permettront de te repérer, à avoir quel fragment de code fait quoi... mais ne compte pas trop pouvoir introduire des ajouts ou modifications sans une connaissance minimale des rudiments de VBA.
Cordialement.
(Re)bonjour,
l'option "ouverture, boîte de dialogue et c'est moi qui sélectionne le fichier", c'est exactement ça.
La sélection du fichier et ok entraine l'importation dans excel des données.
Ceci étant fait, le txt ne me sert plus à rien, je le stocke dans un répertoire.
Le fichier txt me fournit des opérations dans une plage 00h00-23h59.
Je reçois ce fichier à S-5.
Le but est de comptabiliser le nombre d'opérations qui débutent (la fin importe peu) dans une plage horaire (ex. 20h00-05h00).
J'imagine que tu as remarqué que certaines commencent et finissent dans la journée, mais celles de nuit sont généralement début le lundi soir et fin le mardi matin par exemple, ou début le mardi très tôt entre 00h00 et 05h00, par exemple à 00h25, donc dans la nuit de LU/MA. Même chose pour chaque jour de la semaine.
Quoi que s'il est possible de prévoir en variable la plage début-fin, ce serait l'idéal, en cas de modification de tableau de service (passage de 20h00-05h00 à 21h00-06h00, sait-on jamais...)
Ensuite, le tableau créé, je le copierai manuellement dans une autre feuille du classeur que je renommerai du n° de semaine pour archivage.
J'avais "bidouillé" l'importation avec une macro, mais, dans la macro, le chemin et le nom du fichier à importer étaient enregistrés, donc, ça ne fonctionnait qu'une fois. je triais ensuite par heure de début et insérais des lignes de sous-totaux des périodes début 00h00 à 05h00 et 20h00-23h59. Ensuite, je faisais le total de la période nocturne en faisant la somme, par exemple, de lundi 20h00-23h59 et mardi 00h00-05h00, même opération pour chaque nuit de la semaine. Un vrai bricolage pas très élégant...
Merci de l'attention que tu portes à mes questions
Bien cordialement
Bonne soirée
Voilà donc la macro définitive, version commentée :
Sub TraiterTxt()
Dim Tbl(), Ftx, Stx, Ltx$, Utx$, n%, i%, ni%, hd, hf, hh
'Sélection fichier TXT
Ftx = Application.GetOpenFilename("Text Files (*.txt), *.txt", , "Sélectionnez un fichier")
If Ftx = False Then Exit Sub
'Heures début et fin de plage d'intervention Nuit
hd = TimeValue("20:00:00"): hf = TimeValue("05:00:00")
Application.ScreenUpdating = False
'Ouverture fichier sélectionné
With Workbooks.Open(Ftx).Worksheets(1)
'dimensionnement texte sur feuille 1 (dernière ligne occupée)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
'dimensionnement tableau résultat (n lignes, 14 colonnes)
ReDim Tbl(1 To n, 13)
'tableau des rangs des caractères débutant chaque fragment d'une ligne du texte
' à mettre dans une colonne distincte, la longueur de chaque fragment est défini
' par la différence avec le rang du suivant, le dernier rang ne sert qu'à définir
' la longueur du dernier fragment
Stx = Array(1, 3, 11, 19, 23, 27, 28, 29, 30, 31, 32, 33, 34, 40, 46)
'boucle sur chaque ligne de texte
For i = 1 To n
'recueil de la ligne de texte
Ltx = .Cells(i, 1)
'boucle d'extraction des fragments (14 fragments)
For j = 0 To 13
'extraction de chaque fragment
Utx = Mid(Ltx, Stx(j), Stx(j + 1) - Stx(j))
'traitement de chaque fragment selon sa position dans le texte
Select Case j
'valeurs O ou N à remplacer par 1 ou 0
Case 5 To 11
Tbl(i, j) = IIf(Utx = "O", 1, 0)
'valeurs texte : on fait précéder un chiffre par une apostrophe
' pour éviter conversion automatique en nombre par Excel
Case 1, 2, 12, 13
Tbl(i, j) = IIf(IsNumeric(Left(Utx, 1)), "'" & Utx, Utx)
'valeurs à convertir en heures (insertion du séparateur horaire (:))
Case 3, 4
Tbl(i, j) = Left(Utx, 2) & ":" & Right(Utx, 2)
'valeur numérique
Case 0
Tbl(i, j) = CInt(Utx)
End Select
Next j
'récupération de l'heure de début
hh = TimeValue(Tbl(i, 3))
' on comptabilise si cette heure se situe en plage Nuit
If hh >= hd Or hh < hf Then ni = ni + 1
Next i
End With
'Fermeture fichier texte
ActiveWorkbook.Close False
With ThisWorkbook
'Ajout d'une feuille au classeur de traitement
'on dimensionne la plage résultat (n ligne, 14 colonnes)
With .Worksheets.Add(before:=Worksheets(1)).Range("A1").Resize(n, 14)
'on affecte le tableau résultat à cette plage
.Value = Tbl
'on opère un ajustement automatique des largeurs de colonnes
.Columns.AutoFit
'2 lignes sous le texte traité, on indique le nombre d'interventions débutant en Nuit
.Cells(n + 2, 1) = "Nb d'interventions débutant entre " & Format(hd, "hh""h""mm") _
& " et " & Format(hf, "hh""h""mm") & " : " & ni
End With
'on exporte la feuille résultat dans un nouveau classeur
.Worksheets(1).Move
End With
End Sub
Conformément à tes dernières spécifications : sélection du fichier à traiter au moyen d'un boîte de dialogue, définition des heures Nuit dans des variables (si elles changent, on modifiera l'initialisation de hd et hf en début de macro), comptabilisation au cours du traitement des heures de début situées en plage Nuit, fermeture du fichier texte en fin de traitement, résultat dans un nouveau classeur (obtenu par ajout de feuille pour y affecter résultat et export de cette feuille dans un nouveau classeur) non enregistré.
Cordialement.
Bonjour,
Merci d'avoir fait si vite.
En fait, le résultat attendu est une somme pour chaque période de nuit (voir fichier JPG joint), sachant d'autre part que le nuit SA/DI et DI/LU ne sont pas ouvrées.
D'autre part, je souhaiterais copier manuellement le résultat (tableau résultant de l'importation et le comptage) dans une feuille du même classeur afin de pouvoir éventuellement apporter des commentaires.
En fait, au risque de paraître trop exigeant, je souhaiterais que la macro
- m'invite sur clic du bouton à aller chercher et sélectionner le fichier txt
- efface la feuille 1 du classeur si un fichier a été sélectionné, rien si aucun fichier sélectionné
- importe le contenu du fichier txt dans la feuille 1 avec tri par ordre croissant de la colonne heure début.
Merci par avance et bonne journée
Bien cordialement
Fichier réaménagé.
(Re)bonjour,
Je joints 2 fichiers
- Un exemple de fichier txt à traiter.
- le fichier excel avec la macro.
En effet, LU/MA (Nuit de lundi à mardi) est la somme des opérations de lundi 20h00 à 23h59 et de mardi 00h00 à 05h00
MA/ME (Nuit de mardi à mercredi) est la somme des opérations de mardi 20h00 à 23h59 et de mercredi 00h00 à 05h00
ME/JE (Nuit de mercredi à jeudi) est la somme des opérations de mercredi 20h00 à 23h59 et de jeudi 00h00 à 05h00
Etc...
J'ai essayé de visualiser ces périodes avec des couleurs dans la deuxième feuille.
Pour le reste, c'est vraiment ce qu'il me fallait
Encore merci
Bien cordialement
Avant de regarder quoi que ce soit !
Ton dernier schéma indiquait : "LU/MA" en col. F et ainsi de suite pour les colonnes suivantes. Je m'y suis fié.
Ta directive antérieure indiquait de ne tenir compte que des heures de début, ce que j'a fait.
Je ne sais pas (et ne veut pas savoir !) ce que sont les opérations de lundi 20h00 à 23h59 et mardi 00h00 à 05h00 !
Cordialement.
Bonjour
Désolé. Je sais ce que je souhaite obtenir. Il est vrai qu'à distance, n'ayant pas su exprimer correctement mes besoins, je suppose qu'il n'est pas facile d'interpréter mes explications.
Quoiqu'il en soit, je peux déjà utiliser ce que j'ai actuellement pour l'importation.
Un grand merci
Bonne journée et bonne continuation.
Bonjour,
Réaliser une description en termes de logique n'est certainement pas un exercice facile, et je ne prétendrai d'ailleurs pas être moi-même en mesure de le réaliser toujours de façon ne serait-ce que satisfaisante !
Sans épiloguer plus...
Sub InterventionsNuit()
Dim hn(6) As Integer, hd, hf, hh, n%, i%, j%, k%
hd = TimeValue("20:00:00"): hf = TimeValue("05:00:00")
With ActiveSheet
If IsEmpty(.Range("A1")) Then Exit Sub
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 1 To n
hh = .Cells(i, 4)
If hh >= hd Or hh < hf Then
k = IIf(hh >= hd, 6, 7)
For j = 6 To 12
If .Cells(i, j) = 1 Then hn(j - k) = hn(j - k) + 1
Next j
End If
Next i
.Cells(n + 2, 1) = "Nb d'interventions " & Format(hd, "hh""h""mm") & "-" _
& Format(hf, "hh""h""mm")
With .Cells(n + 2, 6).Resize(, 7)
.Value = hn
.Columns.AutoFit
End With
End With
End Sub
vois ce que donne cette version : les modifications par rapport à la précédente sont surlignées.
Cordialement.
Loin de moi l'envie de baisser les bras, c'est plutôt le fait de "passer commande" gratuitement qui me gêne.
De plus, il y a 20 ans, j'avais en mémoire plus d'une soixantaine de n° de téléphone. Aujourd'hui, avec les portables, j'ai du mal à me souvenir de mon propre n°. Trop se simplifier la vie amène à une forme de paresse intellectuelle à mon avis.
Néanmoins, et bien que mon initiation au basic remonte à plus de 30 ans (lycée), sans de pratique depuis, je vais remettre le nez dedans.
Je vais tester sur plusieurs semaines cette macro.
En te remerciant encore
A bientôt.
PS : les "interventions" ne sont pas des mouvements frauduleux d'argent vers des paradis fiscaux, mais des planches de coupures programmées d'alimentation électrique d'un réseau pour maintenance.
les "interventions" ne sont pas des mouvements frauduleux d'argent vers des paradis fiscaux,
Je n'ai point conçu de soupçon de cet ordre !
Voilà donc la macro définitive, version commentée :
Sub TraiterTxt() Dim Tbl(), Ftx, Stx, Ltx$, Utx$, n%, i%, ni%, hd, hf, hh 'Sélection fichier TXT Ftx = Application.GetOpenFilename("Text Files (*.txt), *.txt", , "Sélectionnez un fichier") If Ftx = False Then Exit Sub 'Heures début et fin de plage d'intervention Nuit hd = TimeValue("20:00:00"): hf = TimeValue("05:00:00") Application.ScreenUpdating = False 'Ouverture fichier sélectionné With Workbooks.Open(Ftx).Worksheets(1) 'dimensionnement texte sur feuille 1 (dernière ligne occupée) n = .Cells(.Rows.Count, 1).End(xlUp).Row 'dimensionnement tableau résultat (n lignes, 14 colonnes) ReDim Tbl(1 To n, 13) 'tableau des rangs des caractères débutant chaque fragment d'une ligne du texte ' à mettre dans une colonne distincte, la longueur de chaque fragment est défini ' par la différence avec le rang du suivant, le dernier rang ne sert qu'à définir ' la longueur du dernier fragment Stx = Array(1, 3, 11, 19, 23, 27, 28, 29, 30, 31, 32, 33, 34, 40, 46) 'boucle sur chaque ligne de texte For i = 1 To n 'recueil de la ligne de texte Ltx = .Cells(i, 1) 'boucle d'extraction des fragments (14 fragments) For j = 0 To 13 'extraction de chaque fragment Utx = Mid(Ltx, Stx(j), Stx(j + 1) - Stx(j)) 'traitement de chaque fragment selon sa position dans le texte Select Case j 'valeurs O ou N à remplacer par 1 ou 0 Case 5 To 11 Tbl(i, j) = IIf(Utx = "O", 1, 0) 'valeurs texte : on fait précéder un chiffre par une apostrophe ' pour éviter conversion automatique en nombre par Excel Case 1, 2, 12, 13 Tbl(i, j) = IIf(IsNumeric(Left(Utx, 1)), "'" & Utx, Utx) 'valeurs à convertir en heures (insertion du séparateur horaire (:)) Case 3, 4 Tbl(i, j) = Left(Utx, 2) & ":" & Right(Utx, 2) 'valeur numérique Case 0 Tbl(i, j) = CInt(Utx) End Select Next j 'récupération de l'heure de début hh = TimeValue(Tbl(i, 3)) ' on comptabilise si cette heure se situe en plage Nuit If hh >= hd Or hh < hf Then ni = ni + 1 Next i End With 'Fermeture fichier texte ActiveWorkbook.Close False With ThisWorkbook 'Ajout d'une feuille au classeur de traitement 'on dimensionne la plage résultat (n ligne, 14 colonnes) With .Worksheets.Add(before:=Worksheets(1)).Range("A1").Resize(n, 14) 'on affecte le tableau résultat à cette plage .Value = Tbl 'on opère un ajustement automatique des largeurs de colonnes .Columns.AutoFit '2 lignes sous le texte traité, on indique le nombre d'interventions débutant en Nuit .Cells(n + 2, 1) = "Nb d'interventions débutant entre " & Format(hd, "hh""h""mm") _ & " et " & Format(hf, "hh""h""mm") & " : " & ni End With 'on exporte la feuille résultat dans un nouveau classeur .Worksheets(1).Move End With End Sub
Conformément à tes dernières spécifications : sélection du fichier à traiter au moyen d'un boîte de dialogue, définition des heures Nuit dans des variables (si elles changent, on modifiera l'initialisation de hd et hf en début de macro), comptabilisation au cours du traitement des heures de début situées en plage Nuit, fermeture du fichier texte en fin de traitement, résultat dans un nouveau classeur (obtenu par ajout de feuille pour y affecter résultat et export de cette feuille dans un nouveau classeur) non enregistré.
Cordialement.
Bonjour MFerrand, bonjour le forum,
Ton code m'intéresse beaucoup mais je voudrais qu'il prenne tout le fichier .txt comme il est mais que ça soit mis sur une feuille spécifique dans le classeur, aurais-tu une piste?
Merci
Cdlt