如何使用VBA创建和写入txt文件


116

我有一个根据输入手动添加或修改的文件。由于该文件中的大多数内容都是重复的,因此只有十六进制值在更改,因此我想使其成为工具生成的文件。

我想编写将在该.txt文件中打印的c代码。

使用VBA 创建.txt文件的命令是什么,如何写入该文件


1
创建现有文件后,是否要对其进行修改?什么是“ c代码”
brettdj

1
如果有任何现有答案满足您的需求,您是否愿意接受它作为答案,因此您的问题不再显示为未回答?(如果没有,请添加现有答案中缺少的详细信息以解决您的问题:))
Marcus Mangelsdorf

Answers:


37

要详细说明Ben的答案

如果添加引用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

感谢您编写完整的答案,并提供有用的代码注释。
波特兰赛跑者

如果您从我的帖子中学到了什么,我会很高兴!:)
Marcus Mangelsdorf

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
时时

是使用Scripting Runtime而不是旧版Channel方法?我希望有一些理由告诉我的学生有关其他经验的信息。
瑞克·亨德森

@RickHenderson,如果您的意思是我喜欢的话。优点是封装。反对(设置oFile = Nothing |)或超出范围后,文件将自动关闭。

2
请注意,此答案会促进不良的编码实践:问题是,未明确定义正确的变量类型以及通过引用对象名称的字符串创建对象可能会导致您将来很难调试问题(例如,如果您名称的拼写错误)。另外,通过不键入变量,您将无法了解其他令人惊奇的方法FileSystemObject。@Ben:请考虑将您的答案更新更好的指导新手。
Marcus Mangelsdorf '18

2
@MarcusMangelsdorf我已经听到了您的声音,但我不想辩论。

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

更多信息:


请写一些答案和一些详细的答案。
Mohammed Noureldin

4
与FSO方法相比,我更喜欢这种方法,因为它不需要外部引用,而且很短。尽管我确实建议使用FreeFile获取文件号,而不是将其硬编码为#1。
phrebh

2
这很好。我之前从未见过Open somePath For Output As #1语法,它记录了该语法:msdn.microsoft.com/en-us/vba/language-reference-vba/articles/…–
chiliNUT

5
对于平凡的文本文件编写,我也更喜欢这种方法。这些声明至少自1981
。– richardtallent

2
关于@phrebh关于使用FreeFile代替硬编码#1的评论,请参见wellsr.com/vba/2016/excel/vba-freefile-for-foolproof-file-IO
George Birbilis

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

这可以帮助编写和读取文本文件
Zack Brightman

1
我认为您没有阅读问题所在,也不想解释要尝试的事情,而这对帮助他人却不是一件好事。
M. Adeel Khalid

而且您甚至没有正确设置答案的格式。
BDL

3
不幸的是,您发布的代码不是VBA。My.Computer.FileSystem默认情况下,VBA中没有对象,因此您也不能使用该WriteAllText方法。
Marcus Mangelsdorf

Zack,请避免仅发布代码答案,并确保您使用的语言与op内联。
Daniel L. VanDenBosch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.