将数组传递给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
工作的,所以我把与项目无关的所有东西都删除了。)
凡Values
和Dates
都应该是一维数组。 (或范围?或者是这个问题?)
如何修复第一个代码?
我谷歌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