【转载】EXCEL VBA UBound(arr,1),UBound(arr,2)解释
Resize(UBound(arr, 1), UBound(arr, 2) 这句什么意思
resize()是一个扩展单元格地址区域的函数,有两个参数,第一个是行扩展数,第二个是列扩展数
UBound(arr, 1) :arr数组中最大行数;
UBound(arr, 2) :arr数组中最大列数。
这里是把数组的最大行数充当了 RESIZE的行扩展,最大列数 充当了resize的列扩展数。
arr = Range(("a2:b") & Range("a6555").End(xlUp).Row)
[a2].Resize(UBound(arr), 2) = arr '请详细解释一下这行什么意思?
把AB2列存入数组arr,再将arr重写入这个区域
效果就是如果原来有公式,这样就全没了,相当于粘贴数值。
例子1:
-------------------------------
Sub iSub()
Dim arr
arr = Range("a1:a7")
For i = 1 To UBound(arr, 1)
For j = 1 To UBound(arr, 2)
'处理的语句
Next
Next
End Sub
--------------------------------
解释:
将 arr 赋值为一个数组,即 Range("a1:a7")的单元格区域内容,即一个7行1列的区域
相当于:先定义数组 arr(1 to 7 ,1 to 1),再赋值内容
使用UBound(arrayname[, dimension])函数,获取指定维数的上限:
UBound(arr, 1) 取得arr第一维的上限: 7
UBound(arr, 2) 取得arr第二维的上限: 1
用两个 for ,循环数组中的每个元素。
例子2:
Sub 二列数据找相同项数组法()
Dim arr1, arr2, arr3()
arr1 = Range("A1:A13") '第一列数据范围
arr2 = Range("B1:B13") '第二列数据范围
For i = 1 To UBound(arr1)
For j = 1 To UBound(arr2)
If arr1(i, 1) = arr2(j, 1) Then
If InStr(Join(arr3, ","), arr1(i, 1)) = 0 Then
n = n + 1
ReDim Preserve arr3(1 To n)
arr3(n) = arr1(i, 1)
Exit For
End If
End If
Next
Next
Range("d1").Resize(UBound(arr3), 1) = WorksheetFunction.Transpose(arr3) '相同的项放在d1单元格中。
End Sub
Sub 二列数据找相同项字典法()
arr1 = Range("A1:A13") '第一列数据范围
arr2 = Range("B1:B13") '第二列数据范围
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr1)
d(arr1(i, 1)) = 0
Next
For j = 1 To UBound(arr2)
If d.exists(arr2(j, 1)) Then d(arr2(j, 1)) = 1
Next
For Each d1 In d.keys
If d(d1) = 0 Then d.Remove (d1)
Next
Range("f1").Resize(d.Count, 1) = WorksheetFunction.Transpose(d.keys) '相同的项放在f1单元格。
End Sub