Як створити та записати у файл 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.