Excel VBA:如何从单元格地址获取动态数组公式的完整范围
通过单元格获取动态数组(CSE/溢出数组)的完整范围
针对你提出的需求,分两种常见的动态数组类型给出解决方案:
一、传统CSE数组(Ctrl+Shift+Enter输入的数组公式)
VBA里可以直接用Range.CurrentArray属性获取该单元格所属的整个CSE数组范围,不过要先判断单元格是否属于数组公式,避免报错。
示例代码
Sub GetCSEArrayFullRange() Dim targetCell As Range Dim arrayRange As Range ' 替换为你要查询的单元格地址 Set targetCell = ThisWorkbook.ActiveSheet.Range("C3") ' 错误处理:如果单元格不在CSE数组中,CurrentArray会触发错误 On Error Resume Next Set arrayRange = targetCell.CurrentArray On Error GoTo 0 If Not arrayRange Is Nothing Then Debug.Print "CSE数组完整范围:" & arrayRange.Address ' 可选:选中该范围直观查看 arrayRange.Select Else Debug.Print "该单元格不属于CSE数组公式范围" End If End Sub
二、Excel 365/2021溢出数组
这类数组是公式输入后自动溢出扩展的,需要先通过SpillParent找到数组的源单元格(即输入公式的那个单元格),再用SpillingToRange获取整个溢出范围。
示例代码
Sub GetSpilledArrayFullRange() Dim targetCell As Range Dim sourceCell As Range Dim arrayRange As Range ' 替换为你要查询的单元格地址 Set targetCell = ThisWorkbook.ActiveSheet.Range("E5") ' 获取溢出数组的源单元格 On Error Resume Next Set sourceCell = targetCell.SpillParent On Error GoTo 0 If Not sourceCell Is Nothing Then ' 获取整个溢出数组范围 Set arrayRange = sourceCell.SpillingToRange Debug.Print "溢出数组完整范围:" & arrayRange.Address arrayRange.Select Else Debug.Print "该单元格不属于溢出数组范围" End If End Sub
通用判断方法(兼容两种数组类型)
如果不确定单元格属于哪种数组,可以先检查溢出数组,再检查CSE数组:
Sub GetDynamicArrayRange() Dim targetCell As Range Dim fullArrayRange As Range ' 让用户选择目标单元格 Set targetCell = Application.InputBox("请选择一个单元格:", Type:=8) ' 优先检查溢出数组 On Error Resume Next Set fullArrayRange = targetCell.SpillParent.SpillingToRange On Error GoTo 0 ' 溢出数组不存在则检查CSE数组 If fullArrayRange Is Nothing Then On Error Resume Next Set fullArrayRange = targetCell.CurrentArray On Error GoTo 0 End If If Not fullArrayRange Is Nothing Then MsgBox "数组完整范围:" & fullArrayRange.Address fullArrayRange.Select Else MsgBox "该单元格不属于任何动态数组范围" End If End Sub
内容的提问来源于stack exchange,提问作者en0386
相关产品推荐
相关产品推荐

