如何使用 Excel 的数组公式为 UDF 正确读取每个单元格?

Posted

技术标签:

【中文标题】如何使用 Excel 的数组公式为 UDF 正确读取每个单元格?【英文标题】:How to use Excel's array-formulas for a UDF to read each cell correctly? 【发布时间】:2013-02-02 11:30:00 【问题描述】:

节日,

我有一个问题想帮助自己理解 Excel 的数组公式 (Control+Shift+Enter) 如何将每个单元格动态读取到公式中。

我做了一个简化的例子来说明我的意思。

我创建了一个虚构的小型农场,里面有一些动物,按名称列出,并提供动物发出的声音。在下一列中,我创建了一个名为 MakesSound 的用户定义函数,该函数接受它是什么动物的输入并响应它发出的动物的声音。如下图截图所示。

不幸的是,我认为一个数组公式可以识别出我有不同的单元格列出了动物,结果却像这张快照一样结束。

所以我如何让数组公式识别我在 B 列中有不同的单元格,因为我知道 Quacks 不是其他动物的答案。 :-)

这是另一个快照,显示了 arrayformulas 旁边的公式,用于比较和我也使用的代码。

Public Function MakesSound(AnimalName As String) As Variant
    Select Case AnimalName
        Case Is = "Duck"
            MakesSound = "Quack!"
        Case Is = "Cow"
            MakesSound = "Moo!"
        Case Is = "Bird"
            MakesSound = "Tweet!"
        Case Is = "Sheep"
            MakesSound = "Ba-Ba-Ba!"
        Case Is = "Dog"
            MakesSound = "Woof!"
        Case Else
            MakesSound = "Eh?"
    End Select
End Function

我愿意接受建议。

谢谢, 彼得。

【问题讨论】:

为什么不直接使用INDEX/MATCH 甚至VLOOKUP 我现在正在探索数组公式,看看会发生什么效果。谢谢你的建议,brettdj。 【参考方案1】:

你需要让你的数组函数将数据读入一个数组,处理它并创建一个输出数组。 然后需要使用 ctrl-shift-enter 将数组函数输入到多单元格数组公式 (D3:D7) 中。

Public Function MakesSound(AnimalName As Range) As Variant
Dim Ansa() As Variant
Dim vData As Variant
Dim j As Long
vData = AnimalName.Value2
ReDim Ansa(1 To UBound(vData), 1 To 1)
For j = 1 To UBound(vData)
    Select Case vData(j, 1)
    Case Is = "Duck"
        Ansa(j, 1) = "Quack!"
    Case Is = "Cow"
        Ansa(j, 1) = "Moo!"
    Case Is = "Bird"
        Ansa(j, 1) = "Tweet!"
    Case Is = "Sheep"
        Ansa(j, 1) = "Ba-Ba-Ba!"
    Case Is = "Dog"
        Ansa(j, 1) = "Woof!"
    Case Else
        Ansa(j, 1) = "Eh?"
    End Select
Next j
MakesSound = Ansa
End Function

【讨论】:

所以......我从中学到的简单的教训是将范围内的输入转换为任何大小(或类型?)的二维数组,函数或用户定义函数( UDF)可以按照用户的喜好处理数组,一旦完成,“as variant”输出就会相应地从数组转换回范围。我只是喜欢学习Excel! :-)【参考方案2】:

对给定样本使用数组公式的目的对我来说真的很模糊,但无论如何,如果你坚持 - 请尝试以下操作:

    选择区域C3:C7(如在您的最顶部屏幕上)。 按F2进行现场编辑,输入以下公式:=MakesSound(B2:B7)CTRL+SHIFT+ENTER 而不是通常的 ENTER - 这将定义一个 ARRAY 公式并将导致在它周围出现 括号(但不要手动输入它们!)。

我不确定您的 UDF 是否可以正确处理数组表示法,但对于通常的 Excel 公式,这可以按预期工作,例如尝试将 =LEFT(B2:B7,2) 作为第 2 步的数组之一 - 这将返回每个动物名称的 2 个起始字母。

希望这对您有所帮助。祝你好运!

【讨论】:

你说得对,Peter L,它没有正确处理它。它提出了#VALUES!。我希望它能处理这种数组处理。 @user1924393 如果答案在某种程度上有帮助 - 请不要犹豫,为它投票,您有足够的代表获得该特权) @user1924393 我也是)祝你知识进步好运,带着更多令人兴奋的问题回来)

以上是关于如何使用 Excel 的数组公式为 UDF 正确读取每个单元格?的主要内容,如果未能解决你的问题,请参考以下文章

将多维数组传递到 VBA 中的 Excel UDF

Excel 公式不断恢复为原始 UDF 名称

从宏创建的数组公式的 UDF

UDF数组导致#Value [重复]

Excel UDF 公式不出现

listobj刷新后excel udf不更新