2016-12-07 79 views
2

我正在嘗試在Visual Basic for Applications(VBA)中探索我的代碼的UBound應用程序。假設我有一個4乘2的數組...(A1:B4),我想計算行數。我想我的代碼是...VBA UBound函數

Function test(list) As Double 
    test = UBound(list) 
End Function 

我輸入=test(A1:B4)但到目前爲止,我得到「#VALUE!」錯誤。我認爲回報將是4.

我在做什麼錯了?我知道如何使用row命令獲取行數,但我只想完成編碼練習。

回答

1

List是範圍對象不是數組。 Range.Value將返回一個範圍內的值數組,並且Range.Formula將返回範圍內的一組公式數組。

enter image description here

Function test(list As Range) As Double 

    test = UBound(list.Value) 

End Function 
1

,因爲你不Dimlist明確,它是Variant。所以如果你打電話=TEST(A1:B4)它將是Range而不是Array。 A Range沒有UBound,但確實有Rows.Count

所以:

Function test(list As Range) As Double 
test = list.Rows.Count 
End Function 

會工作。

或者,如果你真的需要一個Array,你可以這樣做:

Function test(list As Variant) As Double 
list = list 
test = UBound(list) 
End Function 

list = list執行以下操作:如果listRange -object那麼這將是隱式轉換爲自SetArray不用於設置一個對象。如果list已經是Array,那麼之後它也將是Array

1

UBound函數是給你一個變體數組中的元素,你將它傳遞給一個範圍。你可以試試這個:

Sub mains() 
    Dim myRange As Range, myArray As Variant 
    Set myRange = Range("A1:B4") 
    myArray = myRange.Value 
    Debug.Print test(myArray) 
End Sub 
Function test(list) As Double 

    test = UBound(list) 

End Function 

編輯隨着二維範圍(由KazimierzJawor提到的)默認UBOUND將是垂直的,因爲你想,如果要指定,您可以添加可選的perameter UBound函數(列表1),但與指定此defults〜4作爲你希望的數據

1

看來你有2維陣列,因此,你必須爲提供額外的參數UBound像:

UBound(array, dimension) 

請記住,如果您從Excel範圍獲取數組,而不是基於1的數組。

完整的解決方案可以是這樣的一個:

Function testArrray(List, Dimmension) 

    Dim ListConverted As Variant 
     ListConverted = List 
    testArrray = UBound(ListConverted, Dimmension) 
End Function 

樣品電話:=testArrray(G15:H20,1)產生6其結果是正確的。

0

UBOUND是對數組的作品你傳遞一個範圍

試試這個

dim i(3) 
i(0) = 1 
i(1) =2 
i(2) = 3 

msgbox ubound(i) 
+0

謝謝大家!我很感激 – Soto

2

這是你如何得到一個函數的行數的函數。

Option Explicit 

Function l_number_of_rows(rng_range As Range) As Long 

    l_number_of_rows = rng_range.Rows.Count 

End Function 

如果你想要維度中的一個,這是一個可能的解決方案。

Sub test() 

    Dim MyArray(1 To 2, 0 To 3)  As Long 
    MyArray(1, 0) = 10 
    MyArray(1, 1) = 11 
    MyArray(1, 2) = 12 
    MyArray(1, 3) = 13 
    MyArray(2, 0) = 20 
    MyArray(2, 1) = 21 
    MyArray(2, 2) = 22 
    MyArray(2, 3) = 23 

    Debug.Print MyArray(UBound(MyArray), 3) 

End Sub