Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ouvrir un fichier .txt dans Excel avec espace comme séparateur de champs

16 réponses
Avatar
Christian
Bonjour,

Comment ouvrir un fichier .txt dans Excel avec espace comme séparateur de
champs ?
Le code ci dessous est une tentative d'adaptation d'un code vba, mais ça ne
marche pas.
Ou est le Pb ???

Merçi de votre aide


For i = 2 To LmaxListe
CHEMIN = mafeuilleliste.Cells(i, 1).Value

MonExcel.Workbooks.OpenText FileName:= _
CHEMIN, 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), Array( _

3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), _

Array(9, 1), Array(10, 1))


Next

10 réponses

1 2
Avatar
ng
Salut,

Bonjour,

Comment ouvrir un fichier .txt dans Excel avec espace comme séparateur de
champs ?
Le code ci dessous est une tentative d'adaptation d'un code vba, mais ça
ne marche pas.
Ou est le Pb ???

Merçi de votre aide


For i = 2 To LmaxListe
CHEMIN = mafeuilleliste.Cells(i, 1).Value

MonExcel.Workbooks.OpenText FileName:= _
CHEMIN, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited,
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:úlse, Tab:=True,
Semicolon:=True, Comma:úlse, _
Space:úlse, Other:úlse,
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))


Next



Si c'est pour du CSV, excel prevoit peut etre une fonction toute faite pour
ca, sinon il faudra faire le code toi même, un truc comme ca (non testé) :

Dim k as Integer, i as Integer
Dim strBuffer as string
Dim tblLines() as String, tblFields() As String

k = FreeFile

'on recupère ttes les données
Open "c:mon fichier.csv" for Binary as #k
strBuffer = String(LOF(k), vbNullChar)
Get #k, , strBuffer
Close #k

tblLines = Split(strBuffer, vbcrlf) 'on recupère les lignes

For k = 0 to Ubound(tblLines)

If trim$(tblLines(k)) <> "" Then
tblFields = Split(tblLines(k), ",") 'on a les champs de la lignes
For i = 0 To ubound(tblFields)
MsgBox "Champs " & i & " de la ligne " & k & _
" = " & tblFields(i)
Next i
End If

Erase tblFields
Next k

Erase tblLines
--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
Gloops
Bonjour,

Ben le problème, c'est que ça ne marche pas, non ?

On doit bien observer quelque chose ... Ou la machine plante avec un
écran bleu, ou il ne se passe carrément rien, ou on a un message
d'erreur ...

ça, forcément, c'est les gens à l'autre bout dans le newsgroup qui
peuvent le dire, pas le mec qui est devant la machine ...

En tout cas il manque une ligne primordiale dans ce code, c'est celle
qui commence par Set MonExcel = ...

Après on a GetObject ou CreateObject.
Dans MSDN, chercher Automation.

ça pourrait donner
Set MonExcel = CreateExcel("Excel.Application")

Il faut voir la tête du fichier (enfin je veux dire, ce qu'il y a
dedans). Pour lire un fichier avec des champs séparés par des virgules
le code de ng doit s'en sortir très bien.

Voyons maintenant pour écrire dans Excel.

D'ailleurs avec des points-virgules ça peut être un peu lourd à écrire.
Avec un fichier comportant des virgules comme séparateurs (le fameux
CSV, comma separated values), ça pourrait donner, pour des lignes de dix
champs :

Public Sub ImportTexte()
Dim Champ(10) As String
Dim NumLigne As Integer
Set MonExcel = CreateObject("Excel.Application")
MonExcel.Visible = True
MonExcel.WorkBooks.Add
Open "C:Documents and SettingsHubert.UC00002Mes documentstest.txt"
For Input As #1
While Not EOF(1)
Input #1, Champ(1), Champ(2), Champ(3), Champ(4), Champ(5), _
Champ(6), Champ(7), Champ(8), Champ(9), Champ(10)
NumLigne = NumLigne + 1
For N = 1 To 10
MonExcel.ActiveSheet.Cells(NumLigne, N).Value = Champ(N)
Next
Wend
Close #1

End Sub

Attention à avoir un fichier d'entrée dont chaque ligne comporte bien le
bon nombre de champs. Sinon, il faut utiliser Line Input #1, et
fractionner la ligne ensuite. Il me vient à l'esprit InStr, mais je ne
jurerais pas qu'il n'y a pas mieux.

Même principe si on tient aux points-virgules.

Je n'ai pas mis de procédure d'erreur, elle serait bienvenue.
________________________________________
Christian a écrit, le 21/06/2005 15:17 :
Bonjour,

Comment ouvrir un fichier .txt dans Excel avec espace comme séparateur de
champs ?
Le code ci dessous est une tentative d'adaptation d'un code vba, mais ça ne
marche pas.
Ou est le Pb ???

Merçi de votre aide


For i = 2 To LmaxListe
CHEMIN = mafeuilleliste.Cells(i, 1).Value

MonExcel.Workbooks.OpenText FileName:= _
CHEMIN, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited,
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:úlse, Tab:=True,
Semicolon:=True, Comma:úlse, _
Space:úlse, Other:úlse,
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))


Next




Avatar
Gloops
Gloops a écrit, le 22/06/2005 08:38 :

Même principe si on tient aux points-virgules.



Même principe aussi si on tient à l'espace comme séparateur.

Je m'étais laissé emporter par l'élan ...
Avatar
ng
Salut,

Public Sub ImportTexte()
Dim Champ(10) As String
Dim NumLigne As Integer
Set MonExcel = CreateObject("Excel.Application")
MonExcel.Visible = True
MonExcel.WorkBooks.Add
Open "C:Documents and SettingsHubert.UC00002Mes documentstest.txt"
For Input As #1
While Not EOF(1)
Input #1, Champ(1), Champ(2), Champ(3), Champ(4), Champ(5), _
Champ(6), Champ(7), Champ(8), Champ(9), Champ(10)
NumLigne = NumLigne + 1
For N = 1 To 10
MonExcel.ActiveSheet.Cells(NumLigne, N).Value = Champ(N)
Next
Wend
Close #1

End Sub

Attention à avoir un fichier d'entrée dont chaque ligne comporte bien le
bon nombre de champs. Sinon, il faut utiliser Line Input #1, et
fractionner la ligne ensuite. Il me vient à l'esprit InStr, mais je ne
jurerais pas qu'il n'y a pas mieux.



Et Split() alors :) ?
Même si ca existe pas dans certaines (toutes?) versions de VBA, ca
s'implémente facilement (microsoft fourni le code sur son site, ainsi que
pour replace...).

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
Avatar
Gloops
Exact, Split c'est achti mieux, d'autant qu'on peut l'utiliser avec
n'importe quel séparateur.
D'ailleurs après je l'ai vu en relisant ton code, et puis bon c'était
peut-être trop tard pour que j'en remette une couche ... Mais peut-être
ai-je eu tort là-dessus.

Effectivement, ça permet de séparer les champs facilement. Si tout le
fichier tient en mémoire on le met dans une variable comme tu as fait,
sinon on alterne Line Input et Split. Par dessus le marché, il me semble
bien que Split s'arrange mieux d'un nombre variable de champs par ligne,
que les différents champs lus explicitement.

Pour ce qui est de VBA pour Excel, il y a une instruction adaptée, que
d'ailleurs Christian a essayé d'utiliser (pour une variable au sein
d'une macro, je ne me souviens pas si Split est reconnu ni si il faut
déclarer une référence pour ça, il faudrait vérifier), mais pour appeler
à partir de VB6, pour la lecture c'est toi qui "as bon".
_________________________________
ng a écrit, le 22/06/2005 13:40 :
Salut,
Il me vient à l'esprit InStr, mais je ne
jurerais pas qu'il n'y a pas mieux.




Et Split() alors :) ?
Même si ca existe pas dans certaines (toutes?) versions de VBA, ca
s'implémente facilement (microsoft fourni le code sur son site, ainsi que
pour replace...).



Avatar
parci
On Tue, 21 Jun 2005 15:17:06 +0200, "Christian"
wrote:

Bonjour,

Comment ouvrir un fichier .txt dans Excel avec espace comme séparateur de
champs ?
Le code ci dessous est une tentative d'adaptation d'un code vba, mais ça ne
marche pas.
Ou est le Pb ???

Merçi de votre aide


For i = 2 To LmaxListe
CHEMIN = mafeuilleliste.Cells(i, 1).Value

MonExcel.Workbooks.OpenText FileName:= _
CHEMIN, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited,
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:úlse, Tab:=True,
Semicolon:=True, Comma:úlse, _
Space:úlse, Other:úlse,
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))


Next



Ca marche très bien - en vba - à condition que MonExcel soit l'objet
Application (facultatif pour la collection Workbooks) et à condition
que CHEMIN soit bien un path d'un fichier txt . D'autre part, si
toutes les colonnes sont distribuées, l'argument facultatif FieldInfo
n'est pas très utile.

Dim sFile As String

sFile = "C:toto.txt"

Workbooks.OpenText FileName:=sFile, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, _
Tab:=True, Semicolon:úlse, Comma:úlse, _
Space:=True, Other:úlse

Si c'est en VB, faut ajouter une référence aux objets Excel et créer
une instance de l'application.
Avatar
Gloops
Bonjour,

En fait, je me suis un peu moqué de Christian, mais quand j'ai testé,
j'ai bien vu que la commande ne retournait rien, même une fois
l'instance d'Excel créée. Si je me rappelle bien j'ai une fois eu la
commande qui s'exécutait sans erreur, mais sans résultat.

J'ai effectivement testé en VBA aussi pour vérifier la syntaxe, et là ça
fonctionne bien. As-tu réussi par un appel à partir de VB6 ?

MonExcel ou ExcelApp remplace Application, ça je pense que là-dessus il
n'y a pas de mystère. Ensuite, y a-t-il des finesses de syntaxe ?

Si j'utilise des constantes comme xlDelimited je les explicite avant
l'appel pour ne pas avoir de problème de constantes non déclarées. ça
n'est quand même pas passé.

J'ai bien essayé à l'instant comme tu dis

Set ExcelApp = CreateObject("Excel.Application")
sFile = "C:Documents and SettingsHubert.UC00002Mes Documentstest.txt"
With ExcelApp
.Visible = True
.Workbooks.Add
.Workbooks.OpenText FileName:=sFile, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, _
Tab:=True, Semicolon:úlse, Comma:úlse, _
Space:=True, Other:úlse
End With

et j'obtiens une erreur 1004, la méthode OpenText de la classe Workbook
a échoué. Et j'obtiens une fenêtre Excel d'ouverte avec un classeur vide.

En revanche si je fais la manip sous Excel ça marche (à la main ou par
macro).

Apparemment, si ça doit marcher en appel depuis VB6, il faudrait en dire
un peu plus.

Ah oui moi aussi il faut que j'en dise plus : j'utilise Excel 95 sous
Windows XP SP1.

____________________________________
parci a écrit, le 22/06/2005 22:43 :

On Tue, 21 Jun 2005 15:17:06 +0200, "Christian"
wrote:


Bonjour,

Comment ouvrir un fichier .txt dans Excel avec espace comme séparateur de
champs ?
Le code ci dessous est une tentative d'adaptation d'un code vba, mais ça ne
marche pas.
Ou est le Pb ???

Merçi de votre aide


For i = 2 To LmaxListe
CHEMIN = mafeuilleliste.Cells(i, 1).Value

MonExcel.Workbooks.OpenText FileName:= _
CHEMIN, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited,
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:úlse, Tab:=True,
Semicolon:=True, Comma:úlse, _
Space:úlse, Other:úlse,
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))


Next




Ca marche très bien - en vba - à condition que MonExcel soit l'objet
Application (facultatif pour la collection Workbooks) et à condition
que CHEMIN soit bien un path d'un fichier txt . D'autre part, si
toutes les colonnes sont distribuées, l'argument facultatif FieldInfo
n'est pas très utile.

Dim sFile As String

sFile = "C:toto.txt"

Workbooks.OpenText FileName:=sFile, Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, _
Tab:=True, Semicolon:úlse, Comma:úlse, _
Space:=True, Other:úlse

Si c'est en VB, faut ajouter une référence aux objets Excel et créer
une instance de l'application.



Avatar
parci
Bonjour,

ça marche aussi bien depuis VB (VB5 avec Excel 2000 ou Excel97 sous NT ou W2k)
avec ou sans référence aux objets Excel dans le projet VB (c'est plus pratique
avec une référence).

Je ne comprend pas vraiment pourquoi ça ne fonctionne pas dans ton cas avec
VB6 et Excel95 (et l'erreur 1004 est trop générique pour pouvoir en dire plus).
Une alternative est d'écrire ses propres routines comme tu le proposais. Une
autre possibilité serait de passer par ADO.

A+

--
Message monitoré par axinews : http://www.axinews.com/
Avatar
Gloops
ADO ... Oui, je ne me rends pas encore bien compte si on gagne en
simplicité. C'est vrai qu'il faudra bien que je me donne le mal d'avoir
un avis là-dessus.

Normalement ça devrait marcher aussi avec Excel95 tu dis ?

Ben mazette, je comprends les gens qui crisent devant les problèmes de
déploiement. ça me rappelle que j'ai une erreur 429 qui traîne sur un
appel entre Word et Access, ça ce sera un truc à potasser en prenant son
temps et en s'y mettant à plusieurs, si ça se trouve la machine aura
rendu l'âme avant que je me sois penché dessus avec suffisamment
d'application. Probablement les chats du Mercredi soir seraient-ils le
bon contexte ...

ça fait que ma macro qui exploite un retour de mailing, alors qu'elle
fonctionne impec sur la machine sur laquelle je l'ai développée, je n'ai
jamais osé la proposer, des fois que j'aie autant de mal à la faire
tourner sur la machine de l'utilisateur que sur la mienne.
____________________________________
parci a écrit, le 23/06/2005 09:12 :

Bonjour,

ça marche aussi bien depuis VB (VB5 avec Excel 2000 ou Excel97 sous NT ou W2k)
avec ou sans référence aux objets Excel dans le projet VB (c'est plus pratique
avec une référence).

Je ne comprend pas vraiment pourquoi ça ne fonctionne pas dans ton cas avec
VB6 et Excel95 (et l'erreur 1004 est trop générique pour pouvoir en dire plus).
Une alternative est d'écrire ses propres routines comme tu le proposais. Une
autre possibilité serait de passer par ADO.

A+



Avatar
parci
>ADO ...



ADO n'est pas plus simple. Un peu plus performant si tu as de très gros fichier
(et avec Excel 2000 minimum pour profiter de la méthode CopyFromRecordset).
Ca permet surtout de sélectionner les données ou de faire une jointure.

Normalement ça devrait marcher aussi avec Excel95 tu dis ?



Si la méthode Workbooks.OpenText fonctionne dans une macro sous Excel95, je
ne comprends pas pourquoi elle ne marcherait pas depuis une instance d'Excel95
créée depuis VB. Je ne trouve pas de bugs référencés sur le sujet. Ce qui peut
changer avec cette méthode suivant différentes versions d'Excel, ce sont les
conventions de lecture/conversion des types de variables (en fonction ou non
des paramètres régionaux ...).

Tu pourrais peut-être essayer d'appeler cette macro écrite dans un classeur
Excel (version 95) depuis VB avec Application.Run.

A+

--
Message monitoré par axinews : http://www.axinews.com/
1 2