[Macro] Conversion fichier .txt en .xls

bkawak

XLDnaute Nouveau
Bonjour,

Me revoilà avec cette même macro :).

Je vous m explique mon nouveau problème : Dans le cadre de mon projet, j ouvre un fichier .txt avec excel 2003 pour travailler sur les données. Ma macro effectue son travail correctement (changement de police, classement de colonne, redimensionnement des colonnes ect). A la fin de ma macro je dois enregistrer le fichier en format .xls .

Voici ce que j ai essaye :

Dim Title As String
Dim Chemin As String

Chemin = "C:\Dokumente und Einstellungen\kawa_be\Desktop\Projet Macros\Projet Calibration"

Title = InputBox("What is the title ?")

ActiveWorkbook.SaveAs (Chemin & "\" & Title & ".xls")


Mon fichier est bien enregistre avec l extension .xls . Cependant lorsque je le ferme et le reouvre, il s ouvre denouveau comme un fichier .txt sous excel.

Merci pour votre aide

dsl pour les accents, clavier allemand
 

Raja

XLDnaute Accro
Re : [Macro] Conversion fichier .txt en .xls

Bonjour,

D'abord, il faut importer le fichier texte avec la commande "Workbooks.OpenText Filename:="emplacement et nom du fichier" avant d'enregistrer. Essaye avec l'enregistreur de Macro pour retrouver la syntaxe de cette commande sinon envoi-nous un modèle du fichier texte pour tester.
 

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

Merci pour vos reponses. Le code de Catrice marche parfaitement.

Je suis d accord avec toi Raja sur le fait qu il serqit plus pratique que la macro ouvre directement le fichier. Le soucis est que l emplacement du fichier texte change tous les jours. D ou ma question :

Quelles sont les lignes de commande VBA qui permettraient de demander a l utilisateur l emplacement du fichier texte ?

Au debut j ai pense a faire un Input, mais cette solution est laborieuse car l utilisateur doit ecrire l adresse exacte manuellement. La solution ideale serait que l utilisateur puisse selectionner le fichier en parcourant le disque comme lorsqu on utilise la fonction ouvrir d excel.

Merci pour votre aide
 

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

C est encor moi. Apres de longues recherches sur intranet, j ai trouve un element a ma reponse avec la fonction GetOpenFilename. Mais j ai encor un soucis de syntaxe.

Voici ce que l enregistreur de macro me donne

ChDir _
"C:\Dokumente und Einstellungen\kawa_be\Desktop\Projet Macros\Projet Calibration"
Workbooks.OpenText Filename:= _
"C:\Dokumente und Einstellungen\kawa_be\Desktop\Projet Macros\Projet Calibration\Calibration_D_Z_2905.txt" _
, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlNone, 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), Array(8, 1), Array(9, 1 _
), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array _
(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), _
Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array( _
29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), _
Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), Array(40, 1), Array(41, 1), Array( _
42, 1)), TrailingMinusNumbers:=True

Et voici ce que j ai tente

Dim Fichier As String

Fichier = Application.GetOpenFilename

Workbooks.Open FileName:=Fichier, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlNone, 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), Array(8, 1), Array(9, 1 _
), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array _
(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), _
Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array( _
29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), _
Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), Array(40, 1), Array(41, 1), Array( _
42, 1)), TrailingMinusNumbers:=True


Sans succes. Pouvez vous m indiquer mon erreur svp ?

Merci

Benjamin
 

mromain

XLDnaute Barbatruc
Re : [Macro] Conversion fichier .txt en .xls

bonjour bkawak, Catrice, Raja,

voici un code pour récupérer le nom d'un fichier à enregistrer :
Code:
Sub test1()
Dim nouveauFichier As String
nouveauFichier = Application.GetSaveAsFilename( _
    InitialFileName:="nouveauFichier.xls", _
    filefilter:="Fichier Excel, *.xls; *.xlsx; *.xlsm", _
    Title:="Nom du nouveaufichier Excel :")
End Sub

et si tu veux empêcher l'utilisateur de fermer la boite de dialogue sans entrer un nom de fichier :
Code:
Sub test2()
Dim nouveauFichier As String
Do
    nouveauFichier = Application.GetSaveAsFilename( _
        InitialFileName:="nouveauFichier.xls", _
        filefilter:="Fichier Excel, *.xls; *.xlsx; *.xlsm", _
        Title:="Nom du nouveaufichier Excel :")
Loop Until UCase(nouveauFichier) <> "FAUX"
End Sub

a+
 

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

Merci mromain pour ton aide. J ai modifie mon code est cela marche parfaitement.

Aurais tu une petite idee sur mon deuxieme probleme ( probleme de syntaxe avec l utilisation de GetOpenFilename) ?


Merci beaucoup

Benjamin
 

mromain

XLDnaute Barbatruc
Re : [Macro] Conversion fichier .txt en .xls

re,

teste ce fichier :
- il ouvre une boite de dialogue pour saisir le nom du nouveau fichier excel
- il importe les données depuis un fichier texte (avec une boite de dialogue aussi)
- il te reste à compléter la macro à ce niveau pour la mise en forme
- elle enregistre et ferme le fichier excel.

a+
 

Pièces jointes

  • Classeur1.xls
    36.5 KB · Affichages: 432
  • Classeur1.xls
    36.5 KB · Affichages: 473
  • Classeur1.xls
    36.5 KB · Affichages: 489

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

Wouaa,

Pour un debutant comme moi, elle est impressionnante ta macro. Le seul petit soucis c est que je ne dispose pas les connaissances necessaires pour la maitriser completement. :(

Ta macro marcherait super bien s il y avait des virgules dans mon fichier texte comme separateur. Malheureusement ce n est pas le cas. Mon fichier texte est deja `pres formate`. Actuellement en appliquant ta macro j ai toutes mes donnees dans la colonne A.

Je joins un fichier texte exemple.

Merci pour ton aide, c est super sympa
 

Pièces jointes

  • exemple.zip
    1.3 KB · Affichages: 184
  • exemple.zip
    1.3 KB · Affichages: 213
  • exemple.zip
    1.3 KB · Affichages: 209

mromain

XLDnaute Barbatruc
Re : [Macro] Conversion fichier .txt en .xls

re

essaye avec ce fichier.
j'ai remplacé le "," par VbTab (vu que le séparateur est une tabulation)

a+
 

Pièces jointes

  • Classeur1.xls
    42.5 KB · Affichages: 408
  • Classeur1.xls
    42.5 KB · Affichages: 465
  • Classeur1.xls
    42.5 KB · Affichages: 498
Dernière édition:

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

Ouaiii trop bien, ca marche trop bien.

Tu es devenu mon idole des maos :p

Par contre je dois ecrire un rapport sur la macro. Est il possible, par la suite, que je te pose des questions sur certaines fonctions de ta macro ??

Merci beaucoup

Benjamin
 

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

J ai travaille hier sur ta macro et j ai quelques questions. Elles sont surement stupides, mais je suis encore debutant en macro.

1) Quelle est l utilite de mettre Option Explicit en debut de chaque procedure ?

2) Quelle est la diffrence entre Private Sub, Public Sub et Sub ?

3)
Code:
Public Sub CsvToXls(sheetDest As Worksheet, Optional csvDelimiter As String = ";", Optional textFileName As String)

J ai toujours ecrit des procedures avec sub(). Est ce que sheetDest, csvDelimiter et testFileName sont les parametres de la procedure CsvToXls ?
A quoi sert le mot Optional devant sheetDest et csvDelimiter ?
Si j ai bien compri on declare csvDelimiter comme un parametre puis on l affecte du signe ; . Donc c est une constante et pas un parametre :confused: ???

4)
Code:
' ouvrer le fichier CSV
Set myFso = CreateObject("Scripting.FileSystemObject")
Set csvFile = myFso.OpenTextFile(textFileName)

Si j ai bien compris, pour ouvrir un fichier texte, il faut tout d abord creer un fichier vierge (1 ligne). Puis on importe les donnees ( 2 ligne).


5)
Code:
Dim tabStr() As String
numLigne = 1

' tant qu'on est pas à la fin du fichier CSV
While Not csvFile.AtEndOfStream
    ' lire la ligne suivante
    csvLine = csvFile.ReadLine
    ' "spliter" la ligne
    tabStr = Split(csvLine, csvDelimiter)
Ici, tu declares un tableau a une dimension. Puis tu stockes les donnees de chaque ligne du fichier texte jusqu a csvDelimiter. Mais ce que je n ai pas compris c est la valeur du csvDelimiter. Dans mon fichier texte les lignes ne se terminent pas par le caractere ";". Donc comment la macro reconnait elle la fin de la ligne ?

6)
Code:
    For numColonne = LBound(tabStr) + 1 To UBound(tabStr) + 1
        ' reporter la valeur de l'élément sur la feuille
        sheetDest.Cells(numLigne, numColonne).Value = tabStr(numColonne - 1)
    Next numColonne

Je n ai pas compris ton astuce pour gerer les colonnes... :confused:

Je sais j ai beaucoup de questions :D

Merci pour ton aide

Benjamin
 

mromain

XLDnaute Barbatruc
Re : [Macro] Conversion fichier .txt en .xls

bonjour bkawak,

1) Quelle est l utilite de mettre Option Explicit en debut de chaque procedure ?
"Option Explicit" oblige à déclarer les variables : on ne peut pas écrire directement "i = 2", il faut au préalable déclarer i "Dim i as Integer".


2) Quelle est la diffrence entre Private Sub, Public Sub et Sub ?
"Private" --> signifie que le Sub (ou la Function) ne peut être appelé que par un Sub (ou une Function) du même module
"Public" --> signifie que le Sub peut être appelé depuis d'autres modules
lorsque ce n'est pas précisé, "Public" est pris par défaut


3)
Code:
Public Sub CsvToXls(sheetDest As Worksheet, Optional csvDelimiter As String = ";", Optional textFileName As String)
J ai toujours ecrit des procedures avec sub(). Est ce que sheetDest, csvDelimiter et testFileName sont les parametres de la procedure CsvToXls ?
A quoi sert le mot Optional devant sheetDest et csvDelimiter ?
Si j ai bien compri on declare csvDelimiter comme un parametre puis on l affecte du signe ; . Donc c est une constante et pas un parametre ???
sheetDest, csvDelimiter et testFileName sont bien les parametres de la procedure CsvToXls
le terme "Optional" signifie qu'on est pas obligé de renseigner le paramètre lors de l'appel de procédure.
"Optional ... = ";"" signifie que si on ne renseigne pas le paramètre lors de l'appel de procédure, la valeur ";" sera prise par défaut


4)
Code:
' ouvrer le fichier CSV
Set myFso = CreateObject("Scripting.FileSystemObject")
Set csvFile = myFso.OpenTextFile(textFileName)
Si j ai bien compris, pour ouvrir un fichier texte, il faut tout d abord creer un fichier vierge (1 ligne). Puis on importe les donnees ( 2 ligne).
myFso est un objet (de type "FileSystemObject") qui sert à manipuler des fichiers et des dossiers,
en l'ocurence, ici, il sert à ouvrir le fichier texte.


5)
Code:
Dim tabStr() As String
numLigne = 1

' tant qu'on est pas à la fin du fichier CSV
While Not csvFile.AtEndOfStream
    ' lire la ligne suivante
    csvLine = csvFile.ReadLine
    ' "spliter" la ligne
    tabStr = Split(csvLine, csvDelimiter)
Ici, tu declares un tableau a une dimension. Puis tu stockes les donnees de chaque ligne du fichier texte jusqu a csvDelimiter. Mais ce que je n ai pas compris c est la valeur du csvDelimiter. Dans mon fichier texte les lignes ne se terminent pas par le caractere ";". Donc comment la macro reconnait elle la fin de la ligne ?
en fait je boucle sur chaque ligne, pour chaque ligne, je rentre dans un tableau ("tabStr") tous les éléments de la ligne qui sont séparé par le csvDelimiter (VbTab, soit une tabulation dans ta dernière version)
pour la ligne "toto titi tata tutu" de ton fichier texte, on aura un tableau de 4 éléments :
tabStr(0) = toto
tabStr(1) = titi
tabStr(2) = tata
tabStr(3) = tutu


6)
Code:
    For numColonne = LBound(tabStr) + 1 To UBound(tabStr) + 1
        ' reporter la valeur de l'élément sur la feuille
        sheetDest.Cells(numLigne, numColonne).Value = tabStr(numColonne - 1)
    Next numColonne
Je n ai pas compris ton astuce pour gerer les colonnes...
toujours dans l'exemple du point 5,
For numColonne = LBound(tabStr) + 1 To UBound(tabStr) + 1 --> fait varier numColonne de 1 (LBound(tabStr)=0 + 1) à 4 (UBound(tabStr)=3 + 1).
donc la boucle sheetDest.Cells(numLigne, numColonne).Value = tabStr(numColonne - 1) deviens dans cet exemple
sheetDest.Cells(numLigne, 1).Value = tabStr(1 - 1) --> tabStr(0) = toto
sheetDest.Cells(numLigne, 2).Value = tabStr(2 - 1) --> tabStr(1) = titi
sheetDest.Cells(numLigne, 3).Value = tabStr(3 - 1) --> tabStr(2) = tata
sheetDest.Cells(numLigne, 4).Value = tabStr(4 - 1) --> tabStr(3) = tutu



en espérant avoir été clair

a+
 

bkawak

XLDnaute Nouveau
Re : [Macro] Conversion fichier .txt en .xls

Salut mromain,

Merci beaucoup pour tous ces renseignements.

Je crois avoir tout compris. Juste pour confirmation le parametre csvDelimiter recoit le caractere ; par defaut. Cepedant dans mon cas : csvDelimiter = vbTab ( qui correspond a une tabulation): Est ce aue j ai bien compris ?

Merci enormement en tout cas

Benjamin
 

Discussions similaires

Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
312 095
Messages
2 085 252
Membres
102 837
dernier inscrit
CRETE