Erstellen und Schreiben einer TXT-Datei mit VBA

116

Ich habe eine Datei, die basierend auf den Eingaben manuell hinzugefügt oder geändert wird. Da sich die meisten Inhalte in dieser Datei wiederholen, ändern sich nur die Hex-Werte. Ich möchte daraus eine vom Tool generierte Datei machen.

Ich möchte die c-Codes schreiben, die in dieser TXT- Datei gedruckt werden sollen.

Was ist der Befehl zum Erstellen einer TXT- Datei mit VBA und wie schreibe ich darauf ?

danny
quelle
1
Möchten Sie eine vorhandene Datei nach ihrer Erstellung ändern? Und was ist "die c-Codes"
brettdj
1
Wenn eine der vorhandenen Antworten Ihren Anforderungen entspricht, würde es Ihnen etwas ausmachen, sie als Antwort zu akzeptieren, sodass Ihre Frage nicht mehr als unbeantwortet angezeigt wird? (Wenn nicht, fügen Sie bitte Details hinzu, was in den vorhandenen Antworten fehlt, um Ihr Problem zu lösen :))
Marcus Mangelsdorf

Antworten:

37

Um auf Bens Antwort einzugehen :

Wenn Sie einen Verweis auf Microsoft Scripting Runtimedie Variable f hinzufügen und diese korrekt eingeben , können Sie die automatische Vervollständigung (Intellisense) nutzen und die anderen großartigen Funktionen von entdecken FileSystemObject.

Hier ist ein vollständiges Beispielmodul:

Option Explicit

' Go to Tools -> References... and check "Microsoft Scripting Runtime" to be able to use
' the FileSystemObject which has many useful features for handling files and folders
Public Sub SaveTextToFile()

    Dim filePath As String
    filePath = "C:\temp\MyTestFile.txt"

    ' The advantage of correctly typing fso as FileSystemObject is to make autocompletion
    ' (Intellisense) work, which helps you avoid typos and lets you discover other useful
    ' methods of the FileSystemObject
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    Dim fileStream As TextStream

    ' Here the actual file is created and opened for write access
    Set fileStream = fso.CreateTextFile(filePath)

    ' Write something to the file
    fileStream.WriteLine "something"

    ' Close it, so it is not locked anymore
    fileStream.Close

    ' Here is another great method of the FileSystemObject that checks if a file exists
    If fso.FileExists(filePath) Then
        MsgBox "Yay! The file was created! :D"
    End If

    ' Explicitly setting objects to Nothing should not be necessary in most cases, but if
    ' you're writing macros for Microsoft Access, you may want to uncomment the following
    ' two lines (see https://stackoverflow.com/a/517202/2822719 for details):
    'Set fileStream = Nothing
    'Set fso = Nothing

End Sub
Marcus Mangelsdorf
quelle
Vielen Dank, dass Sie eine vollständige Antwort mit hilfreichen Kommentaren zum Code geschrieben haben.
Portland Runner
Ich bin mehr als glücklich, wenn Sie etwas von meinem Beitrag gelernt haben! :)
Marcus Mangelsdorf
171

Verwenden Sie FSO, um die Datei zu erstellen und in sie zu schreiben.

Dim fso as Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim oFile as Object
Set oFile = FSO.CreateTextFile(strPath)
oFile.WriteLine "test" 
oFile.Close
Set fso = Nothing
Set oFile = Nothing    

Siehe die Dokumentation hier:

Ben
quelle
25
Wenn Sie direkt auf die Scripting-Laufzeit verweisen, können Sie die richtigen Typen verwenden: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron
Wird die Verwendung der Scripting-Laufzeit der älteren Kanalmethode vorgezogen? Ich möchte meinen Schülern einige Gründe mit Informationen mitteilen, die auf anderen Erfahrungen beruhen.
Rick Henderson
@ RickHenderson, ich bevorzuge es, wenn du das meinst. Der Vorteil ist die Einkapselung. Sobald Sie ein Objekt (set oFile = Nothing |) oder den Gültigkeitsbereich verlassen, wird die Datei automatisch geschlossen.
Ben
2
Bitte beachten Sie, dass diese Antwort zu einer schlechten Codierungspraxis führt : Das Problem besteht darin, dass das Nicht-explizite Definieren der richtigen Variablentypen sowie das Erstellen eines Objekts durch einen Zeichenfolgenverweis auf seinen Namen in Zukunft zu Problemen beim Debuggen führen kann (z. B. wenn Sie dies tun) falsch geschriebene Teile des Namens). Wenn Sie die Variablen nicht eingeben, haben Sie auch keine Möglichkeit, mehr über die anderen erstaunlichen Methoden zu erfahren FileSystemObject. @ Ben: Bitte erwägen Sie, Ihre Antwort zu aktualisieren , um Anfänger in eine bessere Richtung zu führen .
Marcus Mangelsdorf
2
@MarcusMangelsdorf Ich habe dich gehört, aber ich möchte keine Debatte führen.
Ben
43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Mehr Informationen:

Bhanu Sinha
quelle
Bitte schreiben Sie die Antwort mit einigen Erklärungen und Details.
Mohammed Noureldin
4
Ich ziehe diese Methode der FSO-Methode vor, da sie keine externen Referenzen erfordert und recht kurz ist. Obwohl ich vorschlage, FreeFile zu verwenden, um die Dateinummer zu erhalten, anstatt sie als Nummer 1 fest zu codieren.
Phrebh
2
das funktioniert super. Ich habe die Open somePath For Output As #1Syntax noch nie gesehen , dies dokumentiert sie: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
chiliNUT
5
Ich bevorzuge diesen Ansatz auch für das weltliche Schreiben von Textdateien. Diese Aussagen sind seit mindestens 1981 Teil der BASIC-Sprache.
richardtallent
2
Bezüglich des Kommentars von @phrebh zur Verwendung von FreeFile anstelle einer fest codierten Nummer 1 siehe wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis
33

Ein einfacher Weg ohne viel Redundanz.

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim Fileout As Object
    Set Fileout = fso.CreateTextFile("C:\your_path\vba.txt", True, True)
    Fileout.Write "your string goes here"
    Fileout.Close
Pelos
quelle
2
Ist es möglich, den Pfad mit der Dateiauswahl festzulegen?
rrs
Dadurch wird eine Datei erstellt, die UCS2-codiert ist. Ist es möglich, eine ANSI zu erstellen?
Paulov
-10
Dim SaveVar As Object

Sub Main()

    Console.WriteLine("Enter Text")

    Console.WriteLine("")

    SaveVar = Console.ReadLine

    My.Computer.FileSystem.WriteAllText("N:\A-Level Computing\2017!\PPE\SaveFile\SaveData.txt", "Text: " & SaveVar & ", ", True)

    Console.WriteLine("")

    Console.WriteLine("File Saved")

    Console.WriteLine("")

    Console.WriteLine(My.Computer.FileSystem.ReadAllText("N:\A-Level Computing\2017!\PPE\SaveFile\SaveData.txt"))
    Console.ReadLine()

End Sub()
Zack Brightman
quelle
Dies kann beim Schreiben und Lesen einer Textdatei helfen
Zack Brightman
1
Ich denke, Sie lesen nicht, was die Frage ist, und Sie möchten auch nicht erklären, was Sie versuchen werden, was nicht gut ist, wenn Sie anderen helfen.
M. Adeel Khalid
Und Sie formatieren Ihre Antwort nicht einmal richtig.
BDL
3
Leider ist der von Ihnen gepostete Code nicht VBA. My.Computer.FileSystemIn VBA ist standardmäßig kein Objekt vorhanden, sodass Sie die WriteAllTextMethode auch nicht verwenden können .
Marcus Mangelsdorf
Zack, bitte vermeiden Sie es, nur Antworten mit Code zu veröffentlichen, und stellen Sie sicher, dass die von Ihnen verwendete Sprache mit op übereinstimmt.
Daniel L. VanDenBosch