【问题标题】:How to write VBA user defined function to take array argument from IF with ctrl+shift+enter?如何编写 VBA 用户定义函数以使用 ctrl+shift+enter 从 IF 获取数组参数?
【发布时间】:2016-03-24 17:50:19
【问题描述】:

我创建了一个名为 test

的函数
Function test(a() As Variant)
    Debug.Print "Type: "; TypeName(a)
    Debug.Print "lb: "; LBound(a)
    Debug.Print "ub: "; UBound(a)
    test = a(UBound(a))
End Function

打字没问题

=test({4,5,6,8,9})

在一个单元格中。它返回 9。

让我们在工作表上添加一些数据。

   A  B
1  1  3
2  0  6
3  1  9
4  0  7
5  1  8

我在单元格中使用 ctrl+shift+enter 键入以下公式。

{=test(IF(A1:A5=1,B1:B5))}

我认为一个数组被传递到 test 但它不起作用。它可以像往常一样返回 LBound(a)UBound(a)test = a(UBound(a)) 失败。

有什么问题?如何编写一个写入 VBA 用户定义函数以从 IF 获取数组参数。

【问题讨论】:

  • =test{(IF(A1:A5=1,B1:B5))} 试试这个

标签: arrays vba excel user-defined-functions


【解决方案1】:

这两个示例之间存在根本区别。 =test({4,5,6,8,9}) 传递一维数组,{=test(IF(A1:A5=1,B1:B5))} 传递二维数组。您的代码设置为仅处理一维数组,因此第二个示例失败。

如何解决这个问题将完全取决于您真正希望 UDF 做什么。例如,您可以使用 Transpose 将输入强制转换为一维,但这可能仅限于一般情况。可能最好在参数中进行测试以确定其尺寸并相应地进行处理

【讨论】:

  • 只是一个后续问题,我怎么知道这是一个二维数组?这个数组中使用了什么索引?
  • cpearson.com 上有很多很好的数组函数,包括查找数组的维数。要使其仅适用于二维,请尝试 test = a(UBound(a,1))
猜你喜欢
  • 2020-02-26
  • 2023-03-07
  • 1970-01-01
  • 2022-01-14
  • 2017-11-04
  • 1970-01-01
  • 2018-12-19
  • 2016-03-18
  • 2021-11-29
相关资源
最近更新 更多