含特殊字符的文件无法通过VBA的FileCopy及GetFile正常复制问题
解决VBA复制含特殊字符(如ż)文件的问题
问题根源是VBA内置的FileCopy和Scripting.FileSystemObject默认用ANSI字符集与系统交互,无法正确识别Unicode文件名里的特殊字符(比如波兰语的ż),导致路径匹配失败。以下是两种可靠的解决方法:
方法1:调用Windows Unicode版本API复制文件
直接用支持Unicode的CopyFileW API,绕过VBA内置函数的编码限制:
' 声明兼容32/64位Office的Unicode文件复制API Private Declare PtrSafe Function CopyFileW Lib "kernel32.dll" ( _ ByVal lpExistingFileName As LongPtr, _ ByVal lpNewFileName As LongPtr, _ ByVal bFailIfExists As Boolean _ ) As Boolean Sub CopyUnicodeFile() Dim FileToCopy As String Dim Destination As String ' 替换为实际的源文件路径和目标路径 FileToCopy = "C:\示例路径\sprzedaż.csv" Destination = "C:\目标路径\sprzedaż_备份.csv" ' 调用API执行复制,StrPtr直接传递Unicode字符串指针 If Not CopyFileW(StrPtr(FileToCopy), StrPtr(Destination), False) Then MsgBox "复制失败,错误代码:" & Err.LastDllError End If End Sub
说明:
CopyFileW是系统原生的Unicode文件复制函数,直接处理Unicode编码的路径StrPtr用于获取VBA字符串的Unicode内存地址,避免编码转换丢失特殊字符
方法2:用Shell.Application对象实现复制
借助Windows Shell的对象操作文件,天然支持Unicode路径:
Sub CopyWithShell() Dim FileToCopy As String Dim TargetFolder As String FileToCopy = "C:\示例路径\sprzedaż.csv" TargetFolder = "C:\目标路径\" Dim shellObj As Object Set shellObj = CreateObject("Shell.Application") ' 拆分路径获取文件所在文件夹和文件名,执行复制 shellObj.Namespace(TargetFolder).CopyHere _ shellObj.Namespace(Left(FileToCopy, InStrRev(FileToCopy, "\"))).Items.Item(Mid(FileToCopy, InStrRev(FileToCopy, "\") + 1)) Set shellObj = Nothing End Sub
说明:
Shell.Application的Namespace方法完全支持Unicode路径CopyHere模拟Windows资源管理器的复制逻辑,能正确识别带特殊字符的文件名
额外提示
如果是在遍历文件时就出现字符识别错误,建议改用FindFirstFileW和FindNextFileW这类Unicode API枚举文件,避免在路径获取阶段就丢失特殊字符信息。
内容的提问来源于stack exchange,提问作者niflheimis
相关产品推荐
相关产品推荐

