Columns(“ A”)。Select和Columns(“ A:A”)。Select之间的区别

时间:2018-08-10 16:15:05

标签: excel vba excel-vba

我知道Columns(“ A:B”)。Select用于选择列A和列B,但我想知道两者之间是否有区别

SELECT * FROM dbo.splitstring('91,12,65,78,56,789')

我已经在代码中对它们进行了测试,并且看起来都一样。

奖金问题:两者之间的编译时间/运行时间是否有所不同?

Columns("A").Select
Columns("A:A").Select

谢谢,祝你有美好的一天!

4 个答案:

答案 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次迭代的输出。不论是否包含单元格内容,结果都不会改变

enter image description here

答案 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秒。

enter image description here

更精确的测量:

您可以通过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。分布似乎并不取决于所选内容中的行数。

enter image description here

答案 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