如何高效编写VBA宏批量更新每行的单元格数值
优化VBA宏实现批量行更新
基础循环版本(易理解,适配常规场景)
直接定位G列最后一行数据,循环处理每一行,避免硬编码行号,同时去掉低效的Select操作:
Sub UpdateQty() Dim lastRow As Long Dim i As Long ' 获取G列从第3行开始的最后一行数据行号 lastRow = Cells(Rows.Count, "G").End(xlUp).Row ' 若G列第3行及以下无数据,直接退出宏 If lastRow < 3 Then Exit Sub ' 从第3行循环到最后一行 For i = 3 To lastRow ' 累加G列数值到H列,自动处理G列空单元格(避免出错) Cells(i, "H").Value = Cells(i, "H").Value + IIf(IsEmpty(Cells(i, "G")), 0, Cells(i, "G").Value) ' 清空当前行G列内容 Cells(i, "G").ClearContents Next i ' 可选:定位回G3,方便后续输入 Range("G3").Select End Sub
数组优化版本(大数据量推荐,效率更高)
当G/H列数据行数较多时,用数组批量读写内存数据,减少和工作表的交互次数,大幅提升运行速度:
Sub UpdateQty_Array() Dim lastRow As Long Dim gData As Variant, hData As Variant Dim i As Long lastRow = Cells(Rows.Count, "G").End(xlUp).Row If lastRow < 3 Then Exit Sub ' 将G、H列数据一次性读入内存数组 gData = Range("G3:G" & lastRow).Value hData = Range("H3:H" & lastRow).Value ' 内存中循环处理数据 For i = LBound(gData) To UBound(gData) hData(i, 1) = hData(i, 1) + IIf(IsEmpty(gData(i, 1)), 0, gData(i, 1)) gData(i, 1) = "" Next i ' 将处理后的数组写回工作表 Range("G3:G" & lastRow).Value = gData Range("H3:H" & lastRow).Value = hData Range("G3").Select End Sub
结构化表格适配版本(若使用Excel表)
如果你的数据是Excel结构化表格(ListObject),用表格对象操作更稳定,无需担心行号变化:
Sub UpdateQty_Table() Dim tbl As ListObject Dim listRow As ListRow ' 替换为你的表格所在工作表名称和表格名称 Set tbl = ThisWorkbook.Worksheets("Sheet1").ListObjects("Table1") For Each listRow In tbl.ListRows ' 替换为表格中G、H列的实际列名(比如"输入数量"、"累计数量"),比列号更直观 listRow.Range("累计数量").Value = listRow.Range("累计数量").Value + IIf(IsEmpty(listRow.Range("输入数量")), 0, listRow.Range("输入数量").Value) listRow.Range("输入数量").ClearContents Next listRow End Sub
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

