VBA宏遇Runtime Error 91问题,需实现指定工作表剪切粘贴功能
修复VBA代码的Runtime Error 91及需求实现
原代码触发Runtime Error 91的核心原因是对象变量wb未被正确赋值,直接调用Workbooks.Open(wb)相当于传递了一个空对象,同时代码还存在工作表校验缺失、操作逻辑不严谨等问题。以下是完全符合需求的修正代码:
Sub ChooseImportSheet() Dim w As String Dim wbSource As Workbook Dim wsDest As Worksheet Dim myFile As Office.FileDialog Dim sourceRange As Range ' 关闭屏幕刷新,提升运行效率 Application.ScreenUpdating = False ' 保存宏初始运行的工作表,确保粘贴目标正确 Set wsDest = ActiveSheet ' 弹出文件选择对话框 Set myFile = Application.FileDialog(msoFileDialogOpen) With myFile .Title = "选择要导入的文件" .AllowMultiSelect = False ' 用户取消选择则退出 If .Show <> -1 Then GoTo Cleanup ' 打开选中的文件并赋值给工作簿对象 Set wbSource = Workbooks.Open(.SelectedItems(1)) End With ' 提示输入工作表名称 w = InputBox("请输入要导入的工作表名称") ' 用户取消输入则退出 If w = "" Then GoTo Cleanup ' 校验工作表是否存在 On Error Resume Next Set sourceRange = wbSource.Sheets(w).Range("A1").CurrentRegion On Error GoTo 0 ' 工作表不存在则提示并退出 If sourceRange Is Nothing Then MsgBox "输入的工作表名称不存在,请重新输入", vbExclamation GoTo Cleanup End If ' 剪切源区域内容到目标工作表的A4开始位置 sourceRange.Cut Destination:=wsDest.Range("A4") Cleanup: ' 可选:关闭源工作簿,取消注释即可 ' If Not wbSource Is Nothing Then wbSource.Close SaveChanges:=False ' 恢复屏幕刷新 Application.ScreenUpdating = True End Sub
关键修改说明
- 解决Error 91问题:通过
Set wbSource = Workbooks.Open(.SelectedItems(1))正确赋值工作簿对象,避免空对象调用 - 自动定位初始工作表:提前用
wsDest保存宏启动时的活动工作表,确保粘贴目标不会出错 - 工作表名称校验:利用
On Error Resume Next捕获不存在的工作表,若sourceRange为空则提示用户 - 简化操作逻辑:用
CurrentRegion代替多次End(xlToRight)/End(xlDown),直接获取A1为起点的连续数据区域 - 避免Select/Activate:直接通过对象引用操作单元格,代码更稳定高效
- 异常处理:添加用户取消文件选择、取消输入框的分支,避免程序崩溃
内容的提问来源于stack exchange,提问作者Nai
相关产品推荐
相关产品推荐

