我知道Columns(“ A:B”)。Select用于选择列A和列B,但我想知道两者之间是否有区别
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
我已经在代码中对它们进行了测试,并且看起来都一样。
奖金问题:两者之间的编译时间/运行时间是否有所不同?
Columns("A").Select
Columns("A:A").Select
谢谢,祝你有美好的一天!
答案 0 :(得分:2)
用于测试各种选择选项时间的代码:
Option Explicit
Sub SelectTime()
Dim LRow As Long
LRow = Range("C" & Rows.Count).End(xlUp).Offset(1).Row
Dim t
t = timer
'Range("A1").Select
Range("A:A").Select
Range("C" & LRow) = timer - t
End Sub
与选择整个列相比,选择1个像元的31次迭代的输出。不论是否包含单元格内容,结果都不会改变
答案 1 :(得分:1)
我已经重复了urdearboy的测试,但是确保为每行重置计时器。我也跑了100次。
所有测试的值为0或0.003906。
Option Explicit
Sub SelectTime()
Dim t, v, i As Long
For i = 99 To 0 Step -1
t = Timer: Range("A:A").Select: v = Timer - t: Range("C2").Offset(, i) = v
t = Timer: Range("A1:A10").Select: v = Timer - t: Range("C3").Offset(, i) = v
t = Timer: Range("A1:A100").Select: v = Timer - t: Range("C4").Offset(, i) = v
t = Timer: Range("A1:A1000").Select: v = Timer - t: Range("C5").Offset(, i) = v
t = Timer: Range("A1:A10000").Select: v = Timer - t: Range("C6").Offset(, i) = v
t = Timer: Range("A1:A100000").Select: v = Timer - t: Range("C7").Offset(, i) = v
t = Timer: Range("A1:A1000000").Select: v = Timer - t: Range("C8").Offset(, i) = v
Next
End Sub
这10个案例中的每一个的平均运行时间,在每种100项测试中,非空范围几乎没有区别(我的整个Column A都填充了值)。
在100个测试中,每组行的平均结果实际上是相同的,最高和最低平均值之间的差异小于1/1000秒。
您可以通过WinAPI调用更精确地测量经过时间。
Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
Sub SelectTime()
Dim t, v, i As Long
Application.Calculation = xlCalculationManual
For i = 499 To 0 Step -1
t = GetTickCount: Range("A:A").Select: v = GetTickCount - t: Range("C2").Offset(, i) = v
t = GetTickCount: Range("A1:A10").Select: v = GetTickCount - t: Range("C3").Offset(, i) = v
t = GetTickCount: Range("A1:A100").Select: v = GetTickCount - t: Range("C4").Offset(, i) = v
t = GetTickCount: Range("A1:A1000").Select: v = GetTickCount - t: Range("C5").Offset(, i) = v
t = GetTickCount: Range("A1:A10000").Select: v = GetTickCount - t: Range("C6").Offset(, i) = v
t = GetTickCount: Range("A1:A100000").Select: v = GetTickCount - t: Range("C7").Offset(, i) = v
t = GetTickCount: Range("A1:A1000000").Select: v = GetTickCount - t: Range("C8").Offset(, i) = v
Next
Application.Calculation = xlCalculationAutomatic
End Sub
每个选择的500个测试的结果范围为.852毫秒,最小值为.936,最大值为1.788。分布似乎并不取决于所选内容中的行数。
答案 2 :(得分:0)
在这种情况下:
Columns("A").Select
Columns("A:A").Select
没有区别。您正在选择相同的范围。
在这种情况下:
Columns("A").Select
Columns("A1:A10000").Select
取决于这些信息的范围在这些范围内。信息越多,范围越广,所需的运行时间也越长。
答案 3 :(得分:0)
这个问题有什么意义?因为答案是否,所以选择1个单元格与1,000,000个单元格没有区别。
此外,如果您在代码中使用.Select
,则会出错。
选择单个单元格(“ A1” / B1“)的2000次(2x1000)次的平均时间为 1.793s和2.039s 。
整个列(“ A” / B“)选择2000(2x1000)次的平均时间在 1.816s和1.914s 之间。
这只是从定时器运行4次起...如果继续,我会看到非常相似的结果,但会有更多的变化。但最终,所花费的时间会重叠。这仅取决于CPU是否正在做其他事情,例如在移动鼠标时更新鼠标指针或在后台运行服务(例如防病毒软件)。
在这里,自己尝试一下。只需确保多次运行测试即可,因为我认为您会注意到它随当时其他进程占用CPU的情况而有所不同。
Public Sub TimeStamp(Optional Prompt As String, Optional StartTime As Boolean)
Static s_fTimer As Single, s_fIntervalTimer As Single
Dim fCurrTime As Single
fCurrTime = Timer
If StartTime Then
s_fTimer = fCurrTime
s_fIntervalTimer = fCurrTime
End If
If Prompt <> vbNullString Then Prompt = " - " & Prompt
Debug.Print Format((fCurrTime - s_fTimer), "0.000s") & Format((fCurrTime - s_fIntervalTimer), "(0.000s)") & Prompt
s_fIntervalTimer = fCurrTime
End Sub
Sub Test()
Const max As Long = 1000
Dim i As Long
TimeStamp "Start", True
For i = 1 To max
Columns("A").Select
Columns("B").Select
Next
TimeStamp "A"
For i = 1 To max
Columns("A:A").Select
Columns("B:B").Select
Next
TimeStamp "A:A"
For i = 1 To max
Range("A1:A100000").Select
Range("B1:B100000").Select
Next
TimeStamp "A100000"
For i = 1 To max
Range("A1").Select
Range("B1").Select
Next
TimeStamp "A1"
End Sub