Excel VBA执行End With语句后单元格值消失问题技术咨询
问题根因定位
- 全列覆盖赋值冲突:嵌套循环中每次匹配到符合条件的M-CUST行时,都会对X、Y列所有数据行整体重新赋值,后序循环会直接覆盖前面所有行写入的结果,最终仅最后一次循环匹配的行能保留值,其余行内容都会被清空。
- LastRow取值错误:你使用可见单元格计数的方式获取LastRow,这个值不等于实际数据的最大行号,赋值范围仅能覆盖前N行,超出范围的行不会写入任何值。
- 隐式工作表引用:With块绑定Processed工作表,但代码中大量
Range/Cells/Columns未加.前缀,默认引用活动工作表,一旦运行过程中工作表被切换,就会出现取值/赋值错位,导致目标单元格值为空。 - 筛选状态遍历错位:循环过程中频繁切换筛选条件,可见行遍历范围未做显式绑定,极易出现遍历对象错位、取值错误的问题。
修复方案
- 取消循环内的全列赋值逻辑,每次仅给当前匹配行的对应单元格赋值:
' 替换原有全列赋值代码 .Range("X" & i.Row).FormulaR1C1 = sFmlHours .Range("X" & i.Row).Value = .Range("X" & i.Row).Value ' Y列同理修改
- 修正LastRow取值逻辑,直接获取A列最后一行行号:
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
- 给With块内所有工作表对象引用前加
.前缀,明确绑定Processed工作表,避免隐式引用错误。 - 建议先取消全局筛选,遍历所有行完成计算后再按需开启筛选,避免频繁切换筛选导致的逻辑异常。
内容的提问来源于stack exchange,提问作者Major Aly
相关产品推荐
相关产品推荐

