1 数组更像1个整体,而字典更像1个集合适合逐个处理。
- 设计数组和字典的人,目的性很不同
- 理解array 和 dictionary 两者的定位有很多差别
1.1 数组的特点
1.1.1数组方便的操作----数组最好用的方法是:循环
- 数组整体赋值 arr1=range()
- (动态)数组整体改变赋值
- 取得数组的上下限制,lbound() 和 ubound()
1.1.2 数组不方便的操作
- 统计数组的个数? 很困难吧
- 数组的元素怎么添加? 很困难吧
- 数组的元素怎么删除? 很困难吧,好像不能删除,只能置空
1.1.3 数组的主要操作方法
- 基本只能依靠循环 for each 或 for i = 1 to 2
- 也可以array(i) 的方式操作某个元素,但没 字典 方便
1.1.4 数组设计者的意图-------把数组当一个整体使用
- 感觉更适合整体处理,而不是处理里面的某个元素
- 在VBA中使用数组的目的,一般是为了方便、高效。
- 怎么达到方便高效,就是把数组当一个整体处理。
1.1.5 数组可以方便的生成其他数组的方法, filter() 筛选--可实现删除某元素效果
Sub test1001()
arr1 = Array(1, 2, 3, 4, 5, 5, 5)
arr2 = Filter(arr1, 5, True)
show_arr1 (arr2)
arr3 = Filter(arr1, 5, False)
show_arr1 (arr3)
End Sub
Function show_arr1(x) '写的这个只能针对一维数组
For Each I In x
Debug.Print I;
Next
Debug.Print
End Function
1.2 字典的特点
1.2.1 字典很方便的方法和属性 ( 内置了很多好用的方法 和 属性 )
- 字典的key是不会重复的
- 字典可以用 dict(key) 查找,如果没有则会添加item
- 字典很有很方便的,删除,增加字典元素
- Dict.add
- Dict.remove()
- Dict.removeall()
1.2.2 字典的属性
- dict() 赋值用
- dict.item() 等同于 dict()
- dict.key() 很特殊,用来改变key值
- dict.count
- dict.comparemode
1.2.3 字典的方法
- dict.add key item 增加一对 key-item
- dict.remove(key)
- dict.removeall
- dict.exists(key)
- dict.keys() 生成数组1
- dict.items() 生成数组2
1.3 比较
- 数组更像一个整体不适合拆开处理,而字典更像集合适合处理单个元素
- 数组更像一个整体
- 字典更像集合
- 如果是在过程中,需要删除某个值,常用的是字典或集合,而不是使用数组。
- 设计者的目的很明显,就是当整体使用尽量这样吧
2 如果一定要删除数组的某个元素
- 方法1:置空,但这个位置仍保留着
- 方法2: 循环的过程中删除,然后主动生成1个新的数组,因为原数组并不会改变
在数组中删除某些元素并重新生成不含这些元素的数组,
如果必须这么做,一般循环遍历是唯一正确的做法。
Sub test_arr1()
arr1 = Range("a1:a10")
For I = LBound(arr1) To UBound(arr1)
For J = LBound(arr1, 2) To UBound(arr1, 2)
Debug.Print "arr1(" & I & "," & J & ")="; arr1(I, J)
Next
Next
Debug.Print
arr1(1, 1) = ""
Debug.Print "置空单元格后"
For I = LBound(arr1) To UBound(arr1)
For J = LBound(arr1, 2) To UBound(arr1, 2)
Debug.Print "arr1(" & I & "," & J & ")="; arr1(I, J)
Next
Next
Debug.Print
Debug.Print "删除某个元素"
Dim arr2()
m = 1
For I = LBound(arr1) To UBound(arr1)
For J = LBound(arr1, 2) To UBound(arr1, 2)
If Not arr1(I, J) = 4 Then
ReDim arr2(m)
arr2(m) = arr1(I, J)
Debug.Print "arr2(" & m & ")="; arr2(m)
m = m + 1
Else
End If
Next
Next
Debug.Print
End Sub
3 如果要对数组进行去重处理(利用字典)
Sub test_arr2()
arr1 = Range("a1:a10")
Dim dict1 As Object
Set dict1 = CreateObject("scripting.dictionary")
For Each I In arr1
dict1(I) = ""
Next
Debug.Print "被字典净化去重后的数组"
For I = LBound(arr1) To UBound(arr1)
For J = LBound(arr1, 2) To UBound(arr1, 2)
Debug.Print "arr1(" & I & "," & J & ")="; arr1(I, J)
Next
Next
Debug.Print
Debug.Print "被字典净化去重后的数组变化的新数组dict1.keys()"
For Each I In dict1.keys()
Debug.Print I
Next
End Sub