如何在Windows下强制VBA CreateTextFile生成Big5编码(CR LF)文件?
问题
在Windows系统中用VBA代码创建Big5编码的TXT文件,后续想用OpenTextFile处理时,发现生成的文件是Macintosh(CR)换行格式,导致无法正常处理。用Notepad++查看确认格式为Macintosh(CR),搞不懂为啥Windows环境下的VBA会生成这种格式。
用到的代码如下:
With (CreateObject("Scripting.FileSystemObject")) If .FileExists(logFile) Then Msgbox "File Exist" Else Set WSO = FSO.CreateTextFile(logFile,8, False) Msgbox "File Created" WSO.Close End If End With
想解决两个问题:
- 怎么强制VBA的
CreateTextFile在Windows下生成Big5编码且用CR LF换行的文件? - 有没有办法让
OpenTextFile兼容Macintosh(CR)格式的文件?(已知OpenTextFile只支持ANSI或Unicode格式)
解决方案
一、强制生成CR LF换行+Big5编码的文件
CreateTextFile的换行格式本来和系统默认脚本宿主绑定,Windows下正常应该是CR LF,但如果VBA环境配置异常(比如残留了Mac环境的对象引用),就可能出问题。可以用下面两种方法解决:
方法1:用ADODB.Stream精准控制编码和换行
这种方式完全不受系统环境影响,能直接指定Big5编码和CR LF换行:
' 使用ADODB.Stream生成指定格式的文件 Dim stream As Object Set stream = CreateObject("ADODB.Stream") stream.Charset = "big5" ' 明确指定Big5编码 stream.Mode = 3 ' 设置为读写模式 stream.Type = 2 ' 文本模式 stream.Open ' 写入内容时手动用vbCrLf作为换行符 stream.WriteText "测试内容1" & vbCrLf & "测试内容2" stream.SaveToFile logFile, 2 ' 2代表覆盖已有文件,1代表新建 stream.Close Set stream = Nothing
方法2:修正FileSystemObject的使用代码
原代码里有个明显错误:用With CreateObject("Scripting.FileSystemObject")包裹,但内部却调用了未定义的FSO.CreateTextFile,这可能导致引用了异常的FSO对象(比如之前Mac环境下的残留对象)。修正代码并显式控制换行:
Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FileExists(logFile) Then MsgBox "File Exist" Else ' CreateTextFile第二个参数是布尔值,True允许覆盖,原代码的8是错误参数 Set WSO = FSO.CreateTextFile(logFile, True, False) ' 写入内容时显式用vbCrLf确保Windows换行格式 WSO.Write "测试内容" & vbCrLf MsgBox "File Created" WSO.Close End If Set FSO = Nothing
二、让OpenTextFile兼容Macintosh(CR)格式
OpenTextFile本身不支持直接识别CR换行,但可以先读取文件内容,手动把CR替换成CRLF后再处理:
Dim FSO As Object, fileObj As Object, fileContent As String Set FSO = CreateObject("Scripting.FileSystemObject") Set fileObj = FSO.OpenTextFile(logFile, 1) ' 1=只读模式 fileContent = fileObj.ReadAll ' 读取全部文件内容 fileObj.Close ' 将所有Mac格式的CR换行替换为Windows的CRLF fileContent = Replace(fileContent, vbCr, vbCrLf) ' 现在可以处理替换后的内容,示例:保存为修正后的文件 Set fileObj = FSO.CreateTextFile(logFile & "_fixed.txt", True, False) fileObj.Write fileContent fileObj.Close Set FSO = Nothing
内容的提问来源于stack exchange,提问作者Josesuntw
相关产品推荐
相关产品推荐

