在WorksheetFunction.Filter中数据类型错误。

问题描述 投票:2回答:1

(我是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语法上有一些不同,但我不确定。

excel vba worksheet-function
1个回答
2
投票

我无法解决你的问题 但由于我在这个问题上做了一些测试尝试,所以我想把我的发现分享给大家。

基于 这个微软社区帖子,或至少是 答案 在那里,似乎你需要以某种方式循环输出......。

这个问题似乎想实现和你想做的一样(我想?

另一方面,我从来没有使用过这个问题。WorksheetFunction.Filter 方法,而我能让它工作的最接近的是这样。

这是我的样本数据 RangeOneA栏RangeTwoB栏. 我已经使用了 =FILTER() 细胞功能 C1 评估输入 D1 以供参考预期结果。自然而然,这个函数就按照预期工作了。VBA例程输出到列E,F和G。

Sample worksheet data

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 MismatchG列返回了来自 RangeTwo.H列返回了 "A1:B9 "的前3个值(两个范围一起)--特别是A列的前3个值。

我觉得这很奇怪,所以我扔了一个数组来分配这些值,而不是直接分配到工作表。

第一个 TestArray 线和第三条 TestArray 行都将整个数组中的 RangeTwo 值。

Locals window showing how the test array was populated

我意识到,在第一次和第三次尝试的语法中。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)

根据我们的样本数据,只会返回 2J1 相对于预期的 2, 34J1:J3.

我不知道如何去除 @ 因为当函数写入单元格时,不幸的是,它被应用了,但希望以上任何一个能帮助别人找到解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.