Visual Basic主题

时间:2018-12-24 09:03:26

标签: vba loops for-loop optimization vb6

此职位的我想要的标题: 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循环非常慢,在极端情况下要花几个小时才能执行。有什么技巧可以优化我的代码?

3 个答案:

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

ii2分别限制为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

请参见Pointers needed for speeding up nested loop macro in VBA