Excel ADDRESS函数参数含义及相关公式转VBA咨询
问题解答
1. ADDRESS函数第二个参数的含义
你混淆了ADDRESS的必选参数和可选参数:ADDRESS的前两个参数均为必选参数,分别对应行号、列号,从第三个参数开始才是你提到的取值为1-4的可选引用类型参数。
你给出的公式里的用法含义如下:
ADDRESS(Y44,1):取Y44单元格存储的数字作为行号,第1列(即A列),返回对应单元格的地址字符串,比如Y44值为10时,返回结果就是$A$10ADDRESS(Y44,6):同理,取Y44存储的数字作为行号,第6列(即F列),返回对应单元格的地址
后续搭配的INDIRECT函数作用是把地址字符串转为实际的单元格引用,读取对应单元格存储的数值。
2. 原公式逻辑梳理
整个公式的计算逻辑非常清晰:
- 若Z44单元格的值为
N/R,直接返回N/R - 否则计算两段时间差的总秒数:
- 第一部分是Y44指定行的A列时间 减去 Z44指定行的A列时间,乘以86400转为秒(Excel日期时间默认以天为单位,1天=86400秒)
- 第二部分是Y44指定行的F列时间 减去 Z44指定行的F列时间,乘以86400转为秒
- 两部分相加得到总秒数返回
3. 对应VBA实现代码
VBA中无需嵌套ADDRESS和INDIRECT逻辑,直接用Cells(行号,列号)即可读取目标单元格值,代码更简洁高效:
Function CalcSysTimeDiff() As Variant Dim targetWs As Worksheet ' 如需指定工作表,可修改为Set targetWs = ThisWorkbook.Worksheets("你的工作表名") Set targetWs = ThisWorkbook.ActiveSheet If targetWs.Range("Z44").Value <> "N/R" Then Dim rowY As Long, rowZ As Long rowY = targetWs.Range("Y44").Value rowZ = targetWs.Range("Z44").Value Dim totalDiff As Double totalDiff = (targetWs.Cells(rowY, 1).Value - targetWs.Cells(rowZ, 1).Value) * 86400 + _ (targetWs.Cells(rowY, 6).Value - targetWs.Cells(rowZ, 6).Value) * 86400 CalcSysTimeDiff = totalDiff Else CalcSysTimeDiff = "N/R" End If End Function
如果需要适配不同行的计算,可以把Y44、Z44的单元格位置改为函数入参,做成通用函数调用即可。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

