Excel VBA如何不写入工作表输出计算值,且可被SUMIF函数调用
实现方案
核心思路是将原有写入单元格的子过程(Sub)改造为返回数组的自定义函数(Function),返回的结果既可以直接在VBA代码中调用,也可以作为参数传入工作表函数使用。
改造后的代码如下:
Function UnitNetCheck() As Variant Dim UnitValue As Integer Dim NetArea As Long ' 定义和原行范围匹配的结果数组,单列结构兼容工作表函数调用要求 Dim resultArr(1 To 249, 1 To 1) As Variant If Not Evaluate("COUNTA(F2:F250)=0") Then For UnitValue = 2 To 250 resultArr(UnitValue - 1, 1) = Cells(UnitValue, 4) * Cells(UnitValue, 6) ' 0值替换为空,和原逻辑保持一致 If resultArr(UnitValue - 1, 1) = 0 Then resultArr(UnitValue - 1, 1) = "" End If Next Else NetArea = Worksheets("Sheet1").Cells(Rows.Count, 7).End(xlUp).Row Dim gColArr As Variant gColArr = Worksheets("Sheet1").Range("G2:G250").Value ' 填充G列内容,超出有效行的位置留空 For UnitValue = 2 To 250 If UnitValue <= NetArea Then resultArr(UnitValue - 1, 1) = gColArr(UnitValue - 1, 1) Else resultArr(UnitValue - 1, 1) = "" End If Next End If UnitNetCheck = resultArr End Function
VBA内部调用方法
其他VBA过程可以直接调用该函数获取计算结果数组,无需依赖工作表单元格存储中间值:
Sub TestCallFunction() Dim calculateResult As Variant ' 直接获取计算结果 calculateResult = UnitNetCheck ' 示例:遍历数组处理 Dim i As Long For i = LBound(calculateResult, 1) To UBound(calculateResult, 1) Debug.Print "第" & i + 1 & "行结果:" & calculateResult(i, 1) Next End Sub
工作表SUMIF调用方法
函数返回的是垂直结构数组,可以直接作为SUMIF的参数使用,示例公式如下:=SUMIF(UnitNetCheck(),">=500")
Excel 365之前的版本使用该公式需要按Ctrl+Shift+Enter三键触发数组计算
内容的提问来源于stack exchange,提问作者Drawleeh
相关产品推荐
相关产品推荐

