如果要访问数组中的每个项目,则有两种选择:
- 使用For Each..Next循环,使用Variant依次检索每个值。
- 使用For ... Next循环,从数组的下边界循环到上边界。
For Each varValue In alngValues
j = varValue
Next varValue
使用For ... Next需要您付出更多的努力,因为您必须编写查找上下限的代码。
For lngCount = LBound(alngValues) To UBound(alngValues)
j = alngValues(lngCount)
Next lngCount
您可能会认为For Each ... Next会更快,因为它需要较少的代码,但事实并非如此。
如果您正在使用数组,则For ... Next循环将为您提供更好的性能。
在测试中,较快版本的速度约为较慢版本的70%。
这是将证明我观点的实际代码。
请特别注意timeGetTime()API函数充当秒表:
'First, the API Declaration
Public Declare Function timeGetTime Lib "winmm.dll" () As Long
Public Function fForEach_Next(lngRepeats As Long) As Long
'Slower version of code using For Each...Next to process Array Elements
Dim alngValues(1 To 1000) As Long
Dim varValue As Variant, i As Long, j As Long
Dim lngStartTime As Long
For i = 1 To 1000
alngValues(i) = i
Next i
lngStartTime = timeGetTime()
For i = 1 To lngRepeats
For Each varValue In alngValues
j = varValue
Next varValue
Next i
fForEach_Next = (timeGetTime() - lngStartTime)
End Function
Public Function fFor_Next(lngRepeats As Long) As Long
'Faster version of code using For...Next to process Array Elements
Dim alngValues(1 To 1000) As Long
Dim lngCount As Long, i As Long, j As Long, T As Long
Dim lngStartTime As Long
For i = 1 To 1000
alngValues(i) = i
Next i
lngStartTime = timeGetTime()
For i = 1 To lngRepeats
For lngCount = LBound(alngValues) To UBound(alngValues)
j = alngValues(lngCount)
Next lngCount
Next i
fFor_Next = (timeGetTime() - lngStartTime)
End Function
警告!
-尽管您可以使用这两种技术中的任何一种来读取Array中的项目,但只能使用For ... Next循环写入Array元素。
For Each ... Next循环检索Array中数据的副本,而不是实际的Array元素本身。
尽管使用For Each ... Next写入数组不会出现错误,但数据实际上不会进入数组。
From: https://bytes.com/topic/access/insights/719547-arrays-each-next-vs-next