Séparateur

  • Initiateur de la discussion GUILLAUME
  • Date de début
G

GUILLAUME

Guest
Bonjour,
J'importe des données dans Excel depuis un fichier Texte, avec le "$" comme séparateur de champs.

Je ne veux pas utiliser la fonction "OPENTEXT" car je ne veux pas d'un nouveau classeur.

J'ai trouvé dans ce forum l'exemple parfait de ce que je souhaite faire.

Mais comment remplacer le type: "Longueur de champ" [Mid(Enreg, 1, 5)]par "Séparateur $"

Merci Bcp


Voici le code:

Sub recup_fichier()
i = 2
Open "c:\essai.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, Enreg
Range("A" & i) = Mid(Enreg, 1, 5)
Range("B" & i) = Mid(Enreg, 7, 15)
Range("C" & i) = Mid(Enreg, 23, 6)
i = i + 1
Loop
Close #1
End Sub
 
S

sousou

Guest
Voici un moyen à adapter à ton "enreg" qui peut remplacer phrase dans l'exemple.
Ce code décompose une phrase où le séparateur serait un"$".
Utilisation de la fonction instr() qui renvoie le rang du caractère recherché et des fonction left et right .

Ici je décompose une ligne qui se trouve dans la cellule active d'une feuille

Bonne chance


Sub test()
phrase = ActiveCell
While phrase <> ""
deb = 1
k1 = InStr(deb, phrase, "$")
MsgBox Mid(phrase, deb, k1-1)
deb = k1
phrase = Right(phrase, Len(phrase) - k1)
Wend
End Sub
 
B

Baroude

Guest
Hello !

Je te re-joins le fichier essai_input2.zip, toujours à mettre dans le répertoire racine C: avec le fichier texte (qui contient plein de $ !!!)

Dis-moi si c'est ce que tu désires
Baroude
 

Pièces jointes

  • essai_input2.zip
    8.2 KB · Affichages: 23
G

GUILLAUME

Guest
C'est simplement GENIAL !!!!!!!!!!!!!!!!!!!!!!

J'ai continuer à ajouter les lignes de commande et tout marche bien.

Juste pour comprendre, peux tu m'expliquer en détail ce que veulent dire les lignes.
Car j'ai recopier, ça marche mais c'est pas pour autant que j'ai tout compris.


Le seul "Bug" c'est que dans ton fichier Texte d'exemple toutes tes lignes commencent par un "$" et pas dans le mien. Mais c'est pas grave je vais bien trouver une ligne de commande qui me rajoute un signe $ devant toutes les lignes dans mon fichier texte, comme ça ta macro marchera toujours aussi bien, et moi ça ne me fais rien d'ajouter un signe à ce stade.

En tout cas, c'est francht cool de ta pars, une aide comme la tienne ne s'appel plus de l'aide mais un professorat !!

voici TON code:
Sub recup_fichier()
i = 2
Open "c:\essai.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, Enreg
'pos1 variable donnant la position du premier $
pos1 = WorksheetFunction.Find("$", Enreg, 1)
'pos2 variable donnant la position du deuxième $
pos2 = WorksheetFunction.Find("$", Enreg, pos1 + 1)
'pos3 variable donnant la position du troisième $
pos3 = WorksheetFunction.Find("$", Enreg, pos2 + 1)
'pos4 variable donnant la position du troisième $
pos4 = WorksheetFunction.Find("$", Enreg, pos3 + 1)
'pos5 variable donnant la position du troisième $
pos5 = WorksheetFunction.Find("$", Enreg, pos4 + 1)
'pos6 variable donnant la position du troisième $
pos6 = WorksheetFunction.Find("$", Enreg, pos5 + 1)
'pos7 variable donnant la position du troisième $
pos7 = WorksheetFunction.Find("$", Enreg, pos6 + 1)
'pos8 variable donnant la position du troisième $
pos8 = WorksheetFunction.Find("$", Enreg, pos7 + 1)
'pos9 variable donnant la position du troisième $
pos9 = WorksheetFunction.Find("$", Enreg, pos8 + 1)
'pos10 variable donnant la position du troisième $
pos10 = WorksheetFunction.Find("$", Enreg, pos9 + 1)
'pos11 variable donnant la position du troisième $
pos11 = WorksheetFunction.Find("$", Enreg, pos10 + 1)
'pos12 variable donnant la position du troisième $
pos12 = WorksheetFunction.Find("$", Enreg, pos11 + 1)



Range("A" & i) = Mid(Enreg, pos1 + 1, pos2 - pos1 - 1)
Range("B" & i) = Mid(Enreg, pos2 + 1, pos3 - pos2 - 1)
Range("C" & i) = Mid(Enreg, pos3 + 1, pos4 - pos3 - 1)
Range("D" & i) = Mid(Enreg, pos4 + 1, pos5 - pos4 - 1)
Range("E" & i) = Mid(Enreg, pos5 + 1, pos6 - pos5 - 1)
Range("F" & i) = Mid(Enreg, pos6 + 1, pos7 - pos6 - 1)
Range("G" & i) = Mid(Enreg, pos7 + 1, pos8 - pos7 - 1)
Range("H" & i) = Mid(Enreg, pos8 + 1, pos9 - pos8 - 1)
Range("I" & i) = Mid(Enreg, pos9 + 1, pos10 - pos9 - 1)
Range("J" & i) = Mid(Enreg, pos10 + 1, pos11 - pos10 - 1)
Range("K" & i) = Mid(Enreg, pos11 + 1, pos12 - pos11 - 1)
Range("L" & i) = Mid(Enreg, pos12 + 1)
i = i + 1
Loop
Close #1
End Sub
 
G

GUILLAUME

Guest
En fait je viens d'intégrer la macro à mon projet et en fait ça m'arange d'avoir 2 type de fichier texte différents.
(un avec au début de chaque ligne un signe $ et un autre sans)

Comme ça je vais pouvoir "tester" les fichiers avt soit de faire une exportation, soit une importation, et comme ça je vais pouvoir définir des fichiers de sauvegarde des autres.

En fait, il ne me manque plus qu'une ligne de commandes pour ajouter un "$" devant toutes les lignes.
 
G

GUILLAUME

Guest
Je pourai peut-être me servir de mon Exportation pour ajouter le signe $ en écrasant tout simplement le fichier...

Qu'en dis tu selon toi, queski est mieux ?
Avoir des fichiers totalement compatible ou des fichiers avec des structures différentes ??

Je ne sais plus à force de faire des essais



juste pour info, voici ma procédure d'exportation:

'Sub FichierTexteLISTE() 'séparateur de colonne "," Voir***
Dim Var As Object
Set Var = Range("LISTE!CARNET")
ficENTETE$ = Range("TABLE!cheminEXPORT").Value
FichierTXT = ficENTETE$ 'chemin et nom à modifier
NbColonne = Var.Columns.count
NbLigne = Var.Rows.count
CalcState = Application.Calculation
StatusBarState = Application.DisplayStatusBar
Application.Calculation = xlManual
Calculate
Application.StatusBar = "Patientez SVP...création du fichier"
Label3.Caption = Application.StatusBar
On Error GoTo Erreur
If Len(Dir(FichierTXT)) > 1 Then Kill FichierTXT 'Supprime le fichier s'il existe déjà
Open FichierTXT For Output As 1
While Row < NbLigne
Row = Row + 1
DoEvents
Application.StatusBar = Str$(Int((Row / NbLigne) * 100)) & "% achevé"
tbETAT.Value = Application.StatusBar
If (Not Var.Rows(Row).Hidden) Then
mv = ""
col = 0
While col < NbColonne
col = col + 1
If (Not Var.Columns(col).Hidden) Then
cellv = Var.Cells(Row, col).Text
End If
If col <> 1 Then
mv = mv & "$" & cellv
Else
mv = mv & cellv
End If
'changer dans la ligne ci-dessus le séparateur si vous le désirez ( mv = mv & "$" & cellv )
Wend
Print #1, mv
End If
Wend
Close
DoEvents
Application.Calculation = CalcState
Application.StatusBar = ""
Application.DisplayStatusBar = StatusBarState
Label3.Caption = "Création du fichier terminé !"
cbCLOSE.Visible = True
Exit Sub
Erreur:
 
B

Baroude

Guest
Hello !

Non, je ne pense pas que rajouter un $ en début de chaque ligne soit la solution...

On peut y arriver autrement et je pense aussi que si tu as beaucoup de champ à récupérer, on peut simplifier le code (avec des variables incrémentées autmatiquement et des "Array")...

Je vais regarder ce W.E. ....

A plus
Baroude
 
B

Baroude

Guest
Hello le forum !

Je re-re-joins un fichier zip avec des enregistrements qui ne commencent pas par un $.

Le code est plus court mais pas optimisé à mon sens....

Baroude
 

Pièces jointes

  • input.zip
    11 KB · Affichages: 23
  • input.zip
    11 KB · Affichages: 25
  • input.zip
    11 KB · Affichages: 22

Discussions similaires

Réponses
12
Affichages
561
Réponses
2
Affichages
446
Réponses
0
Affichages
148

Statistiques des forums

Discussions
312 196
Messages
2 086 099
Membres
103 116
dernier inscrit
kutobi87