比较两列单元格值时触发VBA Run-Time error '1004'求助
解决VBA比较两列时的Run-Time error '1004'问题
错误原因分析
- Excel单元格行号从1开始,你的代码里
counter初始值设为0,执行Cells(counter, col1.Column)时会访问不存在的第0行,直接触发1004错误。 - 循环逻辑顺序错误:先读取值再递增
counter,导致第一次读取无效的第0行,最后一次循环还会超出实际数据行范围。 val1和val2声明为Integer类型,若单元格内是文本、小数或超出Integer范围的数值,也会触发错误。
修正后的代码
Sub CompareTwoColumns() Dim col1 As Range, col2 As Range Dim dif As Long, counter As Long, val1 As Variant, val2 As Variant Dim LastR As Long Set col1 = Columns("A") Set col2 = Columns("B") ' 更可靠的获取两列中最后一行数据的方式 LastR = Application.Max(Cells(Rows.Count, col1.Column).End(xlUp).Row, _ Cells(Rows.Count, col2.Column).End(xlUp).Row) counter = 1 ' 从Excel的第1行开始遍历 Do While counter <= LastR val1 = Cells(counter, col1.Column).Value val2 = Cells(counter, col2.Column).Value ' 处理空单元格或非数值的情况,避免报错 If IsNumeric(val1) And IsNumeric(val2) Then dif = Abs(val1 - val2) Cells(counter, "C").Value = dif Else Cells(counter, "C").Value = "非数值/空值" End If counter = counter + 1 Loop End Sub
关键修改说明
- 将
counter初始值改为1,贴合Excel行号的起始规则。 - 循环条件改为
counter <= LastR,确保遍历所有有效数据行。 - 把
val1、val2改为Variant类型,兼容非整数、空单元格;dif用Long避免整数溢出问题。 - 增加
IsNumeric判断,防止非数值单元格引发的错误。 - 替换了获取最后一行的方式,避免
SpecialCells(xlCellTypeLastCell)可能返回错误行的问题。
内容的提问来源于stack exchange,提问作者Paga
相关产品推荐
相关产品推荐

