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 2 premiers caractères en format nombre entier

- 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

12831aht.txt (9.65 Ko)

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. Le code n'est très long (si tu as eu la curiosité d'aller voir) mais justement parce qu'il repose sur des instructions VBA qu'il convient d'apprendre pour s'en servir (boucles, tableaux, instructions conditionnelles...)

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.
Serait-il possible d'avoir une macro qui s'arrête à ce point et une autre qui reprendrait la première avec le calcul des interventions de nuit ?

Merci par avance et bonne journée

Bien cordialement

image1

Fichier réaménagé.

(Re)bonjour,

Je joints 2 fichiers

  • Un exemple de fichier txt à traiter.
  • le fichier excel avec la macro.
En lançant la macro de calcul des opérations de nuits, les calculs ne sont pas bons (Voir la 2ème feuille, du classeur, renommée "CalculErroné").

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

5s24aht.txt (4.10 Ko)

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 ! Il me faut seulement une condition définie exhaustivement en termes logiques à partir des heures en colonnes D et E et des 1 en colonnes F à L (pour un résultat porté en bas desdites colonnes F à L).

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 ! Mais je suis tout de même toujours un peu surpris de voir la majorité de mes correspondants reculer devant l'obstacle ! C'est tout de même un exercice éminemment instructif, qui permet entre autres de s'extraire de l'examen d'un problème pour le voir en quelque sorte de l'extérieur...

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

Rechercher des sujets similaires à "selectionner importer fichier txt"