VBA实现可见行逐行计算并写入E列的技术需求问询
解决方案
完整修正后的VBA代码
Sub Calculate_Average_Deposition_Rate() Dim LastRow As Long Dim Dia As Double, WFS As Double ' 改为Double类型,支持小数数值 Dim ws As Worksheet Dim Pi As Double ' 声明圆周率变量 Dim rng3 As Range Dim area As Range Dim row As Range ' 关闭屏幕更新和事件,提升运行效率 With Application .ScreenUpdating = False .EnableEvents = False End With ' 补充结束With语句,原代码遗漏 Set ws = Worksheets("2023") ' 直接绑定工作表,避免依赖Activate操作 ' 用数据列(B列)找最后一行,比E列更准确(E列可能为空) LastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row Pi = 3.14159265358979 ' 定义圆周率 ' 清空E列从第6行开始的计算结果 ws.Range("E6:E" & LastRow).Clear ' 获取筛选后可见的B6:C区域 On Error Resume Next ' 处理无可见行的异常情况 Set rng3 = ws.Range("B6:C" & LastRow).SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not rng3 Is Nothing Then ' 遍历筛选后的每个不连续区域 For Each area In rng3.Areas ' 遍历区域内的每一行 For Each row In area.Rows ' 读取当前行的B列(d)和C列(WFS)值 Dia = row.Cells(1).Value WFS = row.Cells(2).Value ' 执行公式计算,结果写入同行E列 ws.Cells(row.Row, "E").Value = WFS * 60 * (Pi * (Dia * Dia / 4)) * 0.284 Next row Next area End If ' 恢复屏幕更新和事件 With Application .ScreenUpdating = True .EnableEvents = True End With End Sub
关键修改与说明
- 变量类型调整:把
Dia和WFS从Long改为Double,因为直径、流量这类数值大概率带小数,Long只能存整数会丢失精度。 - 工作表引用优化:直接绑定工作表对象,不用
Activate切换界面,代码更稳定高效。 - 最后一行判断:改用B列(原始数据列)定位最后一行,避免E列空值导致的判断错误。
- 异常处理:添加错误捕获逻辑,防止筛选后无可见行时代码报错。
- 可见行遍历逻辑:筛选后的区域可能是多个不连续块,通过嵌套循环遍历每个区域的每一行,确保所有可见行都被处理。
- 公式实现:直接按给定公式计算后赋值到E列,比写入单元格公式的执行效率更高。
内容的提问来源于stack exchange,提问作者SGRacing
相关产品推荐
相关产品推荐

