我创建了一个 Excel VBA 宏,可以进行大量数据密集型处理。我经常使用 Collections。在某些 PC 上,它运行得非常快,而在其他 PC 上,它运行得非常慢。我在下面的示例代码中隔离了该问题。请注意,示例代码不是一个功能程序,它只是为了隔离我在更大的程序中遇到的技术问题。
我已经在 4 台不同的机器上测试了该宏。请参阅下面带有 CPU 信息的输出,全部使用“Microsoft® Excel® for Microsoft 365 MSO(版本 2210 Build 16.0.15726.20188)32 位”:
Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz,RAM 16.0 GB: 运行循环耗时 0.09 秒。清除内存耗时 0.04 秒。
第 11 代英特尔(R) 酷睿(TM) i7-1185G7 @ 3.00GHz,RAM 16,0 GB: 运行循环花费了 0.10 秒。清除内存花费了 0.05 秒。
Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz,RAM 32,0 GB: 运行循环耗时 162,58 秒。清除内存花费了 5.48 秒。
Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz,RAM 16.0 GB: 运行循环耗时 201,03 秒。清除内存花费了 6.37 秒。
VBA程序代码:
Option Explicit
Sub largeCollection()
Dim time1 As Single
Dim time2 As Single
time1 = Timer
Dim myCollection As New Collection
Dim I As Long
Dim aClass1 As Class1
For I = 2 To 50000
Set aClass1 = New Class1
aClass1.d1 = I
aClass1.d2 = I
aClass1.d3 = I
aClass1.d4 = I
aClass1.d5 = I
aClass1.d6 = I
aClass1.d7 = I
aClass1.d8 = I
aClass1.d9 = I
aClass1.d10 = I
aClass1.i1 = I
aClass1.i2 = I
aClass1.i3 = I
aClass1.i4 = I
aClass1.i5 = I
aClass1.i6 = I
aClass1.i7 = I
aClass1.i8 = I
aClass1.i9 = I
aClass1.i10 = I
myCollection.Add aClass1
Next I
time2 = Timer
Set myCollection = Nothing
'Notify user in seconds
Debug.Print "Run loop took " & Format((time2 - time1), "0.00") & " seconds. Clearing memory took " & Format((Timer - time2), "0.00") & " seconds."
End Sub
自定义类“Class1”的代码:
Option Explicit
Public s1 As String
Public s2 As String
Public s3 As String
Public s4 As String
Public s5 As String
Public s6 As String
Public s7 As String
Public s8 As String
Public s9 As String
Public s10 As String
Public s11 As String
Public s12 As String
Public s13 As String
Public s14 As String
Public s15 As String
Public s16 As String
Public s17 As String
Public s18 As String
Public s19 As String
Public s20 As String
Public v1 As Variant
Public v2 As Variant
Public v3 As Variant
Public v4 As Variant
Public v5 As Variant
Public v6 As Variant
Public v7 As Variant
Public v8 As Variant
Public v9 As Variant
Public v10 As Variant
Public i1 As Long
Public i2 As Long
Public i3 As Long
Public i4 As Long
Public i5 As Long
Public i6 As Long
Public i7 As Long
Public i8 As Long
Public i9 As Long
Public i10 As Long
Public d1 As Double
Public d2 As Double
Public d3 As Double
Public d4 As Double
Public d5 As Double
Public d6 As Double
Public d7 As Double
Public d8 As Double
Public d9 As Double
Public d10 As Double
我已经没有选择了,如果有人能提供解决方案,那就太好了。
最佳答案
我们终于自己找到了答案,虽然不是很令人欣慰...性能差异似乎完全取决于信任中心宏设置。
如果我选择该选项:
- “通过通知禁用宏”,我必须显式“启用内容”才能在打开工作簿时启用宏。使用此选项宏运行速度减慢 2000 倍
- “启用 VBA 宏(不推荐;可能运行有潜在危险的代码)”代码运行速度提高 2000 倍。
我希望这 2 个选项具有相同的性能,因为在启用内容后,我启用了 VBA 宏,就像我选择了另一个选项一样。
这意味着我可以获得高性能宏的唯一方法是将选项设置为“启用 VBA 宏(不推荐;可以运行潜在危险的代码)”,这将导致所有工作簿的所有宏都运行默认情况下,即使我会打开来自第 3 方的随机 Excel,这也是一个巨大的安全风险。
关于excel - 为什么 Excel VBA 代码在某些机器上运行速度慢 2000 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74488285/