先上代码。
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就省略了。
如果能够帮到你的话欢迎转载。