【问题标题】:Is there a programmatic interface to Excel's Array Formulae?Excel 数组公式是否有编程接口?
【发布时间】:2011-12-07 10:55:05
【问题描述】:

例如,假设我有

{={1,2,3,4,5}}

在一个单元格中。有什么方法可以找出该数组中有多少元素,以及这些元素是什么?

现在实现@chris neilsen 的想法,我现在有了如下的 VBA 函数

Function rinfo(r As Range) As String
    With r.CurrentArray
        rinfo = .Address & ", " & .Rows.Count & ", " & .Columns.Count & ", " & .Value & ", " & .Value2
    End With
End Function

但是其中的数据看起来并不乐观,即

$A$29, 1, 1, 1, 1

如果 Rows.Count 和 Columns.Count 计算工作表中使用的行数和列数,则它们是有意义的。但作为数组公式中数据的指示,没有。

【问题讨论】:

  • 从哪里来? VBA,还是其他公式?
  • @chris neilsen 的解决方案运行良好。对于您的 {={1,2,3,4,5}} 示例,如果您确实有一个 1x5 数组,那么 .Value.Value2 方法应该引发类型不匹配错误,因为它们不适用于数组......但它们没有,这让我觉得你的数组在你的工作表上的大小是 1x1。
  • @Jean 当出于某种原因从 udf 调用时,.CurrentArray 不会返回整个范围,而只是返回第一个单元格,因此示例中没有错误。这就是为什么我说“在一个潜艇”。更奇怪的是,如果从 Sub 调用函数,它确实返回一个数组并且示例错误。

标签: excel vba array-formulas


【解决方案1】:

您的公式只占用一个单元格,一个单元格只能包含一个标量值,因此在计算单元格后它将包含 1。
但是您可以从 VBA 评估公式,这可以给您一个数组结果。如果您的公式在 A1 中,那么

Dim vArr As Variant
vArr = Evaluate(Range("a1").Formula)

将导致 vArr 包含 4 个数字的 4 个变体组成的数组。
Evaluate 方法有几个“怪癖”:有关详细信息,请参阅 one of my web pages

【讨论】:

  • 啊哈,现在我明白了这个问题。 +1
【解决方案2】:

Sub 中,如果clRange 并设置为属于数组公式一部分的单元格,则

cl.CurrentArray

返回包含数组公式的范围。

如果您的示例公式在单元格 A1:E1 中,并且活动单元格是单元格 A1 .. E1 中的任何一个,则运行

Sub zx()
    MsgBox "ref = " & ActiveCell.CurrentArray.Address
End Sub

会返回ref = $A$1:$E$1的消息

您可以使用.Rows.Count.Columns.Count 获取大小,使用.Value 获取值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多