Excel VBA代码报错排查:跨工作表数据移动功能实现遇问题
代码中
Set Sel = Union(...)报错的原因及修复方案 核心报错原因
跨工作表使用
Union方法
代码里Sel是打算绑定到Sheet2的Range(虽然ws没初始化),但Selection是当前激活工作表(大概率是Sheet1)的选中区域,Union要求所有合并的区域必须在同一个工作表,跨表执行直接触发错误。变量
ws未初始化
声明了Dim ws As Sheet2但没写Set ws = ThisWorkbook.Worksheets("Sheet2"),导致ws是无效对象,后续Set Sel = ws.Range(...)会让Sel指向Nothing,Union无法和Nothing合并区域。未限定工作表的
RangeIntersect(Rng.EntireRow, Range("A:C"))里的Range("A:C")没指定工作表,默认用当前激活的Sheet1,和Sheet2的Sel不属于同一表,进一步触发跨表冲突。未定义的
NumRows变量
代码里用了NumRows但既没声明也没赋值,运行到移动数据的代码段时会报错——这也是删除这段代码后能运行的原因,避开了这个未定义变量的坑。
针对你的需求的修正代码
1. Sheet2中B2:H数据整体下移1行
Sub ShiftSheet2DataDown() Dim ws2 As Worksheet Dim lastRow As Long, dataRange As Range Set ws2 = ThisWorkbook.Worksheets("Sheet2") ' 找到B列最后一行有数据的行号 lastRow = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row If lastRow < 2 Then Exit Sub ' 没有数据直接退出 Set dataRange = ws2.Range("B2:H" & lastRow) ' 插入一行实现下移,把原数据复制到新行后清除原行 dataRange.Offset(1).Insert Shift:=xlDown dataRange.Copy dataRange.Offset(1) dataRange.ClearContents End Sub
2. Sheet1点击单元格时自动剪切该行B:H到Sheet2
打开Sheet1的代码模块(右键Sheet1标签→查看代码),粘贴以下事件代码:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' 只处理单个单元格点击 If Target.Cells.Count > 1 Then Exit Sub Dim ws2 As Worksheet Dim copyRange As Range Dim lastRow2 As Long Set ws2 = ThisWorkbook.Worksheets("Sheet2") Set copyRange = Me.Range("B" & Target.Row & ":H" & Target.Row) ' 空行不处理 If Application.WorksheetFunction.CountA(copyRange) = 0 Then Exit Sub ' 找到Sheet2中B列最后一行 lastRow2 = ws2.Cells(ws2.Rows.Count, "B").End(xlUp).Row lastRow2 = IIf(lastRow2 < 2, 1, lastRow2) ' 无数据时从第2行开始 ' 剪切粘贴到Sheet2的下一行 copyRange.Cut ws2.Range("B" & lastRow2 + 1) End Sub
3. Sheet2删除行后自动上移
Excel手动删除行时默认会自动上移填补空白;如果用代码删除,直接用以下写法即可:
' 示例:删除Sheet2的第5行 ThisWorkbook.Worksheets("Sheet2").Rows(5).Delete Shift:=xlUp
内容的提问来源于stack exchange,提问作者user23572503
相关产品推荐
相关产品推荐

