VBA - Export colonne vers *.txt

Bonjour à tous,

J'aurai besoin d'aide concernant un export de colonne d'un fichier excel vers un fichier texte avec les contraintes suivantes :

- La macro copie à l'ouverture ou fermeture du fichier excel de A2 vers la dernière cellule de la colonne A contenant des données et colle vers ce fichier texte.

J'insère en PJ le fichier source excel.

En vous remerciant par avance pour vos contributions.

Une bonne journée.

Bonjour,

Sub EnregTxt()
    Dim nf$
    With ThisWorkbook
        With .Worksheets(1)
            nf = .Name & ".txt"
            .Columns("B:E").Delete
            .Rows(1).Delete
        End With
        .SaveAs .Path & "\" & nf, xlTextWindows
        .Close False
    End With
End Sub

Cordialement.

Bonjour MFerrand,

Merci bien pour cette contribution.

Il subsiste cependant un petit soucis.

Dans le fichier texte, à la suite de chaque numéro, il y a des "espaces" on dirait.

Y aurait-il peut-être une solution pour supprimer ces "caractères invisibles" à l'export? De telle manière que lorsque j'effectue un CTRL+A j'ai uniquement les matricules.

Ci-joint le fichier XLSM et le TXT correspondant exporté.

Merci encore.

170saisie-masse-1543-sirh.txt (708.00 Octets)

C'est que la zone utilisée de ton classeur couvrait jusqu'à la colonne L, d'où 7 tabulations ajoutées correspondant aux colonnes vides de la zone. En supprimant toute la zone sauf A on élimine ce problème...

Sub EnregTxt()
    Dim nf$
    With ThisWorkbook
        With .Worksheets(1)
            nf = .Name & ".txt"
            .UsedRange.Offset(, 1).Clear
            .Rows(1).Delete
        End With
        .SaveAs .Path & "\" & nf, xlTextWindows
        .Close False
    End With
End Sub

Cordialement.

Bonsoir MFerrand,

Merci bien pour cette contribution, j'ai pas pu répondre plus tôt car je tentais de faire une adaptation pour que cette macro se lance à la fermeture du fichier excel SANS PASSER par le "thisworkbook". Sans succès.

On pourrais imaginer un lancement de la macro a l'ouverture ou fermeture du fichier ou bien si la souris bouge, enfin un événement j’allais dire "qui ne se déclenche en transparence" ?

Qu'en penses-tu ? Merci par avance.

Christophe.

je tentais de faire une adaptation pour que cette macro se lance à la fermeture du fichier excel SANS PASSER par le "thisworkbook".

Je ne comprends pas bien ! Si tu veux lancer la macro à partir d'un évènement, s'il s'agit d'un évènement classeur (ouverture, fermeture, etc.) c'est dans ThisWorkbook que tu vas capter l'évènement...

Cordialement.

Bonsoir,

Je vais planter le décor afin que tu puisses te faire une idée plus globale.

J'ai un fichier qui s’appelle "excel pratique" A, sur celui-ci j'ai une macro qui copie les colonnes de A à E jusqu’à le dernière ligne contenant des données tout en supprimant les lignes dont le nombre de jour est = 0 et le colle dans un autre fichier excel B.

En sachant que j'ai 40 fichiers comme celui-ci, j'actionne donc cette macro manuellement sur chaque fichier et le contenu s'exportent les uns en dessous des autres au fur et a mesure dans le fichier B.

Une fois cette manip finie (40 fois), le but serait donc d'obtenir un fichier txt reprenant les données du fichier B de A2 jusqu’à la dernière cellule contenant une donnée de la colonne A à la fermeture de ce fichier B.

J'ai tenté de détailler au maximum afin de pouvoir t'aider à la compréhension, je reste néanmoins à ta disposition pour compléter.

Je suis assez réactif.

Ci joint le fichier "A" et la macro.

Merci encore pour ta contribution sur cette problématique.

Cordialement.

Christophe.

Sub InjectionGlobal_0667()
Dim Chemin As String, Fichier As String
Dim Ws As Worksheet
Dim NbLg As Long
Dim i As Long

'ActiveWorkbook.Unprotect Password:="200997"

' Créer le fichier intial avec les données

  Application.ScreenUpdating = False
  Set Ws = Sheets("Saisie_masse_0667_SIRH")
  Chemin = ThisWorkbook.Path & Application.PathSeparator
  Fichier = "Saisie_masse_0667_SIRH.xlsx"
  If Dir(Chemin & Fichier) = "" Then
    Ws.Visible = xlSheetVisible
    Ws.Copy
'    Ws.Visible = xlSheetHidden
    ActiveSheet.DrawingObjects.Delete
    Application.DisplayAlerts = False
    Range("A2:E1000").Select
    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    Range("A2").Select
  For i = Range("E65536").End(xlUp).Row To 1 Step -1
   If Cells(i, 5) = 0 Then Rows(i).Delete
  Next i
    ActiveWorkbook.SaveAs Chemin & Fichier, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
    ActiveWorkbook.Close
  Else

  ' Rajoute les données à la suite de la dernière ligne contenant des données.

    NbLg = Ws.Range("A" & Rows.Count).End(xlUp).Row
    If NbLg > 1 Then
      With Workbooks.Open(Chemin & Fichier)
        Ws.Range("A2:E" & NbLg).Copy .Sheets(1).Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
               Range("A2:E1000").Select
    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    Range("A2").Select
  For i = Range("E65536").End(xlUp).Row To 1 Step -1
   If Cells(i, 5) = 0 Then Rows(i).Delete
  Next i
        .Close savechanges:=True
      End With

    End If
  End If
  'ActiveWorkbook.Protect Password:="200997"

End Sub
179excel-pratique.xlsm (28.49 Ko)

Je regarderai le détail demain, mais j'ai l'impression que ce que tu dis vouloir faire ne correspond pas exactement à ce que tu fais...

Bonne nuit.

Pas de problème, merci encore pour le temps que tu m'octroie.

Pour tester ouvre le fichier joint. Si tu clique 1 fois sur le bouton il va créer le fichier export xlsx (B).

Si tu reclique sur le bouton (pour simuler l'ouverture d'un autre fichier A) cela va rajouter les résultats à la suite dans le fichier export B tout en classant les numéros matricule chronologiquement.

Tout cela fonctionne bien et correspond à mes besoins.

A l'instant T aucune création du fichier texte n'est en place.

Le but serait donc d'obtenir un fichier txt reprenant les données du fichier B de A2 jusqu’à la dernière cellule contenant une donnée de la colonne A à la fermeture ou ouverture de ce fichier B.

À plus tard.

Ok !

Tout cela me paraît un peu lourd...

Je déplore naturellement la présence de Select (au détriment de qualificateurs d'objet...), une indentation pas vraiment rigoureuse... mais ce qui affectera le plus l'opération c'est :

  • le fait (si j'ai bien compris) que cette macro soit dupliquée en 40 exemplaires dans chacun des classeurs à rassembler ; elle ne devrait figurer qu'en un seul exemplaire, soit dans le classeur cible (alors préalablement constitué), soit dans un classeur tiers à partir duquel l'opération serait commandée...
  • le fait d'opérer un tri sur la colonne A avant épuration, et d'épurer ensuite sur l'ensemble de la feuille cible, et ligne par ligne ; il me semble qu'un tri sur la colonne E serait plus judicieux et renverrait les valeurs 0 en fin de liste, un repérage de la partie de tableau à prélever permettrait de le faire d'un seul bloc et sans procéder par copier-coller, et élimine l'épuration ultérieure, le tri sur la colonne A boucle l'opération (d'un classeur) sur la feuille cible...

Je n'ai en outre pas compris :

  • pourquoi le classeur source est enregistré à la femeture ; la logique voudrait qu'il ne le soit pas...
  • et cette histoire de feuille visible ou non... ; on peut de toute façon opérer sur des feuilles masquées.

Enfin, la question initiale portait sur l'enregistrement d'une colonne du classeur cible en fichier texte. Je ne vois pas où il y a problème à cet égard. Elle peut être lancée une fois que ton classeur cible est complet !

La discussion d'opportunité peut porter sur l'opération des 40 classeurs : doit-elle être réalisée classeur source par classeur source, ou peut-on en faire une seule opération (ouverture des fichiers en boucle, traitement de chacun...) ?

Le fichier texte vient de toute façon à la suite, si une seule opération globale, il peut y être intégré, si opérations fractionnées, ce sera la dernière du lot...

Cordialement.

Je reconnais que c'est pas optimisé aux petits oignons

Pour ce que tu n'as pas saisis :

pourquoi le classeur source est enregistré à la femeture

Parce qu'en fait ce tableau fait partie d'un fichier avec des états et planning et que les données doivent être sauvegardées.

et cette histoire de feuille visible ou non... ; on peut de toute façon opérer sur des feuilles masquées.

Oui, en fait cet onglet est la "partie technique" du fichier elle est donc cachée, seul un planning et des états sont visibles par l'agent. Le strict nécessaire pour qu'il en casse le moins possible...

Enfin, la question initiale portait sur l'enregistrement d'une colonne du classeur cible en fichier texte. Je ne vois pas où il y a problème à cet égard. Elle peut être lancée une fois que ton classeur cible est complet !

Oui c'est exactement ce que je souhaite faire, lancer la macro ci-dessous une fois que le dossier cible est complet mais comment faire pour cette macro se copie du fichier source au fichier cible nativement pour s'exécuter à l'ouverture ou fermeture du fichier cible une fois qu'il est complet pour générer ce fichier txt ?

    Sub EnregTxt()
        Dim nf$
        With ThisWorkbook
            With .Worksheets(1)
                nf = .Name & ".txt"
                .UsedRange.Offset(, 1).Clear
                .Rows(1).Delete
            End With
            .SaveAs .Path & "\" & nf, xlTextWindows
            .Close False
        End With
    End Sub

pourquoi le classeur source est enregistré à la femeture

Parce qu'en fait ce tableau fait partie d'un fichier avec des états et planning et que les données doivent être sauvegardées.

Tu n'opères pas de modification sur le classeur source, il n'y a donc pas lieu de l'enregistrer à nouveau, il n'a pas changé.

Ne pas l'enregistrer constitue au contraire une garantie de son intégrité en cas de modification intempestive non voulue lors de l'opération.

et cette histoire de feuille visible ou non... ; on peut de toute façon opérer sur des feuilles masquées.

Oui, en fait cet onglet est la "partie technique" du fichier elle est donc cachée, seul un planning et des états sont visibles par l'agent. Le strict nécessaire pour qu'il en casse le moins possible...

Très bien ! Mais inutile de démasquer...

Enfin, la question initiale portait sur l'enregistrement d'une colonne du classeur cible en fichier texte. Je ne vois pas où il y a problème à cet égard. Elle peut être lancée une fois que ton classeur cible est complet !

Oui c'est exactement ce que je souhaite faire, lancer la macro ci-dessous une fois que le dossier cible est complet mais comment faire pour cette macro se copie du fichier source au fichier cible nativement et s’exécute à l'ouverture ou fermeture du fichier cible pour générer ce fichier txt ?

Tu as zappé une partie de mon post :

elle ne devrait figurer qu'en un seul exemplaire, soit dans le classeur cible (alors préalablement constitué), soit dans un classeur tiers à partir duquel l'opération serait commandée...

Ce qui vaut pour ta macro vaut pour toutes ! Et compte-tenu de tes compléments, un classeur dédié à l'opération semble la solution la plus rationnelle.

Cordialement.

Rechercher des sujets similaires à "vba export colonne txt"