什么可能会减慢我的Excel VBAmacros?

这个函数遍历所有整数,只用五个二进制值来选取二进制值,并写入电子表格。

运行这个For x = 1 To 134217728将需要2.5天! 帮帮我!

我怎么能加快速度?

 Function D2B(ByVal n As Long) As String n = Abs(n) D2B = "" Do While n > 0 If n = (n \ 2) * 2 Then D2B = "0" & D2B Else D2B = "1" & D2B n = n - 1 End If n = n / 2 Loop End Function Sub mixtures() Dim x As Long Dim y As Integer Dim fill As String Dim mask As String Dim RowOffset As Integer Dim t As Date t = Now fill = "" For x = 1 To 134217728 mask = Right(fill & CStr(D2B(x)), Len(fill & CStr(D2B(x)))) Debug.Print mask If x > 100000 Then Exit For If Len(mask) - Len(WorksheetFunction.Substitute(mask, "1", "")) = 5 Then _ RowOffset = RowOffset + 1 For y = 1 To Len(mask) If Len(mask) - Len(WorksheetFunction.Substitute(mask, "1", "")) = 5 Then _ Range("mix").Offset(RowOffset).Cells(y) = Mid(mask, y, 1) Next Next Debug.Print DateDiff("s", Now, t) End Sub 

通过一见钟情,我认为问题在于你逐个单元地执行,这导致许多读写访问。

你应该按范围来做,例如

 vArr = Range("A1:C1000").Value ' it is array now, do something here effeciently Range("A1:C1000").Value = vArr 

你想find所有的28位数字与5 1

有28 * 27 * 26 * 25 * 24/5/4/3/2 = 98280这样的数字

下面的代码在我的电脑上花了大约10秒钟:

 lineno = 1 For b1 = 0 To 27 For b2 = b1 + 1 To 27 For b3 = b2 + 1 To 27 For b4 = b3 + 1 To 27 For b5 = b4 + 1 To 27 Cells(lineno, 1) = 2 ^ b1 + 2 ^ b2 + 2 ^ b3 + 2 ^ b4 + 2 ^ b5 lineno = lineno + 1 Next Next Next Next Next 
 mask = Right(fill & CStr(D2B(x)), Len(fill & CStr(D2B(x)))) 

上面的代码行执行相同的操作( CStr(D2B(x)) )两次。
CStr(D2B(x))的结果存储在一个variables中,并在上面的代码行中使用该variables。

我有两个build议:

  • 通过计算D2B中的一个/零来摆脱替代命令,如果计数不等于5,则返回一个空string
  • 将这些预先过滤的位串首先写入数组,然后在完成时将数组直接复制到单元格中。

就像是

 ws.Range(ws.cells(1, 1), ws.cells(UBound(dstArr, 1) + 1, UBound(dstArr, 2) + 1)) = dstArr 

array-copy-trick大大提高了性能!