2013-03-24 99 views
0

我想在VBA-Excel 2010中创建自己的函数来计算作为函数arg传递的数组中的某些内容。还有2个条件也通过。问题是我无法让Ubound()函数工作。VBA Ubound()不起作用?

下面的代码:

Function IleGier(Arr As Variant, Champ As String, Data As Date) As Variant 'Integer 
    '    arr/\   cond1/\  cond2/\ 
    Dim i As Integer 
    Dim ile As Integer 

    ile = -1 
    i = 1 

    Do While i < UBound(Arr, 1) 
     If Arr(1)(i) = Data Then 
      If Arr(2)(i) = Champ Then 
       ile = ile + 1 
      End If 
     End If 
     i = i + 1 
    Loop 

    IleGier = ile 
    'IleGier = Arr(2)(1) 
End Function 

阵列将永远是2维的。

ex。数组:

15-3-2013 Arg1 
15-3-2013 Arg2 
15-3-2013 Arg1 
15-3-2013 Arg1 
16-3-2013 Arg3 
16-3-2013 Arg3 
16-3-2013 Arg1 

=IleGier(E1:F10;"Arg1";"15-3-2013")期望回报将是3(日期ARG在这前可能被传递错误bcoz的“”),但它返回#ARG只要我使用UBound()功能。

任何提示?

+0

FWIW,这可以很容易地做到没有udf:'= COUNTIFS(F1:F10,“Arg 1“,E1:E10,”15-3-2013“)' – 2013-03-24 21:29:56

回答

2

i是第二个指标,我想你应该使用:

Do While i < UBound(Arr, 2) 
+0

那么它不会改变任何东西,有趣的是,即使 '函数tst(Arr As Variant)As Integer tst = UBound(Arr,2) End Function' return #ARG – user1709804 2013-03-24 13:01:02

+0

@ user1709804这是因为当你调用'tst(E1:F10)'时,Arr不是数组,它是一个范围。如果你尝试:Function tst(Arr As Variant)As Integer Dim a As Variant a = Arr tst = UBound(a,2)End Function'你应该得到预期的结果。 – assylias 2013-03-24 13:06:01

+0

换句话说,你有两种选择:直接使用范围,它有一些方法来知道它的大小,或者像我以前的评论那样将范围复制到一个数组中。后者通常更高效。 – assylias 2013-03-24 13:06:51

0

如果在Excel中的数据是这样的:

enter image description here

...那么代码看起来是这样的:

Public Function IleGier(Arr As Range, Champ As String, Data As Date) As Variant 

    On Error GoTo IleGier_Error 

    Dim arrValue As Variant 
    Dim i As Integer 
    Dim ile As Integer 

    ile = 0 
    i = 1 
    arrValue = Arr.Value 

    Do While i < UBound(arrValue, 1) 
     If arrValue(i, 1) = Data Then 
      If arrValue(i, 2) = Champ Then 
       ile = ile + 1 
      End If 
     End If 
     i = i + 1 
    Loop 

    IleGier = ile 

    Exit Function 

IleGier_Error: 
    MsgBox Err.Description 
End Function