VBA UBound函数

我正在尝试在Visual Basic for Applications(VBA)中探索UBound应用程序。 比方说,我有一个4乘2的数组…(A1:B4),我想要计算行数。 我会认为我的代码是…

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

我的input是=test(A1:B4)但到目前为止我得到“#value!” 错误。 我以为回报会是4。

我究竟做错了什么? 我知道如何使用row命令获取行数,但我只是想通过编码练习。

List是范围对象而不是数组。 Range.Value将从一个范围返回一个数组值, Range.Formula将从一个范围返回一个公式数组。

在这里输入图像说明

 Function test(list As Range) As Double test = UBound(list.Value) End Function 

看来你有2维数组,所以你必须为UBound提供额外的参数,如:

 UBound(array, dimension) 

请记住,如果您从Excel范围获取数组,而不是基于1的数组。

完整的解决scheme可以看起来像这样:

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

示例调用: =testArrray(G15:H20,1)产生6结果是正确的。

既然你没有明确的Dim list ,它是Variant 。 所以如果你调用=TEST(A1:B4)它将是一个Range而不是一个ArrayRange没有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执行以下操作:如果list是一个Range -Object,那么它将被隐式转换为Array因为Set不用于设置一个对象。 如果list已经是一个Array ,那么它也将是一个Array之后。

这是如何获得函数中的行数。

 Option Explicit Function l_number_of_rows(rng_range As Range) As Long l_number_of_rows = rng_range.Rows.Count End Function 

如果你想从维度来看,这是一个可能的解决scheme。

 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 

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将是垂直的,如果你想指定,你可以添加可选的参数UBound(list,1),但是用你指定的数据按照你的意愿剔除4

Ubound是一个函数,它在你传递一个范围的数组上工作

尝试这个

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