VBA复制可变范围数据时出现1004对象定义错误求助
解决VBA复制可变行数数据时的1004错误
咱们先拆解你代码里的问题,这两个核心问题直接触发了1004对象定义错误:
1. 可变行数计算的潜在漏洞
你用Range("B18").End(xlDown)统计行数时,如果B18下方没有数据,这个方法会直接跳到工作表最后一行,导致LocCount数值异常;如果只有B18一行数据,虽然计算是对的,但空数据场景会直接炸锅。
更稳妥的写法是从下往上找最后一行数据:
With WsInput Dim lastRow As Long lastRow = .Range("B" & .Rows.Count).End(xlUp).Row ' 确保至少保留B18这一行(即使下方无数据) LocCount = WorksheetFunction.Max(lastRow - 17, 1) ' 额外加个判断:如果B18本身是空的,直接提示用户 If lastRow < 18 Then MsgBox "输入表B18没有数据,请检查!", vbExclamation Exit Sub End If End With
2. 复制数据时的对象引用错误
你在With WsLoc块里写的复制代码有两个致命问题:
.Cells属于当前With块的WsLoc,但你要引用的是WsInput的单元格,跨表引用混乱直接触发对象定义错误;- 第二个
.Cells后面多了.Value,Range的参数必须是单元格对象,不能带Value属性。
修正后的复制代码:
With WsLoc ' 先清空目标区域旧数据(可选,根据你的需求) .Range("D:F").ClearContents ' 精准复制对应行数的B-D列到目标表的D-F列 .Range(.Cells(1, "D"), .Cells(LocCount, "F")).Value = _ WsInput.Range(WsInput.Cells(18, "B"), WsInput.Cells(17 + LocCount, "D")).Value End With
完整修正后的代码示例
Sub CopyLocationData() Dim WsInput As Worksheet, WsLoc As Worksheet Dim LocCount As Long, lastRow As Long ' 替换成你的实际工作表名称 Set WsInput = ThisWorkbook.Worksheets("输入表") Set WsLoc = ThisWorkbook.Worksheets("目标表") With WsInput lastRow = .Range("B" & .Rows.Count).End(xlUp).Row LocCount = WorksheetFunction.Max(lastRow - 17, 1) If lastRow < 18 Then MsgBox "输入表B18没有数据,请检查!", vbExclamation Exit Sub End If End With With WsLoc .Range("D:F").ClearContents .Range(.Cells(1, "D"), .Cells(LocCount, "F")).Value = _ WsInput.Range(WsInput.Cells(18, "B"), WsInput.Cells(17 + LocCount, "D")).Value End With End Sub
额外小贴士
- 永远明确单元格所属的工作表,不要在With块里混用其他工作表的Cells,很容易踩坑;
- 处理可变行数时,优先用
End(xlUp)从下往上找最后一行,比从上往下找更可靠; - 加个数据有效性判断,能让代码更健壮,减少用户操作出错的概率。
内容的提问来源于stack exchange,提问作者Carlos80
相关产品推荐
相关产品推荐

