Excel VBA 编程基础 -- 对象(九)今天我们来讨论 VBA 中的 Interaction 模块。图1 VBA 的 Interaction 模块Interaction 模块包含了几个“多选一”的函数,我们先来讨论这些函数。ChooseChoose 函数的一般格式为:其中,index 是数值表达式,其值在 1 到 n 之间。Choose 函数根据 index 的值返回对应的 choice。如果 index 的值不在区间 [ 1, n ] 内,则 Choose 返回 Null。从上面的一般格式可以看出,Choose 函数其实相当于在 choice 组成的数组中,根据 index 的值返回对应下标的元素。例1. Choose 函数用法示例图2 Choose 函数用法示例在这个例子中,我们用 Select Case 语句模拟了 Choose 函数,其实用 If ... End If 结构也可以模拟 Choose 函数。既然 VBA 已经有了 If ... End If 和 Select Case ... End Select 语句,那为什么还要增加一个 Choose 函数呢?其实,我们从上面的代码不难看出,同样的功能,使用 Choose 函数,使得代码非常紧凑,看起来更美观。使用 Choose 函数,既节省了打字输入,又具有美学价值。英文字 Choose 本义就是多中选一,从示例可以看出,Choose 函数完美体现了其本义。IIfIIf 函数是“二选一”,其一般格式为:其中,expr 是一个 Boolean 类型的表达式,如果求值的结果为 True,IIf 返回 truepart,否则返回 falsepart。例1. IIf 函数用法示例Dim v As Variantv = IIf(3 > 5, "True", "False")Debug.Print v在这个例子中,IIf 函数计算表达式 3 > 5 的结果,发现结果为 False,因此 IIf 返回 falsepart,即 False。所以,Debug.Print v 打印出 False。例2. IIf 和 Choose 联合使用举例图3 IIf 和 Choose 联合使用举例在这个例子中,我们先使用 IIf 来判断 n 是否落在区间 [ 1, 5 ] 之外,用来判断的表达式是 n < 1 Or n > 5,如果这个表达式求值结果为 True,说明 n 落在区间之外,则返回 truepart,即 Null;否则,返回 falsepart,该 falsepart 即 Choose 函数表达式,即如果 n 落在区间之内,则对 Choose 函数表达式求值,即调用 Choose 函数,返回相应的 choice。程序运行结果如右侧窗口所示。可以看出,与图2 的结果是一样的。SwitchSwitch 函数的一般格式为:其中,expr 是 Boolean 表达式。Switch 函数的功能是:对每一个 expr 表达式求值,如果某个 expr 表达式求值结果为 True,则返回对应的 value。如果有多个 expr 结果为 True,则返回第一个结果为 True 的 expr 所对应的 value。如果没有 expr 结果为 True,则返回 Null。例1. Switch 模拟 Choose 函数图4 用 Switch 模拟 Choose由图可见,Switch 中的每个 expr 都是 Boolean 表达式,每一次循环,Switch 都会计算所有的 expr,并返回值为 True 的 expr 所对应的 value。结果如右侧窗口所示。与图2 和 图3 对照,就会发现结果都是一样的,这说明 Choose、Select Case ... End Select、Switch 都是等价的。虽然它们相互等价,但各自有自己擅长的场景。Partition下面介绍最后一个“多选一”的函数 Partition。Partition 是一个分组函数,其一般格式为:其中,start(上界) 和 stop(下界) 构成了一个大区间 [ start, stop ],以 interval 为步长划分为若干个小区间,Partition 以字符串形式返回 number 落入的小区间。例1. Partition 分组示例图5 Partition 分组示例从图中的结果可以看出,Partition 划分的小区间与步长的关系如下:所以,对于 Partition(4, 1, 5, 1),其输出结果为 4:4,而对于 Partition(3, 1, 5, 2),则输出 3:4,因为 3 落在小区间 [3, 4] 之内。注意:如果 n 位于大区间之外,譬如 n < start,则 Partition(n, start, stop, interval) 输出 :start,相当于 n 落在 (-∞, start];若 n > stop,则输出 stop:,相当于 n 落在 [ stop, +∞)。下面我们用一个例子证明上面关于小区间与步长关系的算法。例2. 模拟 Partition 划分小区间(分组)图6 模拟 Partition 划分小区间(分组)这个例子演示了对于大区间 [1, 5],分别以步长 1、2、3、4、5 来划分,所形成的小区间的情况。可以看出,图6 的划分结果与图5 的划分结果是一致的。下面给出一个 Partition 的应用实例以结束本文。例3. 薪资分布统计图7 薪资分布统计代码所用技术都是已经讨论过的内容,兹不赘述。只说明几个常量及函数:vbNewLine:输出回车换行vbTab:将输出定位在下一个 TAB 位置Space(n):输出 n 个空白字符相关阅读Excel VBA 编程基础 -- 对象(一)Excel VBA 编程基础 -- 对象(二)Excel VBA 编程基础 -- 对象(三)Excel VBA 编程基础 -- 对象(四)Excel VBA 编程基础 -- 对象(五)Excel VBA 编程基础 -- 对象(六)Excel VBA 编程基础 -- 对象(七)Excel VBA 编程基础 -- 对象(八)