Як створити та записати у файл txt за допомогою VBA


116

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

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

Яка команда створити .txt файл за допомогою VBA, і як мені в нього записати


1
Ви хочете змінити існуючий файл після його створення? А що таке "коди c"
brettdj

1
Якщо будь-який із існуючих відповідей відповідав вашим потребам, ви б проти того, щоб прийняти його як відповідь, тож ваше запит більше не відображатиметься як без відповіді? (Якщо ні, будь ласка, додайте подробиці про те, чого не вистачає в існуючих відповідях, щоб вирішити вашу проблему :))
Маркус Мангельсдорф

Відповіді:


37

Щоб уточнити відповідь Бена :

Якщо ви додасте посилання 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

Дякуємо, що написали повну відповідь з корисними коментарями до коду.
Портленд Бігун

Я більш ніж щасливий, якщо ви щось дізналися з мого посту! :)
Маркус Мангельсдорф

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 = Нічого |), або він виходить за межі області, файл автоматично закриється.
Бен

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/…
chiliНУ

5
Я віддаю перевагу такому підходу також для письмових текстових файлів. Ці висловлювання є частиною мови
БАЗИКУ

2
Щодо коментаря @phrebh про використання FreeFile замість жорсткого коду
Джордж Бірбіліс

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

2
Чи можливо використовувати інструмент вибору файлів для встановлення шляху?
rrs

Це створює файл, який кодується UCS2. Чи можливо створити такий, який є ANSI?
паолов

-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метод.
Маркус Мангельсдорф

Зак, будь ласка, уникайте розміщення відповідей лише на код та переконайтесь, що мова, якою ви користуєтесь, відповідає оп.
Даніель Л. ВанДенБош
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.