|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 leolee82 于 2024-11-5 16:28 编辑
参照C++中的StringView,写了一个clsArrayView1D。可以在不复制数组数据的前提下,通过一维数组的方式访问/修改其他数组的数据,可以在某些情况下提高程序运行速度。应用场景:
1. 通过一维数组的方式访问二维数组的列
2. 一维数组的子数组
3. 通过SafeArrayCopyData 将一维数组赋值给二维数组的某列/一维数组的子数组
实际上一个成员函数就可以搞定,拆成几个成员函数的目的是,在循环中可以避免重复执行一些代码。如有未考虑到的地方,欢迎大家指正。
clsArrayView2D的代码类似,就不放上来了。
使用场景示例如下:
- Private Declare Function SafeArrayCopyData Lib "oleaut32.dll" (ByVal psaSource As Long, ByVal psaTarget As Long) As Long
- Sub TestclsArrayView1D()
- Dim arrView1, arrView2, o1 As New clsArrayView1D, o2 As New clsArrayView1D
- Dim p1 As Long, p2 As Long
- '访问二维数组的列,二维数组数据是按列存储的
- arr1 = [a1:b3]
- With o1
- 'With CreateObject("EXDIY.clsArrayView1D")
- .Initial arr1
- .SetArrayViewVariant arrView1
- p1 = .CreateArrayView(1, 2, 3, 0) '使用arrView访问arr的第二列
-
- arr3 = arrView '复制arr的第二列为一个一维数组
- '以一维数组方式访问arr的第二列
- Debug.Print arrView1(0), arrView1(1), arrView1(2) '4,5,6
-
- '修改arr第二列数据
- arrView1(0) = "A"
- arrView1(1) = "A"
- arrView1(2) = "A"
-
- Debug.Print arr1(1, 2), arr1(2, 2), arr1(2, 2) 'A,A,A
- End With
- '一维数组子数组
- arr2 = Array(0, 1, 2, 3, 4)
- With o2
- 'With CreateObject("EXDIY.clsArrayView1D")
- .Initial arr2
- .SetArrayViewVariant arrView2
- p2 = .CreateArrayView(2, 0, 3, 0) '使用arrView访问arr(2)和arr(3)
-
- Debug.Print arrView2(0), arrView2(1), arrView2(2) '2,3,4
-
- '复制arr1第二列数据到arr2,前提是ArrayView的数据类型相同,数组大小相同
- SafeArrayCopyData p1, p2
-
- Debug.Print arr2(2), arr2(3), arr2(4) 'A,A,A
-
- arrView2(0) = "C"
- arrView2(1) = "C"
- arrView2(2) = "C"
-
- '将一维数组赋值给二维数组的某列
- SafeArrayCopyData p2, p1
- Debug.Print arr1(1, 2), arr1(2, 2), arr1(2, 2) 'C,C,C
- End With
- End Sub
复制代码
工作簿3421.rar
(22.96 KB, 下载次数: 6)
|
|