此职位的我想要的标题: VB6(VBA)循环代码优化(抱歉,遇到任何麻烦)
所以我一直在我的VB6(VBA)程序中使用以下代码:
Public Sub Form_Load()
Dim Output As String
For i = 1 To 990
For i2 = 1 To 990
Output = Output & i * i2
Next
Next
End Sub
for循环非常慢,在极端情况下要花几个小时才能执行。有什么技巧可以优化我的代码?
答案 0 :(得分:0)
我几乎不知道这是什么意思,但是使用数组的中间步骤可以加快速度
Public Sub Form_Load2()
Const n As Long = 500, n2 As Long = 200
Dim Output As String
Dim i As Long, i2 As Long
ReDim vals(1 To n2) As String
For i = 1 To n
For i2 = 1 To n2
vals(i2) = i * i2
Next
Output = Output & Join(vals, "")
Next
Debug.Print Output
End Sub
将i
和i2
分别限制为500和200,这几乎是瞬时的
由您自己决定尝试更大的电话号码,但我建议您少走一步。
答案 1 :(得分:0)
这将比@DisplayName提供的解决方案快一点
Public Sub Form_Load()
Const I_MAX As Long = 990
Const I2_MAX As Long = 990
Dim Output As String
Dim i As Long
Dim i2 As Long
Dim lCount As Long
Dim arr As Variant
lCount = 0
ReDim arr(I_MAX * I2_MAX)
For i = 1 To I_MAX
For i2 = 1 To I2_MAX
arr(lCount) = i * i2
lCount = lCount + 1
Next
Next
Output = Join(arr, vbNullString)
Debug.Print Output
End Sub
答案 2 :(得分:0)
您的问题是,您要重新分配数百万兆的内存。在一半的时候,您的代码每次都会通过内部循环将5.7 MB从一个内存位置复制到另一个内存位置。整个程序总共关闭了5,700 GB。
规则是将小字符串连接在一起,然后在串联结束时将小字符串连接在一起。要使较小的字符串不超过4000个字节,请在最后加入这些文件。
现代语言中有一个字符串生成器对象,VBA也有一个,它就是这样。
在VBA中,有Mid
函数和Mid
语句。他们做相反的事情。因此,您首先要创建最终的字符串。然后使用Mid
语句将子字符串弹出到第一个字符串中。这样可以避免所有数百兆的混洗。使用Rtrim
结束所有多余的空格。如果将输出缩小到600万个空格,则它将适合您的示例,并使用大约12 MB的容量,而使用数千GB的容量。
这是一个小例子。
Private Sub Form_Load()
OutPut = Space(1500)
For x = 1 To 500
Offset = Offset + Len(CStr(x))
Mid(OutPut, Offset) = CStr(x)
Next
MsgBox OutPut
End Sub