(我是VBA新手,所以可能很基础)
我想做一个函数MonstersInLevel(),根据第一列的值来过滤我的 "LevelMonsters "命名范围的第二列。这个范围的第一列代表一个游戏关卡ID,第二列代表一个出现在该关卡中的怪物ID。下面是我的范围的样子。 所以,如果我调用MonstersInLevel(2),我希望函数返回一个由 "2"、"3 "和 "4 "组成的范围。
这就是代码。
Function MonstersInLevel(level As Integer) As Range
MonstersInLevel = Application.WorksheetFunction.Filter(Range("LevelMonsters").Columns(2), Range("LevelMonsters").Columns(1) = level)
End Function
然而,我得到以下错误信息:
公式中使用的一个值是错误的数据类型。
我正在使用FILTER函数,就像我使用Excel公式一样。我假设FILTER的标准在Excel和VBA语法上有一些不同,但我不确定。
我无法解决你的问题 但由于我在这个问题上做了一些测试尝试,所以我想把我的发现分享给大家。
基于 这个微软社区帖子,或至少是 答案 在那里,似乎你需要以某种方式循环输出......。
这个问题似乎想实现和你想做的一样(我想?
另一方面,我从来没有使用过这个问题。WorksheetFunction.Filter
方法,而我能让它工作的最接近的是这样。
这是我的样本数据 RangeOne
是 A栏 和 RangeTwo
是 B栏. 我已经使用了 =FILTER()
细胞功能 C1 评估输入 D1 以供参考预期结果。自然而然,这个函数就按照预期工作了。VBA例程输出到列E,F和G。
Sub TestFilterFunction()
Dim TestArray As Variant
Range("E1:E3") = Application.Filter(Range("RangeTwo"), Range("RangeOne"), Range("D1"))
Range("F1:F3") = Application.Filter(Range("RangeTwo"), Range("RangeOne") = Range("D1")) 'Runtime Error 13
Range("G1:G3") = Application.Filter(Range("RangeTwo"), Range("RangeOne"))
TestArray = Application.Filter(Range("RangeTwo"), Range("RangeOne"), Range("D1"))
TestArray = Application.Filter(Range("RangeTwo"), Range("RangeOne") = Range("D1")) 'Runtime Error 13
TestArray = Application.Filter(Range("RangeTwo"), Range("RangeOne"))
Range("H1:H3") = Application.Filter(Range("RangeTwo", "RangeOne"), Range("RangeOne"), Range("D1"))
TestArray = Application.Filter(Range("A1:B9"), Range("RangeOne"), "2")
End Sub
E列返回了来自 RangeTwo
.F列没有被填入--这是因为该行抛出了一个名为 "F "的字符串。Runtime error 13 - Type Mismatch
G列返回了来自 RangeTwo
.H列返回了 "A1:B9 "的前3个值(两个范围一起)--特别是A列的前3个值。
我觉得这很奇怪,所以我扔了一个数组来分配这些值,而不是直接分配到工作表。
第一个 TestArray
线和第三条 TestArray
行都将整个数组中的 RangeTwo
值。
我意识到,在第一次和第三次尝试的语法中。WorksheetFunction.Filter
返回整个范围(即第一个参数-------------------------------------------------------------)。Arg1 - 范围),但当试图将 = Range("D1")
,它返回的是 Type Mismatch
错误。
最后的 TestArray
尝试与Column H测试的语法相同,以一个2D数组的形式返回两列(现在是 TestArray(1 To 9, 1 To 2)
).
我应该注意的是,我找不到任何有关的文件。WorksheetFunction.Filter
所以我假设它确实遵循了和Excel Sheet函数一样的语法。
如果我在这个话题上找到更多的东西,我会回来编辑进去,但现在看来,也许使用循环或IndexMatch函数的解决方案也需要发生在VBA中的数据返回。
我想过也许把工作表的公式写到一个单元格里,然后抓取到一个数组之类的地方,但是Excel插入了 @
现在,它只返回单个单元格的结果,也就是说。
Range("J1").Formula = "=FILTER(B1:B9, A1:A9 = D1)"
将返回 J1
:
=@FILTER(B1:B9, A1:A9 = D1)
根据我们的样本数据,只会返回 2
在 J1
相对于预期的 2
, 3
和 4
在 J1:J3
.
我不知道如何去除 @
因为当函数写入单元格时,不幸的是,它被应用了,但希望以上任何一个能帮助别人找到解决方案。