VBA工作表变量报错求助:对象变量未设置,代码无法运行
VBA脚本修复方案
错误原因分析
报错“object variable or With block not set”主要由两种情况导致:
- 目标工作表(do5/do6/do7)不存在,使得
wsX变量未被正确赋值 - 目标工作表为空时,
Cells(1,1).CurrentRegion无法返回有效区域,导致tabla变量初始化失败
修复后的完整代码
Sub copythis() Dim wsX As Worksheet Dim fromWs As Worksheet Dim lastRow As Long ' 绑定源工作表,减少重复调用 Set fromWs = Worksheets("fromhere") Select Case fromWs.Cells(2, 5).Value Case 5 Set wsX = GetWorksheet("do5") Case 6 Set wsX = GetWorksheet("do6") Case 7 Set wsX = GetWorksheet("do7") Case Else MsgBox "选择错误" Exit Sub End Select ' 检查目标工作表是否存在 If wsX Is Nothing Then MsgBox "目标工作表不存在,请确认do5/do6/do7是否存在" Exit Sub End If ' 安全获取目标表最后一行,兼容空表 lastRow = wsX.Cells(wsX.Rows.Count, 1).End(xlUp).Row ' 空表时调整lastRow为0,让数据从第1行开始 If lastRow = 1 And wsX.Cells(1, 1).Value = "" Then lastRow = 0 ' 复制指定单元格内容到目标表 For i = 2 To 5 fromWs.Range("N" & i).Copy wsX.Cells(lastRow + 1, i - 1) Next End Sub ' 辅助函数:安全获取工作表,不存在则返回Nothing Function GetWorksheet(sheetName As String) As Worksheet On Error Resume Next Set GetWorksheet = ThisWorkbook.Worksheets(sheetName) On Error GoTo 0 End Function
关键修复点
- 新增
GetWorksheet辅助函数,避免因目标工作表不存在导致wsX未赋值 - 替换
CurrentRegion为更可靠的最后一行获取方式,兼容空表场景 - 增加
wsX有效性检查,提前弹出错误提示 - 绑定源工作表到变量,提升代码运行效率和可读性
- 修正
Msgbox的拼写规范(VBA标准写法为MsgBox)
内容的提问来源于stack exchange,提问作者A Pofta Tapofta
相关产品推荐
相关产品推荐

