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

时间:2013-02-02 11:30:00

标签: excel excel-vba array-formulas vba

天儿真好,

我还有一个问题,就是帮助自己了解Excel的数组公式(Control + Shift + Enter)如何将每个单元格动态地读入公式。

我做了一个简化的例子来向你展示我的意思。

我创建了一个小型的虚构农场,里面有一些动物,按名字列出并会提供动物的声音。在下一篇专栏文章中,我创建了一个名为MakesSound的用户定义函数,它接受动物的输入并响应动物的声音。如下面的快照图所示。

enter image description here

不幸的是,我认为arrayformula可以拿起我有不同的单元格列出动物,它的结尾就像这个快照。

enter image description here

所以我怎么能要求arrayformula识别我在B列中有不同的细胞,因为我知道Quacks不是其他动物的答案。 : - )

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

enter image description here

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

我愿意接受建议。

谢谢, 彼得。

2 个答案:

答案 0 :(得分:11)

你需要让你的数组函数将数据读入一个数组,处理它并创建一个输出数组。
然后使用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

答案 1 :(得分:3)

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

  1. 选择区域C3:C7(与最上面的屏幕一样)。
  2. F2 进行现场编辑,然后输入以下公式:=MakesSound(B2:B7)
  3. CTRL + SHIFT + ENTER 而不是通常的 ENTER - 这将定义一个ARRAY公式并将导致围绕它{}括号(但不要手动输入!)。
  4. 我不确定您的UDF是否可以正确处理数组表示法,但对于通常的Excel公式,这可以按预期工作,例如尝试=LEFT(B2:B7,2)作为第2步的数组 - 这将从每个动物名称返回2个起始字母。

    希望这在某种程度上有所帮助。祝你好运!