如何使用 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 正确读取每个单元格?的主要内容,如果未能解决你的问题,请参考以下文章