将数组传递给UDF; UBound函数

在第一个VBA项目的第一行中,我似乎已经做错了,这真是令人沮丧。 从本质上说,我的项目已经停滞了,因为我无法弄清楚为什么会这样工作:

Function TestF(Values As Variant, Dates As Variant) TestF = Values(2) End Function 

但是这样做:

 Function TestF(Values As Variant, Dates As Variant) TestF = UBound(Values) End Function 

(我只是想看看UBound工作的,所以我把与项目无关的所有东西都删除了。)

ValuesDates都应该是一维数组。 (或范围?或者是这个问题?)

如何修复第一个代码?

我谷歌search和谷歌search,但我还没有find我的答案。

(Excel)的“错误”就是#VALUE! from =testf(A2:A10,B2:B10) ,其中的范围如下所示:

-1000 31-Dec-13 -10 31-Dec-14 30 13-Mar-15 1200 17-Mar-15 -40 30-Jun-15 1300 30-Sep-16 1200 31-Oct-17 1250 30-Nov-18 1500 31-Dec-18

你传递数组到UDF的问题是你对数组和范围的理解。 一般来说,范围是以二维数组表示的,即使它们是单列或单列的。

为了使你的代码工作,请尝试下面的“Double Transpose Trick”:

 Public Sub TestMe() Dim k As Variant k = Range("A2:F2") Debug.Print k(1) With WorksheetFunction k = .Transpose(.Transpose(k)) Debug.Print k(1) End With End Sub 

上面的代码将有希望导致Debug.Print k(1)部分中的错误。 这是因为k是一个二维数组,尽pipe它只在一行上:

在这里输入图像描述

注释此部分或将其更改为Debug.Print k(1, 1)并继续.Transpose它会将您的数组更改为单个维度,它将工作。

因此,如果你想让你的非工作公式起作用,这是一个可行的方法:

 Public Function TestFormula(myValues As Variant) As String Dim myArr As Variant With WorksheetFunction myArr = .Transpose(.Transpose(myValues)) TestFormula = myArr(UBound(myArr)) End With End Function 

一些重要的注意事项: “双转置技巧”在一行范围内工作,当这些应该被转移到arrays。 如果你有一个列的范围,使用“单一转置”:

 myArr = .Transpose(myValues) 

多于1列或1行,不要使用转置,因为它不能映射到1维数组。

而且,如果你传递一个单元格的范围,它将不起作用。 但是你会find一些方法去解决它。

正如@cyboashu在注释中所提到的那样, myArr()数组的值最多会达到65536列,因为Transpose()是这样做的,可能是出于兼容性的原因与Excel 2003.要创build一个更大的数组 – 数组中的每个值)?

您需要将正确的parameter passing给您的UDF

这两个参数都是Range

 Function TestF(Rng1 As Range, DatesRng As Range) As Long Dim C As Range Dim x As Long For Each C In Rng1 If Trim(C.Value) <> "" Then ' make sure there isn't a blank cell in the middle of your Range x = x + 1 End If Next C TestF = x - 1 End Function 

如果你的Range中间没有空单元格,那么下面的代码就足够了:

 Function TestF(Rng1 As Range, DatesRng As Range) As Long Dim C As Range TestF = Rng1.Cells.Count - 1 End Function 

你可能想要:

 TestF=Values(Ubound(Values)) 

另外,你应该声明你的函数应该返回,就像

 Function TestF(Values As Variant, Dates As Variant) as String