VBA如何打开文件名含高于高ASCII(256)的特殊字符的文件
解决方案
问题本质
VBA 内置的 Dir、FileDateTime 函数依赖系统默认 ANSI 代码页运行,当文件名包含超出当前代码页范围的 Unicode 字符(如你遇到的 Ű、Ő 等)时,会被自动替换为近似字符或乱码,导致后续路径匹配失败。你之前尝试的 StrConv 转换无效,是因为 Dir 返回的文件名本身已经被 ANSI 转码破坏,无法通过转码恢复正确的 Unicode 字符。
修复后的代码
完全采用支持 Unicode 的 FileSystemObject 实现文件遍历,不需要修改系统配置即可兼容特殊字符文件名:
Sub open_last_modified() ' 前期绑定需先引用:工具->引用->勾选 "Microsoft Scripting Runtime" ' 若要使用晚绑定无需引用,将下一行改为 Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject") Dim fso As New FileSystemObject Dim targetFolder As Folder Dim singleFile As File Dim lmfile As String Dim lmdate As Date Dim folderPath As String folderPath = "C:\Users\szidzse\Desktop\" Set targetFolder = fso.GetFolder(folderPath) ' 初始化最早比较时间 lmdate = DateSerial(1900, 1, 1) ' 遍历文件夹下所有文件,FSO原生支持Unicode,不会丢失特殊字符 For Each singleFile In targetFolder.Files If singleFile.DateLastModified > lmdate Then lmdate = singleFile.DateLastModified lmfile = singleFile.Name End If Next singleFile ' 操作时直接用FSO返回的正确文件名 If lmfile <> "" Then Workbooks.Open folderPath & lmfile, ReadOnly:=True fso.CopyFile Source:=folderPath & lmfile, Destination:=folderPath & "temp.xlsx" End If End Sub
核心修改说明
- 移除了所有依赖 ANSI 编码的内置文件操作函数,全程使用
FileSystemObject完成文件遍历、属性读取、文件复制操作,FSO 原生支持 Unicode 字符,不会对特殊文件名做转义替换 - 直接通过
File.DateLastModified属性读取修改时间,避免FileDateTime对路径做转码导致的匹配失败 - 增加了空文件名判断,避免文件夹为空时报错
内容的提问来源于stack exchange,提问作者Attila Ragó
相关产品推荐
相关产品推荐

