1 数组里中有空值,会一直存在着
- 数组不能直接删除其中的方式
- 数组里中有空值,会一直存在着,可以把数组某个值置空
- 可以利用这一点只用数组前一截
- 数组的后面多一些空值,不咋影响,因为截断用前面的,没啥影响,可以利用这一点,只用数组前一截
- 但是数组中间有空值还是挺恶心的
- 这样redim 去重数组时可以随意大一点了
Sub test_arr1()
arr1 = Array(1, 3, 5, 7, 9, "", "")
arr1(1) = ""
arr1(2) = ""
'arr1(5) = "" '数组适合整体操作,或循环操作,不能这样随便增加内容
'arr1(6) = ""
'arr1(7) = ""
For I = LBound(arr1) To UBound(arr1)
Debug.Print arr1(I) & ","
Next
Debug.Print
End Su
1.1 对应数组大小的利用:数组可以考虑设置得大一些
- 数组可以考虑设置得大一些
- 因为数组的某些element为空是没问题的,所以不要太在于数组里的空值,尤其是数组末尾的空值
- 数组末尾的空值完全可以截掉,或不管嘛
- 数组中间的空值还是有点讨厌的
1.2 对于 动态数组redim的几种思路
- 首先,如果先声明为了动态数组,那么使用这个动态数组前,必须先redim
- dim arr1()
- redim arr1(4,5)
- 数组redim时,如果需要用到循环,可以在循环外进行redim 为静态的,这样比较简单
- 技巧是,可以选择一个较大的值,比如取另外一个数组的 ubound() 或者就是写一个足够大的值。(足够的标准你自己把握)
- 毕竟数组可以只用前面那部分,后面空着一片 "" 就空着呗,一般问题不大。至少我这种新手是这么认为的。
- 还一种我这种新手比较取巧不在乎效率的方法
- 就是把数组index设置的比较大
- 比如redim arr1(9999)
- 数组也可以redim大小为变量
- 数组redim时,如果需要用到循环,如果非要在循环内redim,要特别小心
- for i 1 to 5 这种循环,因为循环体重置到min值的时候,导致数组内容被抹掉!!!
1.3 redim 容易出错的几个问题总结
- 特别注意下面这几个常见问题
- 边界问题:起始index 是0 还是1,是需要+1 还是-1
- 大小问题:redim preserve 如果选了保留之前的数组内容,一定要记得让后redim 的数组大小包含之前数组范围!不能更小!
- 越界问题:数组的维数是否正确
2 数组的index经过一个“完整循环”,一定会停留在 ubound()+1上
2.1 例子1
Sub test_arr2()
'数组的指针循环完了还会继续往后1?
'循环的末尾,数组会继续index+1 虽然不往后了,但index停留在Ubound()+1上
arr1 = Array(1, 2, 3, 4, 5, 6, 7)
For I = LBound(arr1) To UBound(arr1)
Debug.Print "index= " & I & " and element= " & arr1(I)
Next
Debug.Print "index= " & I
Debug.Print "index= " & I
End Sub
2.2 例子2
Sub test_arr4()
'证明了array完整循环一遍最后index一定停留在index+1上?
Dim arr2()
arr1 = Array(1, 2, 3, 4, 5, 5, 5)
ReDim arr2(UBound(arr1))
For I = LBound(arr1) To UBound(arr1)
For J = LBound(arr2) To K
If arr1(I) = arr2(J) Then
Exit For '为了配合后面得index选择性的停在ubound+1上,否则都停在ubound+1上没法区分
End If
Next
If J = K + 1 Then 'array的index指针停在ubound+1就证明内部循环完整走完没有exit for,证明无重复
arr2(K) = arr1(I)
K = K + 1
End If
Next
Debug.Print "arr1"
For Each I In arr1
Debug.Print I
Next
Debug.Print
Debug.Print "arr2"
For Each I In arr2
Debug.Print I
Next
Debug.Print
End Sub
3 数组使用match这种工作表函数时
- 注意 index默认起点和 match函数默认index起点不同导致
Sub test_arr3()
'利用字典的数组为啥要-1?
Dim dict1 As Object
Set dict1 = CreateObject("scripting.dictionary")
arr1 = Array(1, 2, 3, 4, 5, 6, 7)
arr2 = Array(11, 22, 33, 44, 55, 66, 77)
For I = LBound(arr1) To UBound(arr1)
dict1(arr1(I)) = arr2(I)
Next
For Each J In dict1.Keys()
Debug.Print J & "," & dict1(J)
Next
Debug.Print
target1 = 77
arr1 = dict1.Keys()
arr2 = dict1.Items()
'不减1就越界,是因为index多往后移位的原因?--不是,这个是因为match函数默认从1开始排列,而原数组是0开始的
Debug.Print target1 & "对应的key= " & arr1(Application.Match(target1, arr2, 0) - 1)
End Sub