先上代码。
Function englishAdd(ByVal str As String)
Dim h As Integer
h = Len(str)
Do While h > 0
While Mid(str, h, 1) = "Z"
h = h - 1
If h = 0 Then
englishAdd = String(Len(str) + 1, "A")
Exit Function
End If
Wend
Mid(str, h, 1) = Chr(Asc(Mid(str, h, 1)) + 1)
englishAdd = Mid(str, 1, h) & String(Len(str) - h, "A")
Exit Do
Loop
End Function
调用格式为:temp=englishAdd(string),其中string为需要递增的字符串(字母)
例:str="XFZ"
str=englishAdd(str)
运行后str的值变为"XGA",自加了1列。
下面进行速度测试。本次测试选用了三种不同的列数递增方式,区别如下:
1、提取单元格所在地址字符串,使用split()函数进行拆分后提取,简单易懂。
2、将单元格所在列数转换成字母表示。转载自https://blog.csdn.net/gold_star/article/details/52527087,此方法是将数字直接转换成字母表示。
3、采用以上代码进行测试。
为保证测试代码的过程一致性,顾把以上代码中原本按值传递的str改为按引用传递,省去临时变量的赋值操作。
由于递增的列数为从1开始,Excel文件最大列数为16384,顾进行如下代码测试:
Sub 方法1()
Dim v(2 To 16384) As String, a As Double
a = Timer
For num = 2 To 16384
v2 = Split(Cells(1, num).Address, "$")
v(num) = v2(1)
Next
Debug.Print Timer - a
End Sub
Sub 方法2()
Dim v(2 To 16384) As String, st As String, a As Double
a = Timer
For num = 2 To 16384
v(num) = f(num)
Next
Debug.Print Timer - a
End Sub
Sub 方法3()
Dim v(2 To 16384) As String, str As String, a As Double
str = "A"
a = Timer
For num = 2 To 16384
v(num) = englishAdd(str)
Next
Debug.Print Timer - a
End Sub
其中方法2的f()函数转自https://blog.csdn.net/gold_star/article/details/52527087,只是把其中的t改成了按值传递,方便测试。
下面是运行时间(手动按7次F5,通过debug记录运行时间):
| 方法1: | 方法2 | 方法3 |
| .15234375 | .0390625 | .0234375 |
| .1640625 | .0546875 | .01953125 |
| .15625 | .05078125 | .01953125 |
| .15625 | .05078125 | .0234375 |
| .16015625 | .05859375 | .01953125 |
| .16015625 | .05078125 | .01953125 |
| .16015625 | .05859375 | .0234375 |
可以看出方法3的最长时间比方法2的最快运行时间高了0.1秒以上,而方法1就省略了。
如果能够帮到你的话欢迎转载。
本文介绍了一种VBA中用于列名递增的函数,并通过与两种常见方法的速度对比,展示了其高效性能。该函数适用于Excel列名的自动递增,特别是在大量数据处理中表现突出。

1259

被折叠的 条评论
为什么被折叠?



