You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含特殊字符的文件无法通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:00:00