VBA中Name As方法移动xlsm工作簿报错75的原因
问题原因
该报错和工作簿是否为启用宏的.xlsm格式无关,错误75是VBA文件操作的路径/文件访问错误,对应代码场景的触发原因如下:
MkDir语句无存在性校验逻辑:如果目标路径fold_path对应的文件夹已经存在,直接执行MkDir会直接抛出错误,不会自动跳过。Name语句的使用不满足前置要求:
源文件被锁定:待移动的工作簿正被Excel打开,Excel会对打开的文件加排他锁,操作系统层面会阻止所有对该文件的移动、重命名、删除操作,这是报错的核心原因。
目标路径必须真实存在:Name语句不会自动创建不存在的父目录,如果跳过创建文件夹的步骤直接执行移动,会因为目标路径不存在触发错误。
目标路径无重名文件:如果fold_path下已经存在matenimiento.xlsm,执行重命名移动时也会触发访问错误。
正确实现方案
根据代码运行位置的不同,选择对应方案:
方案1:代码存储在其他工作簿中(非待移动的xlsm文件)
先关闭待移动的工作簿解除文件锁,再执行路径判断、移动操作,示例代码:
Dim xlsm_wb As Workbook Dim xlsm_path As String Dim xlsm_name As String Dim fold_path As String Dim new_file_path As String Set xlsm_wb = Application.Workbooks("repositorio nóminas.xlsm") xlsm_path = xlsm_wb.Path xlsm_name = xlsm_wb.FullName fold_path = xlsm_path & "\repositorio nóminas" new_file_path = fold_path & "\matenimiento.xlsm" ' 关闭工作簿并保存最新修改,解除文件锁 xlsm_wb.Close SaveChanges:=True ' 判断目标文件夹是否存在,不存在则创建 If Dir(fold_path, vbDirectory) = "" Then MkDir fold_path End If ' 判断目标路径是否存在同名文件,存在则先删除 If Dir(new_file_path) <> "" Then Kill new_file_path End If ' 执行移动重命名操作 Name xlsm_name As new_file_path
方案2:代码存储在待移动的xlsm文件本身
如果VBA代码就写在待移动的工作簿里,关闭工作簿会导致代码终止运行,此时需要用SaveAs直接将文件存到目标路径,再清理原位置的旧文件:
Dim xlsm_wb As Workbook Dim xlsm_path As String Dim xlsm_name As String Dim fold_path As String Dim new_file_path As String Set xlsm_wb = ThisWorkbook ' 指向代码所在的当前工作簿 xlsm_path = xlsm_wb.Path xlsm_name = xlsm_wb.FullName fold_path = xlsm_path & "\repositorio nóminas" new_file_path = fold_path & "\matenimiento.xlsm" ' 判断目标文件夹是否存在,不存在则创建 If Dir(fold_path, vbDirectory) = "" Then MkDir fold_path End If ' 直接另存为到目标路径,指定xlsm格式避免宏丢失 xlsm_wb.SaveAs Filename:=new_file_path, FileFormat:=xlOpenXMLWorkbookMacroEnabled ' 另存完成后删除原位置的旧文件,加容错避免旧文件被暂存锁定导致报错 On Error Resume Next Kill xlsm_name On Error GoTo 0
注意事项
- 涉及带重音符号、非英文的路径,确保VBA编辑器编码与系统编码一致,避免路径识别乱码,常规西语、中文Windows系统下不会触发该类问题。
SaveAs操作必须指定正确的文件格式枚举值,.xlsm对应格式常量为xlOpenXMLWorkbookMacroEnabled(值为52),请勿使用默认格式存储,否则会丢失文件内的宏代码。
内容的提问来源于stack exchange,提问作者user19206253
相关产品推荐
相关产品推荐

