VBA可以执行的操作数量是否有限制?

时间:2016-10-26 15:52:35

标签: excel vba excel-vba

受到我在网上看到的puzzle的启发,自从我成为VBA新手以来,我认为这可能是一个有趣的练习,可以帮助我学习如何使用For循环force方法来搜索它的解决方案。

这导致创造了一个怪物,需要很长时间才能部分运行并且实际上根本没有完全运行。 所有代码的目的都是打印3列有效组合

Private Sub CommandButton1_Click()
Dim j As Long
Dim abc As String
Dim def As String
Dim ghi As String

j = 1

   For a = 1 To 9
    For b = 1 To 9
     For c = 1 To 9
      For d = 1 To 9
       For e = 1 To 9
        For f = 1 To 9
         For g = 1 To 9
          For h = 1 To 9
           For i = 1 To 9
'Line breaks included for ease of reading
            If a = b Or a = c Or a = d Or a = e Or a = f Or a = g Or a = h Or a = i 
            Or b = c Or b = d Or b = e Or b = f Or b = g Or b = h Or b = i 
            Or c = d Or c = e Or c = f Or c = g Or c = h Or c = i 
            Or d = e Or d = f Or d = g Or d = h Or d = i 
            Or e = f Or e = g Or e = h Or e = i 
            Or f = g Or f = h Or f = i 
            Or g = h Or g = i 
            Or h = i Then

           Else
           abc = a & b & c
           def = d & e & f
           ghi = g & h & i

           ThisWorkbook.Sheets("Sheet1").Cells(j, 1).Value = abc
           ThisWorkbook.Sheets("Sheet1").Cells(j, 2).Value = def
           ThisWorkbook.Sheets("Sheet1").Cells(j, 3).Value = ghi

           j = j + 1
           End If

         Next i
        Next h
       Next g
      Next f
     Next e
    Next d
   Next c
  Next b
 Next a
End Sub

这显然涉及许多简单的操作,并导致各种(无响应)消息或它不会运行。在点击" Go"之前是否可以说出来?情况会是这样吗?

我的工作让我继续工作,并在其他电子表格上进行大量操作的电子表格,每个电子表格中可以包含数十万个数据项目。继续为这些文件添加功能可能是可持续的,也可能是不可持续的,我需要知道如何在我将时间投入到进一步开发之前。

在数量/运营数量方面,VBA可以做些什么?是否有工具可以估计实际运行完成的宏的可行性?工业中常用的启发式算法?

基本上,有哪些方法或工具可以告知宏或一系列宏的需求是否超过可用内存?

由于

2 个答案:

答案 0 :(得分:1)

在开始之前,你应该尝试做一些数学运算。

您的代码会生成9个一次9个内容的所有排列。在开始之前,您知道这将填充 362880 行;所以代码应该可以工作。

另一个问题是它需要多长时间,这是最有效的方法。

答案 1 :(得分:0)

不是答案,但可以通过循环数字来解决吗?沿着这些方向的东西,是检查第一个字符对其余的

Dim l As Long
Dim i As Integer

For l = 11111111 To 99999999
    For i = 2 To 8
        DoEvents
        If (Mid(l, i, 1) <> Mid(l, 1, 1)) Then
            Debug.Print l
        End If
    Next i
Next l