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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:16:15