Как создать и записать в txt файл с помощью VBA

117

У меня есть файл, который добавляется или изменяется вручную на основе введенных данных. Поскольку большая часть содержимого в этом файле повторяется, меняются только шестнадцатеричные значения, я хочу сделать его файлом, созданным инструментом.

Я хочу написать коды c, которые будут напечатаны в этом файле .txt .

Какова команда для создания файла .txt с помощью VBA и как мне в него писать

Danny
источник
1
Вы хотите изменить существующий файл после его создания? А что такое «коды c»
brettdj
1
Если какой-либо из существующих ответов отвечал вашим потребностям, не могли бы вы принять его как ответ, чтобы ваш вопрос больше не оставался без ответа? (Если нет, пожалуйста, добавьте подробности о том, чего не хватает в существующих ответах, чтобы решить вашу проблему :))
Маркус Мангельсдорф

Ответы:

38

Чтобы уточнить ответ Бена :

Если вы добавите ссылку Microsoft Scripting Runtimeи правильно введете переменную fso, вы сможете воспользоваться функцией автозаполнения (Intellisense) и открыть для себя другие замечательные возможности FileSystemObject.

Вот полный пример модуля:

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
Маркус Мангельсдорф
источник
Спасибо, что написали полный ответ с полезными комментариями к коду.
Portland Runner,
Я более чем счастлив, если вы что-то узнали из моего поста! :)
Маркус Мангельсдорф
171

Используйте FSO для создания файла и записи в него.

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    

Смотрите документацию здесь:

Бен
источник
25
когда вы напрямую ссылаетесь на среду выполнения сценариев, вы можете использовать правильные типы: Dim oFs As New FileSystemObject Dim oFile As TextStream
TmTron
Предпочитает ли использование среды выполнения сценариев старый метод канала? Я хотел бы, чтобы у моих учеников была какая-то причина, чтобы поделиться информацией, подтвержденной другим опытом.
Рик Хендерсон
@RickHenderson, я предпочитаю это, если вы это имеете в виду. Преимущество - инкапсуляция. После того, как вы возразите (установите oFile = Nothing |) или выйдете за рамки, файл автоматически закроется.
Бен
2
Обратите внимание, что этот ответ способствует плохой практике кодирования : проблема в том, что неявное определение правильных типов переменных, а также создание объекта по строковой ссылке на его имя может привести к тому, что вам будет очень сложно отлаживать проблемы в будущем (например, если вы неправильно написаны части имени). Кроме того, не вводя переменные, у вас нет возможности узнать о других удивительных методах, FileSystemObjectкоторые могут предложить. @Ben: Пожалуйста, подумайте об обновлении своего ответа, чтобы вести новичков в лучшем направлении .
Маркус Мангельсдорф
2
@MarcusMangelsdorf Я вас слышал, но не хочу спорить.
Бен
43
Open ThisWorkbook.Path & "\template.txt" For Output As #1
Print #1, strContent
Close #1

Больше информации:

Бхану Синха
источник
Пожалуйста, напишите ответ с некоторыми пояснениями и деталями.
Мохаммед
4
Я предпочитаю этот метод методу FSO, потому что он не требует внешних ссылок и довольно короткий. Хотя я предлагаю использовать FreeFile для получения номера файла вместо жесткого кодирования его как №1.
phrebh
2
это отлично работает. Я никогда раньше не видел Open somePath For Output As #1синтаксиса, это документирует это: msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…
chiliNUT
5
Я предпочитаю этот подход и для обычного написания текстовых файлов. Эти утверждения были частью языка BASIC по крайней мере с 1981 года.
richardtallent 01
2
Относительно комментария от @phrebh об использовании FreeFile вместо жестко запрограммированного # 1 см. Wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
Джордж Бирбилис
33

простой способ без лишнего дублирования.

    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
источник
2
Можно ли использовать средство выбора файлов для установки пути?
РРП
Это создает файл в кодировке UCS2. Можно ли создать 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()
Зак Брайтман
источник
Это может помочь с написанием и чтением текстового файла
Зак Брайтман
1
Я думаю, вы не читаете, в чем заключается вопрос, а также вам не нравится объяснять, что вы собираетесь предпринять, что нехорошо, помогая другим.
М. Адил Халид
И вы даже неправильно форматируете свой ответ.
BDL
3
К сожалению, опубликованный вами код не является VBA. По My.Computer.FileSystemумолчанию в VBA нет объекта, поэтому вы также не можете использовать этот WriteAllTextметод.
Маркус Мангельсдорф
Зак, пожалуйста, не публикуйте только ответы с кодом и убедитесь, что язык, который вы используете, соответствует op.
Дэниел Л. ВанДенБош,