web-dev-qa-db-fra.com

Fichier texte dans VBA: Ouvrir/Rechercher Remplacer/Enregistrer sous/Fermer le fichier

Voici le pseudocode pour ce que j'espère faire:

Open text File

Find "XXXXX" and Replace with "YYYY"

Save text File As

Close text file

C'est ce que j'ai jusqu'ici

Private Sub CommandButton1_Click()

Dim sBuf As String
Dim sTemp As String
Dim iFileNum As Integer
Dim sFileName As String

' Edit as needed
sFileName = "C:\filelocation"

iFileNum = FreeFile
Open sFileName For Input As iFileNum

Do Until EOF(iFileNum)
Line Input #iFileNum, sBuf
sTemp = sTemp & sBuf & vbCrLf
Loop
Close iFileNum

sTemp = Replace(sTemp, "DIM A", "1.75")
sTemp = Replace(sTemp, "DIM B", "2.00")
sTemp = Replace(sTemp, "DIM C", "3.00")
sTemp = Replace(sTemp, "DIM D", "4.00")

'Save txt file as (if possible)

iFileNum = FreeFile
Open sFileName For Output As iFileNum

Print #iFileNum, sTemp

Close iFileNum

'Close Userform
Unload UserForm1

End Sub

Mais au lieu de remplacer le fichier texte original, je souhaite "enregistrer sous" dans un nouveau fichier.

5
Russell Saari

Il suffit d'ajouter cette ligne

sFileName = "C:\someotherfilelocation"

juste avant cette ligne

Open sFileName For Output As iFileNum

L'idée est d'ouvrir et d'écrire dans un fichier différent que celui que vous avez lu précédemment (C:\filelocation). 

Si vous voulez avoir du style et afficher une vraie boîte de dialogue "Enregistrer sous", vous pouvez le faire à la place:

sFileName = Application.GetSaveAsFilename()

Pourquoi impliquer le Bloc-notes?

Sub ReplaceStringInFile()

Dim sBuf As String
Dim sTemp As String
Dim iFileNum As Integer
Dim sFileName As String

' Edit as needed
sFileName = "C:\Temp\test.txt"

iFileNum = FreeFile
Open sFileName For Input As iFileNum

Do Until EOF(iFileNum)
    Line Input #iFileNum, sBuf
    sTemp = sTemp & sBuf & vbCrLf
Loop
Close iFileNum

sTemp = Replace(sTemp, "THIS", "THAT")

iFileNum = FreeFile
Open sFileName For Output As iFileNum
Print #iFileNum, sTemp
Close iFileNum

End Sub
9
Steve Rindsberg

Je suppose que je suis trop tard ... 

A rencontré le même problème aujourd'hui; voici ma solution en utilisant FileSystemObject:

Dim objFSO
Const ForReading = 1
Const ForWriting = 2
Dim objTS 'define a TextStream object
Dim strContents As String
Dim fileSpec As String

fileSpec = "C:\Temp\test.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile(fileSpec, ForReading)
strContents = objTS.ReadAll
strContents = Replace(strContents, "XXXXX", "YYYY")
objTS.Close

Set objTS = objFSO.OpenTextFile(fileSpec, ForWriting)
objTS.Write strContents
objTS.Close
7
Bojie Shuai

J'ai eu le même problème et suis venu sur ce site.

la solution pour simplement définir un autre "nom de fichier" dans le

... pour la sortie en tant que ... la commande était très simple et utile.

en plus (au-delà de la boîte de dialogue Application.GetSaveAsFilename ())

il est très simple de définir un ** nouveau nom de fichier ** en utilisant simplement 

le replace command, afin que vous puissiez changer le nom de fichier/extension

par exemple. (à partir du premier post)

sFileName = "C:\filelocation"
iFileNum = FreeFile

Open sFileName For Input As iFileNum
content = (...edit the content) 

Close iFileNum

viens de définir:

newFilename = replace (sFilename, ".txt", ".csv") pour changer l'extension

ou

newFilename = replace (sFilename, ".", "_edit.") pour un nom de fichier différent

et juste comme avant

iFileNum = FreeFile
Open newFileName For Output As iFileNum

Print #iFileNum, content
Close iFileNum 

J'ai surfé pendant plus d'une heure pour savoir comment renommer un fichier txt,

avec beaucoup de solutions différentes, mais ça pourrait être tellement facile :)

0
zmx