Jak tworzyć i zapisywać w pliku txt za pomocą VBA


116

Mam plik, który jest ręcznie dodawany lub modyfikowany na podstawie danych wejściowych. Ponieważ większość zawartości w tym pliku jest powtarzalna, zmieniają się tylko wartości szesnastkowe, chcę, aby był to plik wygenerowany przez narzędzie.

Chcę napisać kody c, które zostaną wydrukowane w tym pliku .txt .

Jakie jest polecenie utworzenia pliku .txt za pomocą VBA i jak mam do niego pisać


1
Czy chcesz zmodyfikować istniejący plik po jego utworzeniu? A co to są „kody c”
brettdj

1
Jeśli któraś z istniejących odpowiedzi spełniła Twoje potrzeby, czy mógłbyś zaakceptować ją jako odpowiedź, aby Twoje pytanie nie było już bez odpowiedzi? (Jeśli nie, dodaj szczegóły, czego brakuje w istniejących odpowiedziach, aby rozwiązać problem :))
Marcus Mangelsdorf

Odpowiedzi:


37

Aby rozwinąć odpowiedź Bena :

Jeśli dodać odwołanie do Microsoft Scripting Runtimei poprawnie wpisać zmienną FSO można skorzystać z autouzupełniania (Intellisense) i odkryć innych wspaniałych cech FileSystemObject.

Oto kompletny przykładowy moduł:

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

Dziękujemy za napisanie pełnej odpowiedzi z pomocnymi komentarzami do kodu.
Portland Runner

Jestem bardziej niż szczęśliwy, jeśli dowiedziałeś się czegoś z mojego postu! :)
Marcus Mangelsdorf

171

Użyj FSO, aby utworzyć plik i zapisać do niego.

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    

Zobacz dokumentację tutaj:


25
gdy odwołujesz się bezpośrednio do środowiska wykonawczego skryptów, możesz użyć poprawnych typów: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron,

Czy preferowane jest używanie środowiska wykonawczego skryptów w porównaniu ze starszą metodą kanału? Chciałbym przedstawić kilka powodów, dla których powinniśmy przekazać uczniom informacje poparte innymi doświadczeniami.
Rick Henderson

@RickHenderson, wolę to, jeśli o to ci chodzi. Zaletą jest hermetyzacja. Gdy sprzeciwiasz się (ustaw oFile = Nothing |) lub wyjdzie poza zakres, plik zostanie automatycznie zamknięty.
Ben

2
Zwróć uwagę, że ta odpowiedź promuje złe praktyki kodowania : Problem polega na tym, że nieokreślone zdefiniowanie poprawnych typów zmiennych, a także utworzenie obiektu przez odwołanie w postaci ciągu do jego nazwy może spowodować bardzo trudne debugowanie problemów w przyszłości (na przykład jeśli błędna pisownia części nazwy). Ponadto, nie wpisując zmiennych, nie masz możliwości poznania innych niesamowitych metod, które FileSystemObjectmają do zaoferowania. @Ben: Proszę rozważyć zaktualizowanie swojej odpowiedzi, aby poprowadzić początkujących w lepszym kierunku .
Marcus Mangelsdorf,

2
@MarcusMangelsdorf Słyszałem cię, ale nie chcę debatować.
Ben

43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Więcej informacji:


Proszę, napisz odpowiedź z kilkoma wyjaśnieniami i szczegółami.
Mohammed Noureldin

4
Wolę tę metodę od metody FSO, ponieważ nie wymaga ona zewnętrznych odniesień i jest dość krótka. Chociaż sugeruję użycie FreeFile, aby uzyskać numer pliku zamiast zakodowania go na sztywno jako # 1.
phrebh

2
to działa świetnie. Nigdy wcześniej nie widziałem Open somePath For Output As #1składni, ta dokumentuje to: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
chiliNUT

5
Wolę to podejście również do zwykłego pisania plików tekstowych. Te stwierdzenia są częścią języka BASIC od co najmniej 1981 roku.
richardtallent

2
Odnośnie komentarza @phrebh na temat używania FreeFile zamiast zakodowanego na stałe # 1, patrz wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis

33

łatwy sposób bez dużej nadmiarowości.

    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

2
Czy można użyć selektora plików do ustawienia ścieżki?
rrs

Tworzy to plik zakodowany w formacie UCS2. Czy można stworzyć taki, który jest ANSI?
paolov

-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()

Może to pomóc w pisaniu i czytaniu pliku tekstowego
Zack Brightman,

1
Myślę, że nie czytasz, o co chodzi, a także nie lubisz wyjaśniać, czego zamierzasz się podjąć, co nie jest dobrą rzeczą podczas pomagania innym.
M. Adeel Khalid,

I nawet nie formatujesz poprawnie swojej odpowiedzi.
BDL

3
Niestety, opublikowany przez Ciebie kod nie jest językiem VBA. My.Computer.FileSystemDomyślnie nie ma obiektu w VBA, więc nie możesz również użyć tej WriteAllTextmetody.
Marcus Mangelsdorf

Zack, proszę unikać wysyłania tylko odpowiedzi na kod pocztowy i upewnij się, że język, którego używasz, jest w linii z op.
Daniel L. VanDenBosch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.