“将批量普通类型数据(如 Integer, String)打包成“数组”实现数据共享”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
数组在VBA中是一个特例,VBA规定必须使用引用传递,如果尝试使用值传递,将会引发错误。如果将多个值类型变量(如Integer、String)放入一个数组,然后传递该数组,本质上就是将这些变量的值“打包”并通过引用方式进行传递
将需要“引用”传递的多个值类型数据封装到一个数组中,然后传递该数组,是批量数据实现“引用”效果的一种方式。那么如何操作呢?咱们通过案例加以说明
如下一张考试成绩表,我们需要根据C列的考试成绩判断出其对应的等级(D列)、是否合格(E列)
划分等级的标准:
A:大于等于85分
B:大于等于60小于85分
C:小于60分
判断合格的标准:
这是一个非常普遍且能快速理解的需求,现在要做的事情是把C、D和E列数据打包成一个数组,通过"引用"来填充D和和E列的数据,最终实现的结果:
整体划分为3个过程:
这样划分最显而易见的好处就像阅读一本结构清晰的书籍目录,喜欢哪页读哪页,而且实现的功能越复杂好处越明显。当我们需要修改或扩展功能时,还可精准定位到相关的子过程,避免“牵一发而动全身”的风险
主代码mainPro:定义并初始化ScoreArray数组变量,并将ScoreArray作为参数传递给子过程
Sub MainPro() ' 定义并初始化一个数组 Dim ScoreArray() As Variant Dim ws As Worksheet Dim lastRow As Long Dim ScoreRange As Range Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row Set ScoreRange = ws.Range("C2:E" & lastRow) '默认第一行是标题 ScoreArray = ScoreRange.Value ' 将数组传递给函数 Call IsLevel(ScoreArray) Call IsPassed(ScoreArray) ScoreRange.Value = ScoreArray '结果一次输入到工作表End Sub
子过程IsLevel:
变量 LevelArray获得的是调用方变量ScoreArray 在计算机内存中存储位置的地址(或称为“引用”),使两个变量名指向内存中的同一块数据区域
因此,在 IsLevel 子过程内部,任何通过 LevelArray 对数组元素进行的修改,都会直接且实时地改变原始数组 ScoreArray 中的内容
Sub IsLevel(LevelArray As Variant) ' 数组参数隐式或显式ByRef Dim i As Long Dim score As Double ' 遍历数组的每一行(第一维) For i = LBound(LevelArray, 1) To UBound(LevelArray, 1) ' 确保第1列有值且为数值类型 If IsNumeric(LevelArray(i, 1)) Then score = LevelArray(i, 1) ' 根据分数范围,为第2列等级赋值 If score > 85 Then LevelArray(i, 2) = "A" ElseIf score >= 60 Then LevelArray(i, 2) = "B" Else LevelArray(i, 2) = "C" End If Else ' 如果第1列不是有效数字,可以将第2列置空或标记为错误 LevelArray(i, 2) = "N/A" End If Next iEnd Sub
子过程IsPassed:PassedArray 变量与LevelArray变量的用法一致,不再赘述
Sub IsPassed(PassedArray As Variant) ' 数组参数隐式或显式ByRef Dim i As Long Dim score As Double ' 遍历数组的每一行(第一维) For i = LBound(PassedArray, 1) To UBound(PassedArray, 1) ' 确保第1列有值且为数值类型 If IsNumeric(PassedArray(i, 1)) Then score = PassedArray(i, 1) ' 根据分数范围,为第3列合格赋值 If score >= 60 Then PassedArray(i, 3) = "合格" Else PassedArray(i, 3) = "不合格" End If Else ' 如果第1列不是有效数字,可以将第3列置空或标记为错误 PassedArray(i, 1) = "N/A" End If Next iEnd Sub
今天我们不仅分享了通过数组的参数传递来实现批量数据处理的共享方法,而且在实践中告别了初学者常遇到的代码无序堆砌的状况,通过需求拆分培养模块化意识,让我们编写的代码程序在结构上更清晰、有条理
好了,今天的分享到此结束了,下期继续
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识