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 :

Conversion dynamique de fichiers txt d'un dossier en xls.


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Conversion dynamique de fichiers txt d'un dossier en xls.
    Bonjour.

    Dans le cadre d'un projet j'ai besoin de convertir de nombreux fichiers txt en fichier xls.

    Etant donné le nombre ... la procèdure suivante est très lourde à effectuer manuellement :

    Pour chaque fichier txt du dossier (lequel devrait être défini "dynamiquement" par l'utilisateur de la macro), les actions sont

    Ouvrir ( ou convertir ) le fichier txt ( Séparateur tabulation ).
    Enregistrer le fichier xls converti dans le même dossier.

    Le script pour ce genre d'actions sequentielles dans un dossier n'est peut être certes pas bien long ... mais comme je ne connais rien à la syntaxe et au langage ... et que je n'en ai besoin que pour un usage très ponctuel et limité ... il me serait fort utile que quelqu'un d'expérimenté en la matière puisse me donner le code à utiliser.

    Merci d'avance à tout ceux qui prendront un peu de temps et m'éviteront d'en perdre en traitement manuel en accèdant à ma requète.

    Damien.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Connais-tu l'enregistreur de macro d'Excel ? -> Menu Outils -> Macros -> Nouvelles macro -> Ok ! Là tu enregistres en faisant ta manip' -> Tu as ta macro (mal foutue mais pour le principe ça reste bon)
    Pour lister les fichiers d'un répertoire, tu as trente-six exemples sur le forum (-> Recherche sur le forum) ou dans Contribuez, les tutos, la FAQ (urls ds ma signature)
    Tu essaies quelque chose et tu nous reviens si tu as toujours un pb ou pour simplifier le code obtenu
    A+
    Bonne journée

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Oki donc j'en suis arrivé à ce code là :

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    Option Explicit
     
    Private Const BIF_RETURNONLYFSDIRS = 1
    Private Const BIF_DONTGOBELOWDOMAIN = 2
     
    Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, _
    ByVal lpBuffer As String) As Long
    Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, _
    ByVal lpString2 As String) As Long
     
    Private Type BrowseInfo
        hWndOwner As Long
        pIDLRoot As Long
        pszDisplayName As Long
        lpszTitle As Long
         ulFlags As Long
        lpfnCallback As Long
        lParam As Long
        iImage As Long
    End Type
     
    Sub Convertion_txt_xls()
     
    MsgBox SelectFolder("Sélectionnez un répertoire :", Me.Hwnd)
    Convert SelectFolder
     
    End Sub
     
    Public Function SelectFolder(Titre As String, Handle As Long) As String
     
        Dim lpIDList As Long
        Dim strBuffer As String
        Dim strTitre As String
        Dim tBrowseInfo As BrowseInfo
     
        strTitre = Titre
     
        With tBrowseInfo
            .hWndOwner = Handle
            .lpszTitle = lstrcat(strTitre, "")
            .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
        End With
     
        lpIDList = SHBrowseForFolder(tBrowseInfo)
     
        If (lpIDList) Then
            strBuffer = String(260, vbNullChar)
            SHGetPathFromIDList lpIDList, strBuffer
            SelectFolder = Left(strBuffer, InStr(strBuffer, vbNullChar) - 1)
        End If
     
    End Function
     
    Sub Convert(Repertoire As String)
     
        Dim Fso As Scripting.FileSystemObject
        Dim SourceFolder As Scripting.Folder
        Dim FileItem As Scripting.File
    '
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set SourceFolder = Fso.GetFolder(Repertoire)
    '
        For Each FileItem In SourceFolder.Files
    '
            ChDir _
            SourceFolder
            Workbooks.OpenText Filename:= _
            FileItem.ParentFolder & "\" & FileItem.Name _
            , Origin:=xlWindows, StartRow:=1, DataType:=xlDelimited, TextQualifier _
            :=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
            False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array _
            (1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1)), _
            TrailingMinusNumbers:=True
            ActiveWorkbook.SaveAs Filename:= _
            FileItem.Name _
            , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
            ActiveWindow.Close
    '
        Next FileItem
     
    End Sub
    Mais le debogeur me met un message d'erreur me disant que j'utilise mal le mot clé Me ( dans le sub Conversion_txt_xls ).
    J'ai fait ce code en recollant divers scripts issus de la FAQ (Comment ouvrir une fenêtre de sélection de répertoire ? + partiellement Comment lister les fichiers contenus dans un répertoire ainsi que dans tous ses sous-répertoires ? ) ... fonctionnellement cela me parait bon ... mais apparemment syntaxiquement pas ... y aurait il quelqu'un pour m'eclairer sur cet obscur message d'erreur ??

    Merci d'avance.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Attention: ça sent le code issu de VB.

    Alors, petite précision: Visual Basic et Visual Basic pour Applications ne marchent pas tout à fait pareil.
    Le code que tu as récupéré, c'est du code VB. Nous on travaille avec du code VBA pour Excel, et il se trouve que dans ton cas Me est censé représenter une fenêtre d'application Visual Basic (il me semble, car je n'ai jamais fait de VB), ce qui n'existe pas en VBA.

    Remplace donc le "Me.Hwnd" par ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindWindow(vbNullString, Application.Caption)
    Ce qui te donne cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox SelectFolder("Sélectionnez un répertoire :", FindWindow(vbNullString, Application.Caption))
    Rajoute aussi ceci en haut de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Au passage un grand merci à ucfoutu de m'avoir fourni des infos pour un de mes problèmes. Bon bien sûr j'ai adapté à ton cas, car tu ne pouvais pas deviner par quoi il fallait remplacer le Me.Hwnd.

    Tu me dis s'il y a d'autres erreurs: le reste est un peu gros pour que je prenne le temps de tout décortiquer.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Yes merci decondelite ... a plus message d'erreur ^^ !!

    Par contre maintenant j'ai un autre petit souci ... j'avais pensé que la variable
    SelectFolder qui est définie dans la "public fonction" du même nom était la variable de sortie me donnant mon chemin complet du répertoire selectionné dans la fenêtre.

    Je l'ai donc mise naturellement en tant que variable d'entrée de mon programme de conversion des txt en xls baptisé sub convert.

    Pourtant cela ne marche pas ... d'où la questions ... qu'elle est le nom de la variable de sortie de la "public fonction" selectfolder ... que je puisse mettre correctement mon chemin choisi dans ma moulinette qui converti ?!?

    Sinon à part çà je pense que je devrais presque y être ^^ !!

    Merci d'avance à nouveau.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    SelectFolder n'est pas une variable: c'est une fonction que tu as déclaré et codé (enfin façon de dire).

    Tu y fais appel dans ton msgbox, elle exécute du code et te renvoie le résultat que la msgbox t'affiche, mais après la ligne le résultat est perdu.

    Tu dois donc faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Convertion_txt_xls()
        Convert SelectFolder("Sélectionnez un répertoire :", Me.Hwnd) 
    End Sub
    Je sais pas si ça marchera jusqu'au bout: c'est ton programme.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Ok j'ai saisi le concept ... et effectivement c'était bien cela ... le programme tourne désormais bien jusqu'à ce que j'arrive à l'enregistrement du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveWorkbook.SaveAs Filename:=FileItem.Name _
            , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
    Cette ligne on va dire marche ... mais le problème est qu'elle m'enregistre le fichier de nouveau en txt (message du type voulez vous remplacer le ficher machintruc.txt déjà existant) ... alors que pourtant le "FileFormat" semble bon.

    Après j'ai obtenu cette ligne de code avec l'enregistreur de macro ... sur les conseils de ouskel'nor ... il est peut être possible que le script ai choisi le format par défaut à l'ouverture de la fenêtre enregistrer ... à savoir .txt ... au lieu de retenir celui que j'ai choisi avant d'appuyer sur le bouton sauvegarder.

    Me manque donc a priori la syntaxe à mettre après FileFormat:= pour que l'enregistrement se fasse bien en .xls.

    A ceci près tout roule ^^.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Place un point d'arrêt sur cette ligne, et regarde ce que vaut "FileItem.Name": à mon avis il y a de bonnes chances que ça te donne un truc du genre "NomDuFichier.txt", auquel cas ça ne m'étonnera pas si ça te l'enregistre au format texte.

    Dans ce cas là, tu dois donc isoler la partie gauche de ce nom de fichier avec la fonction Instr pour repérer le point et la fonction Mid ou Left pour extraire la partie gauche à l'aide de cette position.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Bon et bien voilà on y arrive ^^ !!

    Reste un dernier point qui me semble loin d'être insoluble ... les fichiers me sont enregistrés dans mes documents au lieu d'être enregistrés dans le fichier contenant les txt.

    Le code contient pourtant en amont un Chdir qui pointe vers ce dossier ... j'imagine qu'il faille que je réitère ce chdir avant la ligne de code s'occupant de l'enregistrement ... mais j'avoue ne pas comprendre pourquoi le programme ne garde pas "en tête" l'adresse ?!?

    En tout cas merci encore decondelite pour avoir pris le temps de m'aider dans mon entreprise et d'avoir été si réactif !!

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Il ne faut pas tout mélanger: ChDir fait partie du module de manipulation de fichiers de la bibliothèque VBA, et est conçu pour fonctionner avec les autres fonctions de ce module. Tandis que SaveAs est une méthode de la bibliothèque Excel.

    Or, cette fonction, étant indépendante de la bibliothèque VBA (ce qui est un peu normal entre nous soit dit), n'est donc pas adaptée pour fonctionner en fonction du changement de dossier courant. Tu dois donc préciser le chemin complet à chaque enregistrement. Dans ton cas, tu dois tout simplement utiliser une méthode analogue à celle que tu as utilisé pour ouvrir le fichier, soit (avec en prime la méthode pour te débarasser du ".txt" avec InStr et Left je suis généreux aujourd'hui ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ActiveWorkbook.SaveAs Filename:= _
    FileItem.ParentFolder & "\" & _
    Left(FileItem.Name, InStr(1, FileItem.Name, ".txt") - 1) _
    , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
    ReadOnlyRecommended:=False, CreateBackup:=False

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    D'accord d'accord ... c'est vrai qu'une fois expliqué çà parait logique ... va-t-on dire ^^ !!

    Je tiens une nouvelle fois a t'adresser mes plus grand remerciements ... tes explications m'ayant permis d'une de finaliser ma macro d'automatisation et de deux de lever un bout de voile sur quelques principes du VBA !!

    Par contre pour la fonction InStr j'avais déjà trouvé comment rédiger tout seul comme un grand avant que tu poste ton dernier message (grâce à l'avant dernier en fait) ... belle progression ^^ !!

  12. #12
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Si ton problème est résolu, veux-tu bien cliquer sur le bouton , en bas de discussion?

    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/03/2014, 23h39
  2. [XL-2010] Macro importer des fichiers txt d'un dossier dans des fichiers excel
    Par ccadic dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/04/2013, 11h21
  3. Réponses: 3
    Dernier message: 09/11/2010, 10h48
  4. [AC-2003] conversion table vers fichier txt
    Par novice06 dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/05/2010, 10h16
  5. Importer fichiers txt d'un dossier dans une table
    Par avantoux dans le forum Access
    Réponses: 16
    Dernier message: 28/12/2005, 13h13

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