IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Automatisation d'exportation en fichier texte d'une partie d'un fichier


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut Automatisation d'exportation en fichier texte d'une partie d'un fichier
    Bonjour,

    je voudrais automatiser un certain nombre d'actions relatives à plusieurs fichiers Excel dont le comportement doit être identique.

    Je pars d'un fichier contenu dans le dossier lib.nom1 et qui s'appelle nom1.xls.

    J'ai actuellement 2 problèmes principaux que je n'arrive pas à résoudre :
    1) Je voudrais pouvoir spécifier une sorte de suffixe fixé au départ (par exempel dans une variable texte nomVariante) à tous mes fichiers de sortie, de sorte que le fichier nom2 ouvert par mes soins puisse être enregistré comme nom2_nomVariante, et ainsi de suite pour d'autres fichiers du même genre.
    2) J'aimerais ne pas avoir les boîtes de dialogue me demandant s'il faut enregistrer les modifications au fichier txt créé.

    Voilà mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    'Sélection de la feuille à exporter en fichier texte puis exportation
        Sheets("lib.nom1").Select
        ActiveWorkbook.SaveAs Filename:= _
            "D:\Données\lib.nom1\fichier1_nomVariante.txt" _
            , FileFormat:=xlText, CreateBackup:=False
     
     
    ' *****************************************
    ' ********* Ouverture du 2ème fichier ************
    ' *****************************************
        ChDir _
            "D:\Données\lib.nom2"
        Workbooks.Open Filename:= _
            "D:\Données\lib.nom2\avpf.xls" _
            , UpdateLinks:=3
    ' Sauvegarde
        ActiveWorkbook.Save
    ' Exportation du fichier texte
        Sheets("lib.nom2").Select
        ActiveWorkbook.SaveAs Filename:= _
            "D:\Données\lib.nom2\nom2_nomVariante.txt" _
            , FileFormat:=xlText, CreateBackup:=False
    ' Fermeture du fichier sans sauvegarde
        ActiveWindow.Close
    ' Ouverture du fichier texte pour changer les virgules en points
        ChDir _
            "D:\Données\lib.nom2"
        Workbooks.OpenText Filename:= _
            "D:\Données\lib.nom2\nom2_nomVariante.txt" _
            , Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
            :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=True _
            , Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1) _
            , Array(2, 1))
        Cells.Replace What:=",", Replacement:=".", LookAt:=xlPart, SearchOrder _
            :=xlByRows, MatchCase:=False
        ActiveWorkbook.Save
        'As Filename:= _
            "D:\Données\lib.nom2\nom2_nomVariante.txt" _
            , FileFormat:=xlText, CreateBackup:=False
    ' Fermeture du fichier texte
        ActiveWindow.Close
    Si quelqu'un a une idée pour m'aider à avancer sur un de ces points, il sera le bienvenu !
    Merci d'avance,

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 87
    Points : 93
    Points
    93
    Par défaut
    les noms de tes feuilles et fichiers sont indiqués entre guillemets :
    "lib.nom1"
    "D:\Données\lib.nom1\fichier1_nomVariante.txt"

    Excel comprend que ce sont des chaines de caractères invariables. et non des variables : il ne remplacera pas par la valeur de NomVariante

    je te propose quelques corrections : à adapter à tes besoins

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    Dim Nom1, Path1, Nom2, Path2, NomVariante, NomAUtiliser as string
     
    ' ************************************************
    ' * 1er fichier est supposé ouvert, actif (au premier plan)*
    ' ************************************************
    Nom1 = ActiveWorkbook.name ' recuperer le nom du fichier 1
    nom1 = left (Nom1, len (Nom1)-4) ' enleve l'extension
    path1 = "D:\Données\lib.nom1\" 'c'est un texte fixe
     
    'Sélection de la feuille à exporter en fichier texte
    Sheets("lib.nom1").Select ' c'est un nom fixe = ne selectionnera que la feuille appelée "lib.nom1"
    'si tu as besoin ca peut etre remplacé par la valeur d'une variable
    ' puis exportation
    NomAUtiliser = path1 & Nom1 & "_" & NomVariante & ".txt"
    ActiveWorkbook.SaveAs Filename:= NomAUtiliser, FileFormat:=xlText, CreateBackup:=False
     
    ' *****************************************
    ' ********* Ouverture du 2ème fichier ************
    ' *****************************************
     
    Workbooks.Open Filename:="D:\Données\lib.nom2\avpf.xls", UpdateLinks:=3
    ' Sauvegarde
    ActiveWorkbook.Save
     
    ' Exportation du fichier texte
    Sheets("lib.nom2").Select 'meme remarque
     
    Nom2 = ActiveWorkbook.name ' recuperer le nom du fichier 2
    nom2 = left (Nom2, len (Nom2)-4) ' enleve l'extension
    path2 = "D:\Données\lib.nom2\" 'c'est un texte fixe
     
    NomAUtiliser = path2 & Nom2 & "_" & NomVariante & ".txt"
    ActiveWorkbook.SaveAs Filename:= NomAUtiliser, FileFormat:=xlText, CreateBackup:=False
     
    ' Fermeture du fichier sans sauvegarde
    ActiveWindow.Close
    pour ce qui est de changer les virgules en points, je suppose que cela concerne les données numériques que tu veux mettre en format US. il est possible de paramétrer directement ca dans les options régionales de Windows, avant de lancer ta macro. Sinon ton option de rechercher/remplacer est possible, mais en utilisant le bon nom de fichier (celui indiqué par NomAUtiliser).

    tiens nous au courant

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bonjour et merci pour cette réponse !
    Je ne voyais pas comment introduire les variables pour les noms, ça m'a bien éclairé.

    J'ai rajouté un petit bout de code pour permettre à un utilisateur de choisir l'extension pour le nom de variante, ainsi que le chemin d'accès au dossier.
    J'ai trouvé l'option permettant d'éviter la boîte Excel qui demande s'il faut enregistrer ou non. Il suffit de rajouter SaveChanges:=False après la commande ActiveWindow.Close

    Voilà ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    ' Déclaration des variables
        Dim Nom1, Path1, Nom2, Path2, PathGen, Lib As String
        Dim NomVariante, NomOuverture, NomAUtiliser As String
     
     
    ' Nom variante choisi par l'utilisateur
    NomVariante = InputBox$("Choisissez le nom de la variante", "Choix du nom de la variante", "_LT_")
     
    ' Déclaration des variables "fixes" pour les dossiers
    PathGen = InputBox$("Choisissez le dossier où sont contenus les données", "Choix du dossier", "D:\Données\")
    'PathGen = "D:\Données\" 'Texte fixe
    Lib = "maLib"
     
    ' ******************************************************
    ' * 1er fichier supposé ouvert, actif (au premier plan)*
    ' ******************************************************
    Nom1 = ActiveWorkbook.Name ' recupere le nom du fichier 1
    Nom1 = Left(Nom1, Len(Nom1) - 4) ' enleve l'extension
    Path1 = PathGen & Lib & "." & Nom1 & "\"
     
    ' Sélection de la feuille à exporter en fichier texte puis exportation
        Sheets("maLib.nom1").Select
        NomAUtiliser = Path1 & Nom1 & NomVariante & ".txt"
        ActiveWorkbook.SaveAs Filename:=NomAUtiliser, FileFormat:=xlText, CreateBackup:=False
     
     
    ' *****************************************
    ' ******* Ouverture du fichier 2 *******
    ' *****************************************
     
    ' Déclaration des noms des fichiers à traiter
        Nom2 = "nom2"
        Path2 = PathGen & Lib & "." & Nom2 & "\"
     
        NomOuverture = Path2 & Nom2 & ".xls"
        NomAUtiliser = Path2 & Nom2 & NomVariante & ".txt"
     
        ChDir Path2
        Workbooks.Open Filename:=NomOuverture, UpdateLinks:=3
    ' Sauvegarde
        ActiveWorkbook.Save
    ' Exportation du fichier texte
        Sheets("maLib.nom2").Select
        ActiveWorkbook.SaveAs Filename:=NomAUtiliser, FileFormat:=xlText, CreateBackup:=False
    ' Fermeture du fichier sans sauvegarde
        ActiveWindow.Close SaveChanges:=False
    ' Ouverture du fichier texte pour changer les virgules en points
        ChDir Path2
        Workbooks.OpenText Filename:=NomAUtiliser, Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
            :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=True _
            , Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1) _
            , Array(2, 1))
        Cells.Replace What:=",", Replacement:=".", LookAt:=xlPart, SearchOrder _
            :=xlByRows, MatchCase:=False
        ActiveWorkbook.Save
    ' Fermeture du fichier texte
        ActiveWindow.Close SaveChanges:=False
     
    ' Message avant fermeture
        MsgBox ("Fichiers textes créés, vérifiez les avant de les exporter")
        ActiveWindow.Close SaveChanges:=False
    Ca marche bien comme ça

    Cependant pour être encore plus rigoureux, je pourrais changer le nom des feuilles en mettant des variables puisque j'ai à chaque fois le nom de ma lib et le nom du fichier.

    Enfin en ce qui concerne mon changement de virgules en points, j'ai fait ça car les fichiers texte sont destinés à être exportés sous un logiciel nécessitant des points et non des virgules comme séparateur, mais autrement, je préfère garder mon option régionale avec les virgules.

    Merci encore pour l'aide apportée !

  4. #4
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    J'ai essayé de créer une variable texte comme par exemple
    texte2 = Lib.nom2
    puis de faire Sheets(texte2).Select
    mais ça ne marche pas... comment faire pour rentrer une variable en paramètre pour un onglet ?
    Merci, mon programme commence à ressembler à quelque chose

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Alqualonde,

    si Lib.nom2 est le nom qui doit être donné il faut mettre :

    si vous avez pusieurs feuilles à traiter et que "nom2" doit pouvoir devenir "nom3" etc. il faut passer par une variable qui s'incrément de 1 dans une boucle (exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    num = 1
     
    For i = x to z 'x et z étant des valeurs
     
    texte2 = "Lib.nom" & CStr(num)
    .....
    .....
    num = num + 1
    next i

  6. #6
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bonjour Jacque_Jean et merci pour cette réponse.
    Toutefois, je ne comprends pas une chose : si je mets texte2 = "Lib.nom2", VBA va-t-il interpréter ma variable Lib en maLib à l'intérieur des guillemets ? (j'ai défini auparavant une variable Lib telle que Lib="maLib")

    En fait je n'ai peut-être pas été très clair sur ce que je voulais faire :

    Admettons que mon fichier Excel comprenne un onglet appelé Toto.Chien
    Je définis les variables suivantes :
    Lib = "Toto"
    Nom2 = "Chien"

    Et je voudrais ensuite sélectionner mon onglet en faisant Sheets(Lib &.& Chien).select mais ça ne semble pas marcher...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Re Alqualonde,

    Bien sûr dans ce cas c'est le point qui "gêne" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte2 = Lib & "." & nom2

  8. #8
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Pardon c'est moi qui ai oublié de mettre les guillemets dans mon exemple mais je l'ai mis dans mon programme... En fait si je crée une variable texte2=Lib & "." & nom2, l'instruction Sheets(texte2).Select ne semble pas marcher.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Si le fichier avpf.xls comporte bien une feuille nommée Toto.Chien il n'y a aucune raison que cela ne fonctionne pas. J'ai bien fait l'essai avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub Essai()
    lib = "Toto"
    nom2 = "Chien"
    Sheets(lib & "." & nom2).Select
    End Sub
    Il n'y a pas besoin de passer par une nouvelle varianle "Texte2" mais cela fonctionne quand même si on met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lib = "Toto"
    nom2 = "Chien"
    texte2 = lib & "." & nom2
    Sheets(texte2).Select
    Par contre je ne comprends pas très bien (si vous l'utilisez toujours) :

    maLib est une variable ?

    si oui il faut mettre : Lib = maLib

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 87
    Points : 93
    Points
    93
    Par défaut
    alqualonde a dit :

    Bonjour Jacque_Jean et merci pour cette réponse.
    Toutefois, je ne comprends pas une chose : si je mets texte2 = "Lib.nom2", VBA va-t-il interpréter ma variable Lib en maLib à l'intérieur des guillemets ? (j'ai défini auparavant une variable Lib telle que Lib="maLib")
    ha ben non, et c'est peut etre ce qui te pose problème
    tout ce qui est entre guillemets est du texte fixe. Si a l'intérieur il y a quelque chose qui ressemble à un de tes noms de variables, ou meme à un mot du langage VBA ("worksheet", par exemple), ca ne sera jamais interprété. ca restera du texte fixe. c'est fait pour ca. imagine un programmeur géologue dysorthographique qui voudrait dire à l'utilisateur de sa feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox ("attention, risque de subduction en pathagonie")
    imagine le cirque si le programme se mettait à interpréter tous ces mots "sub", "path", et couinerait en disant sub quoi ?, path où ?.

    donc ce qui est entre guillemets est fixe, et non interprété

    si tu as besoin d'un texte résultant de l'aggrégation de plusieurs variables, tu ne dois pas mettre les variables entre guillemets. lorsque excel les rencontrera, il utilisera la valeur de la variable (le contenu, si tu preferes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    lib = "Toto"
    nom2 = "Chien"
    texte2 = lib & "." & nom2
    et tu verras que le contenu de texte2 est "Toto.chien"

    si tu mets texte2 = "Lib.nom2",
    texte2 restera "Lib.nom2"

    excuse-moi si j'ai été un peu didactique...
    a plus

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonsoir le petit nicolas,

    J'accepte sans problème que vous soyez didactique.

    Mais je n'ai jamais écrit que :

    texte2 = "Lib.nom2"
    donnerait autre chose comme valeur de la variable texte2 que "Lib.nom2"

    au contraire j'ai précisé que si Lib était une variable et nom2 l'était également pour affecter ces 2 variables à une 3ème variable nommée texte2 ou autre chose (peu importe) avec de plus un caractère séparant le contenu des 2 variables il fallait écrire par exemple :

    texte2 = Lib & "." & nom2

    sachant qu'en l'occurrence il n'est même pas obligatoire de passer par cette 3ème variable.
    Mais peut-être me suis-je mal exprimé ou avez-vous mal compris ce que j'avais écris ?

  12. #12
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bonjour Jacques_Jean, Le petit nicolas,

    Excusez-moi, c'est moi qui ai créé un peu de confusion en mettant ça :

    Bonjour Jacque_Jean et merci pour cette réponse.
    Toutefois, je ne comprends pas une chose : si je mets texte2 = "Lib.nom2", VBA va-t-il interpréter ma variable Lib en maLib à l'intérieur des guillemets ? (j'ai défini auparavant une variable Lib telle que Lib="maLib")
    En fait j'avais mal exprimé mon problème et du coup la réponse m'a un peu désorienté, mais pour moi ce qui est entre guillemets n'était pas interprété, ce qui est vrai, mais ça ne veut pas dire que votre réponse prétendait le contraire !

    En tout cas, je vais essayer vos solutions pour mon problème d'onglet, j'ai dû faire une erreur quelque part. Merci à tous les deux

  13. #13
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Bon et bien ça marche très bien, je ne sais pas ce que j'avais essayé avant qui ne marchait pas. Finalement je ne suis pas passé par une nouvelle variable, j'ai fait directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Lib & "." & Nom1).Select
    et ça marche !

    Merci beaucoup, bonne journée

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 87
    Points : 93
    Points
    93
    Par défaut
    salut Jacques-Jean
    désolé pour la malcompréhension mais ma didactitude s'adressait à Alqualonde, pas à toi...

    pour alqualonde : si c'est résolu, un petit tag résolu ?

    a plus

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonsoir le petit nicolas,

    Aucun problème. Nous sommes là pour nous compléter et toutes les idées bien exprimées (en tout cas le mieux possible car ce n'est pas toujours évident) sont utiles.

  16. #16
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Citation Envoyé par le petit nicolas Voir le message
    salut Jacques-Jean
    désolé pour la malcompréhension mais ma didactitude s'adressait à Alqualonde, pas à toi...

    pour alqualonde : si c'est résolu, un petit tag résolu ?

    a plus
    Et bien euh... le TAG résolu était déjà mis hier mais bon je veux bien en remettre un autre ^^
    Merci pour la didactique même si en fait je n'avais pas vraiment de problème sur ce point précis, c'est juste que j'ai choisi des exemples vraiment pas clairs pour exposer mon problème en mettant les mêmes noms de variables que mes chaînes de caractère dans ces-dits exemples, ce qui ne facilitait pas la compréhension d'un lecteur extérieur.
    Mais il est toujours bon de refixer les bases au cas où, on sait jamais !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer une ligne d'un fichier texte par une autre
    Par devalender dans le forum WinDev
    Réponses: 12
    Dernier message: 24/07/2007, 19h51
  2. Insérer une ligne d'un fichier texte dans une table
    Par Atemi76 dans le forum Administration
    Réponses: 1
    Dernier message: 10/07/2007, 17h32
  3. extraire une partie d'un fichier texte
    Par Mydriaze dans le forum Langage
    Réponses: 5
    Dernier message: 15/06/2007, 12h46
  4. Réponses: 4
    Dernier message: 24/11/2006, 17h03
  5. [VB]recherche dans une partie d'un fichier texte
    Par malhivertman1 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/01/2006, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo