如何确定动态数组公式返回结果所需的单元格行数?
解决动态数组公式结果行数的获取问题
错误原因分析
你的两种方法失效,核心是混淆了传统数组公式(需Ctrl+Shift+Enter输入)和Excel 365/2021引入的动态溢出数组公式:
HasArray和CurrentArray仅针对传统数组公式,动态溢出数组的源单元格不会触发HasArray=True,因此调用CurrentArray会报1004错误。- Range对象没有
arrayformula属性,这是触发438错误的直接原因;且动态数组公式的结果无需用Evaluate,直接读取单元格Value即可获取数组。
正确实现方法
针对动态溢出数组,有两种可靠的获取行数的方式:
方法1:直接读取溢出后的区域(推荐)
利用Excel提供的HasSpill和SpillingToRange属性,直接获取溢出后的完整区域:
Sub GetDynamicArrayRowCount() Dim sourceCell As Range Set sourceCell = ThisWorkbook.Sheets("Sheet1").Range("A1") ' 替换为你的目标单元格 ' 检查是否为动态溢出数组的源单元格 If sourceCell.HasSpill Then Debug.Print "动态数组结果行数:" & sourceCell.SpillingToRange.Rows.Count Else ' 处理未溢出的情况(如公式错误、未计算) Debug.Print "当前单元格无溢出数组" End If End Sub
方法2:读取公式返回的数组
如果公式已计算,直接读取单元格Value会返回动态数组的结果,再通过数组边界计算行数:
Sub GetArrayRowCountFromValue() Dim sourceCell As Range Dim resultArr As Variant Set sourceCell = ThisWorkbook.Sheets("Sheet1").Range("A1") resultArr = sourceCell.Value ' 判断返回值是否为数组 If IsArray(resultArr) Then ' 计算数组行数(兼容LBound不为1的情况) Debug.Print "数组行数:" & UBound(resultArr, 1) - LBound(resultArr, 1) + 1 Else Debug.Print "未返回数组结果" End If End Sub
补充说明
- 如果公式未自动计算,可在读取前添加
sourceCell.Worksheet.Calculate强制触发计算。 - 动态数组公式的源单元格,
Formula2属性会返回完整的公式文本(Formula也兼容,但Formula2是专门针对动态数组的属性)。
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

