数组与字典解决方案第三十二讲:数组的拆分和维数转换

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华 ,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。

这套字典教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:数组与字典解决方案第三十二讲:数组的拆分和维数转换

【分享成果,随喜正能量】342在这世上,很多事情你可以不理解,却必须接受。只有真正了解这个世界的丑陋与污浊,被现实打击,被痛苦折磨,遍体鳞伤、无所遁形,却从未放弃对光明的追寻,依然微笑着,坚定前行的人,才是真正的勇者。

第三十二讲 数组的拆分和维数转换

大家好,我们今日继续VBA数组与字典解决方案的讲解,今日讲解第32讲,数组的拆分和维数转换:

1 数组的拆分

1) 用Index拆分数组

数组的拆分在VBA中是一个难题,如果是按行拆分数组,除了用循环外也只能借用API函数完成了。幸好我们可以借用工作表函数index达到按列拆分数组。

语法: INDEX(array,row_num,column_num)

参数:

① Array 为单元格区域或数组常量。

② 如果数组只包含一行或一列,则相对应的参数 row_num 或 column_num 为可选。如果数组有多行和多列,但只使用 row_num 或 column_num,函数 INDEX 返回数组中的整行或整列,且返回值也为数组。

③ Row_num 数组中某行的行序号,函数从该行返回数值。如果省略 row_num,则必须有Column_num。

④ Column_num 数组中某列的列序号,函数从该列返回数值。如果省略 column_num,则必须有 row_num。

特别说明:

①如果同时使用 row_num 和 column_num,函数 INDEX 返回 row_num 和 column_num 交叉处的单元格的数值。

②如果将 row_num 或 column_num 设置为 0,函数 INDEX 则分别返回整个列或行的数组数值。Row_num 和 column_num 必须指向 array 中的某一单元格;否则,函数 INDEX 返回错误值 #REF!。

例:=INDEX(A2:B3,2,2) 返回单元格区域的第二行和第二列交叉处的值

=INDEX(A2:B3,2,1) 返回单元格区域的第二行和第一列交叉处的值

2) 用Index函数取出任意一列的数组

我们可以任意拆分出一列构成新的数组。方法是:Application.Index(数组, , 列数) 。

Sheets("32").Select

'数组的拆分

arr1 = Range("A1:C10") '把单元格区域A1:B4的值装入数组arr1

arr2 = Application.Index(arr1, , 2) '把数组第2列拆分出来装入新数组arr2中,新数组为二维数组

MsgBox arr2(2, 1) '取出新数组第2行的值

2 数组维数的转换

Transpose转置数组在工作表中可以把行列转换。在VBA中同样也可以做到转换的效果。

1)一维转二维

'数组维数的转换

arr3 = Array(10, 350, "aq", 40, 103, "bw")

arr4 = Application.Transpose(arr3)

MsgBox arr4(2, 1) '转换后的数组是1列多行的二维数组2、二维数组转一维。

2)两维转一维

注:在转置时,当只有1列N行的数组才能直接转置成一维数组

'数组维数的转换2维转1维

arr1 = Range("A1:C10") '把单元格区域A1:B4的值装入数组arr1

arr5 = Application.Transpose(Application.Index(arr1, , 2)) '取得arr1第2列数据并转置成1维数组

MsgBox arr5(2)

3 数组的拆分和维数的转换代码示例

今日代码实例:

Sub MyNZsz_32() '第32讲 数组的拆分和维数的转换

Sheets("32").Select

'数组的拆分

arr1 = Range("A1:C10") '把单元格区域A1:B4的值装入数组arr1

arr2 = Application.Index(arr1, , 2) '把数组第2列拆分出来装入新数组arr2中,新数组为二维数组

MsgBox arr2(2, 1) '取出新数组第2行的值

'数组维数的转换

arr3 = Array(10, 350, "aq", 40, 103, "bw")

arr4 = Application.Transpose(arr3)

MsgBox arr4(2, 1) '转换后的数组是1列多行的二维数组

'数组维数的转换2维转1维

arr1 = Range("A1:C10") '把单元格区域A1:B4的值装入数组arr1

arr5 = Application.Transpose(Application.Index(arr1, , 2)) '取得arr1第2列数据并转置成1维数组

MsgBox arr5(2)

arr6 = Range("A1:C1")

MsgBox Join(Application.Transpose(Application.Transpose(arr6)), "-")

End Sub

代码截图:

看我们的工作表:

上述代码共要弹出4个对话框:

分别是什么呢?我们看实测:

今日内容回向; 1 如何拆分数组?

2 如何使数组维数发生转换?

3 arr6 = Range("A1:C1")

MsgBox Join(Application.Transpose(Application.Transpose(arr6)), "-")

上述代码中 为什么要进行两次转置?

我多年的VBA实践经验,全部浓缩在以下教程中:

相关推荐
m0_720245015 小时前
1543.统计好三元组(简单)
开发语言·算法
叠层归一研究院6 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
明朝百晓生7 小时前
Deep RL learning[2026/8]
开发语言·javascript·人工智能
weixin-a153003083167 小时前
python-装饰器
开发语言·python
我的xiaodoujiao8 小时前
快速学习Python基础知识详细图文教程17--类型注解和断点调试
开发语言·python·学习·测试工具
leoZ23110 小时前
AI 辅助开发的五道坎
开发语言·人工智能·视觉检测·bert·php·超分辨率重建·openvino
程序员老陆10 小时前
Qt的QThread::usleep和FFmpeg的libavutil模块的av_usleep哪个精度高一些?
开发语言·qt·ffmpeg·音视频
2601_9638699511 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
名字还没想好☜11 小时前
Go 的 unsafe.Pointer 实战:零拷贝 []byte↔string 转换与三条铁律
开发语言·后端·golang·go·unsafe
天天进步201513 小时前
Python全栈项目--协同办公平台
开发语言·python