2

演示我的问题

  • 打开一个新的 Excel 工作簿并将这些符号设计师协会保存到单元格 [A1]
  • 在编辑器中的某处插入以下 VBA 代码 ( Alt+ F11)
  • 每行执行它 ( F8)
子测试()

    strCRLF = StrConv(vbCrLf, vbUnicode)
    strSpecialchars = StrConv(单元格(1, 1),vbUnicode)
    strFilename = "c:\test.txt"

    打开 strFilename 以输出为 #1
    打印 #1, strSpecialchars & strCRLF;
    关闭 #1

结束子

您将获得一个包含 [A1] 中的中文字符的文本文件。如果您知道添加的技巧,这证明 VBA 能够处理 unicode 字符StrConv(vbCrLf, vbUnicode)

现在尝试相同的strFilename = "C:\" & strSpecialchars & ".txt". 你会得到一个错误,你不能用这个文件名创建一个文件。当然,您不能使用相同的技巧添加新行,因为它是文件名。

如何使用 VBA 创建文件名中包含特殊字符的文本文件?
有解决方法还是我做错了什么?

笔记

4

2 回答 2

6

从单元格中检索到的值已经是 Unicode。

StrConv(vbUnicode)为您提供“双 unicode”,该代码已损坏,因为它使用当前系统代码页进行了转换。
然后该Print命令将其转换回“单一 unicode”,再次使用当前系统代码页。不要这样做。您不是在保存 unicode,而是在保存无效的东西,这些东西可能只在您当前设置下的特定计算机上显示有效。

如果要输出 Unicode 数据(即避免默认的 VB 将输出文本从 Unicode 自动转换为 ANSI 的机制),您有多种选择。

最简单的方法是在FileSystemObject不尝试发明任何有关 unicode 转换的情况下使用:

With CreateObject("Scripting.FileSystemObject")
  With .CreateTextFile("C:\" & Cells(1).Value & ".txt", , True)
    .Write Cells(1).Value
    .Close
  End With
End With

请注意控制 Unicode 的最后一个参数。

如果你不想这样,你可以声明CreateFileWWriteFile函数:

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
于 2013-01-12T11:24:35.913 回答
3

您在 FileSystemObject 的正确轨道上。正如 Morbo 提到的,您可以后期绑定它,因此没有设置参考。FSO 有一个 CreateTextFile 函数,可以在 unicode 中设置,因此字符将显示为 '??????' 在 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
于 2013-01-12T10:53:34.363 回答