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

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ó

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:18:01