使用ThisWorkbook.Path获取同目录工作簿文件名遇运行时错误52
解决VBA中ThisWorkbook.Path结合Dir函数触发Runtime Error 52的问题
问题分析
你的代码触发Runtime Error 52(无效文件名或编号)有两个核心原因:
- 路径拼接错误:
ThisWorkbook.Path返回的路径末尾默认不带路径分隔符(\),直接拼接"*.csv*"会生成类似C:\TestFolder*.csv的无效路径,Dir函数无法识别。 - OneDrive同步影响:当文件夹被OneDrive备份时,
ThisWorkbook.Path返回的可能是OneDrive的在线URL(而非本地磁盘路径),Dir函数仅支持本地文件路径,因此报错。
修正方案
方案1:修复路径分隔符问题(适用于本地路径场景)
先确保路径末尾带有\,再进行文件匹配,代码如下:
Sub WorksheetImport() Dim vWBFolder As String Dim vWBName As String vWBFolder = ThisWorkbook.Path ' 检查并补充路径分隔符 If Right(vWBFolder, 1) <> "\" Then vWBFolder = vWBFolder & "\" End If ' 匹配csv文件(原代码的"*.csv*"会匹配含csv的文件名,建议用"*.csv"精准匹配) vWBName = Dir(vWBFolder & "*.csv") MsgBox vWBName End Sub
方案2:处理OneDrive在线路径(兼容同步文件夹场景)
如果需要保留OneDrive同步,可将ThisWorkbook.Path返回的在线URL转换为本地磁盘路径。以下是通用转换方法:
Sub WorksheetImport_OneDriveCompatible() Dim vWBFolder As String Dim vWBName As String Dim wsShell As Object Dim oneDriveLocalPath As String ' 获取OneDrive本地同步路径(读取注册表) Set wsShell = CreateObject("WScript.Shell") ' 个人版OneDrive路径,若为企业版可修改注册表路径为HKCU\Software\Microsoft\OneDrive\Accounts\Business1\UserFolder oneDriveLocalPath = wsShell.RegRead("HKCU\Software\Microsoft\OneDrive\Accounts\Personal\UserFolder") vWBFolder = ThisWorkbook.Path ' 检测并转换OneDrive在线路径 If InStr(vWBFolder, "https://d.docs.live.net") > 0 Then ' 提取在线路径中的相对文件夹部分,替换为本地路径 Dim relativePath As String relativePath = Mid(vWBFolder, InStrRev(vWBFolder, "/") + 1) vWBFolder = oneDriveLocalPath & "\" & relativePath End If ' 补充路径分隔符 If Right(vWBFolder, 1) <> "\" Then vWBFolder = vWBFolder & "\" End If vWBName = Dir(vWBFolder & "*.csv") MsgBox vWBName End Sub
补充说明
- 若组织允许,将目标文件夹从OneDrive备份中排除是最直接的解决方案,无需修改代码即可恢复正常。
- 代码中
Dir(vWBFolder & "*.csv")仅返回第一个匹配的文件名,若需遍历所有csv文件,可循环调用Dir()直到返回空字符串。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

