在Excel中,列标与列号转换是VBA开发过程中经常用到的功能,下面这篇博客为大家解释了多种方法。
那么这篇博文的核心是“递归过程”,实现这个功能并不是必须使用递归过程,但是这也不失为一种实现方法,对于大家理解和递归过程是个不错的案例。
递归过程从算法上看貌似很复杂,其实简单的说就是,代码过程中包含调用自身过程的代码,这样就构成了嵌套调用,当然需要合理的涉及编程逻辑,确保递归过程能够正确的结束执行。
示例代码如下。
Function sGetColumnIndex(lngColNum As Long) As String
If lngColNum > 26 Then
sGetColumnIndex = sGetColumnIndex(CLng((lngColNum - 1) \ 26)) & VBA.Chr((lngColNum - 1) Mod 26 + 65)
Else
sGetColumnIndex = VBA.Chr((lngColNum - 1) Mod 26 + 65)
End If
End Function
【代码解析】
假设调用函数的VBA代码为Debug.Print sGetColumnIndex(731)
。
下面解释一下代码的执行过程,下文中[X-Y]
代表第X次调用自定义函数,执行其中的第Y行代码。
[1-1]: 调用函数sGetColumnIndex(731)
[1-2]: 满足条件
[1-3]: 再次调用函数sGetColumnIndex(28)得到结果才能和’VBA.Chr(67)'的结果进行合并运算
[2-1]: 调用函数sGetColumnIndex(28)
[2-2]: 满足条件
[2-3]: 再次调用函数sGetColumnIndex(1)得到结果才能和’VBA.Chr(66)‘的结果进行合并运算
[3-1]: 调用函数sGetColumnIndex(1)
[3-2]: 不满足条件,跳转至 [3-4]
[3-5]: sGetColumnIndex赋值为’VBA.Chr(65)’,即返回值为A
[3-6]: 判断语句结束
[3-7]: 第3次调用结束,返回第3次调用的调用点
继续执行 [2-3]: sGetColumnIndex(1)结果为A,'VBA.Chr(66)'的结果为B,此时sGetColumnIndex赋值为AB
[2-6]: 判断语句结束
[2-7]: 第2次调用结束,返回第2次调用的调用点
继续执行 [1-3]: sGetColumnIndex(28)结果为AB,'VBA.Chr(67)'的结果为C,此时sGetColumnIndex赋值为ABC
[1-6]: 判断语句结束
[1-7]: 结束程序执行,输入结果ABC
虽然只有7行代码,但是被反复调用多次,如果大家看上面的文字仍然无法理解执行过程,那么可以在VBE中,使用单步执行功能,逐步运行代码,再对照上面的文字解释。
第3次调用时,按【Ctrl+L】组合键可以打开【堆栈】对话框查看调用过程,如下图所示。