我的问题的示范
- 打开一个新的工作簿,并保存这些符号设计师协会到小区[A1]
- 在编辑器(ALT + F11)的地方插入下面的VBA代码
- 执行它每行线(F8)
Sub test()
strCRLF = StrConv(vbCrLf, vbUnicode)
strSpecialchars = StrConv(Cells(1, 1), vbUnicode)
strFilename = "c:\test.txt"
Open strFilename For Output As #1
Print #1, strSpecialchars & strCRLF;
Close #1
End Sub
您将获得其中包含[A1]中国汉字文本文件里。 这证明,证明VBA是能够处理Unicode字符,如果你知道的伎俩与加StrConv(vbCrLf, vbUnicode)
现在尝试对同一strFilename = "C:\" & strSpecialchars & ".txt"
你会得到你不能创建这个文件名的文件中的错误。 当然,你不能用同样的伎俩添加一个新行,因为它的文件名。
如何创建文本文件使用VBA在其文件名的特殊字符?
是否有一个变通或我做错了什么?
注意
- 我使用的是Windows 7 64位系统。 我能够创建具有手动特殊字符的文本文件
- 我发现了一个使用FileSystemObject的第二种方法 。 但我希望我能避免设置的引用到VB脚本运行时库
从电池获取的值已经为Unicode。
StrConv(vbUnicode)
为您提供了“双unicode的”,因为它采用了目前sustem代码页去通过转换在被折断。
然后Print
命令将其转换回“单个Unicode”,再次使用当前的系统代码页。 不要这样做。 你不节能unicode的,你是在救无效的东西,可能只出现在特定的计算机上的有效下您的当前设置。
如果你想输出Unicode数据(即,避免从Unicode到ANSI自动转换输出文本的默认VB机制),你有几种选择。
最简单的就是使用FileSystemObject
,但不尝试创造约Unicode转换任何内容:
With CreateObject("Scripting.FileSystemObject")
With .CreateTextFile("C:\" & Cells(1).Value & ".txt", , True)
.Write Cells(1).Value
.Close
End With
End With
需要注意的是控制Unicode的最后一个参数。
如果你不希望出现这种情况,你可以声明CreateFileW
和WriteFile
功能:
Private Declare Function CreateFileW Lib "kernel32.dll" (ByVal lpFileName As Long, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, ByRef lpNumberOfBytesWritten As Long, ByRef lpOverlapped As Any) As Long
Private Const CREATE_ALWAYS As Long = 2
Private Const GENERIC_WRITE As Long = &H40000000
Dim hFile As Long
hFile = CreateFileW(StrPtr("C:\" & Cells(1).Value & ".txt"), GENERIC_WRITE, 0, ByVal 0&, CREATE_ALWAYS, 0, 0)
Dim val As String
val = Cells(1).Value
WriteFile hFile, &HFEFF, 2, 0, ByVal 0& 'Unicode byte order mark (not required, but to please Notepad)
WriteFile hFile, ByVal StrPtr(val), Len(val) * 2, 0, ByVal 0&
CloseHandle hFile
你是在正确的轨道使用FileSystemObject上。 正如Morbo提到你可以晚绑定这个所以没有引用设置。 的FSO具有可以以Unicode被设置成字符将显示为CreateTextFile函数“??????” 在VBA,但会正确地写入的文件名。 请注意,CreateTextFile函数的第二个参数指定文件名的unicode字符串。 下面将做的伎俩为您提供:
Sub test()
Dim strCRLF As String, strSpecialchars As String, strFilename As String
Dim oFSO As Object, oFile As Object
strCRLF = StrConv(vbCrLf, vbUnicode)
strSpecialchars = StrConv(Cells(1, 1), vbUnicode)
strFilename = "C:\" & Cells(1, 1).Value & ".txt"
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.CreateTextFile(strFilename, , True)
oFile.Write strSpecialchars & strCRLF
oFile.Close
Set oFile = Nothing
Set oFSO = Nothing
End Sub