使用 Do While 循环将值打印到工作表,而不是使用立即 window

Print values to worksheet with Do While loop rather than using Immediate window

我了解到 "Immediate window" 最多只能打印 199 行值。有没有一种简单的方法可以将下面算法生成的值打印到工作表单元格中?具体来说,我不确定 do while loop 是否是执行此操作的最有效方法。我通常处理工作表上已经存在的数据,我只是将循环指定为 运行 直到数据的最后一行。由于最外层循环 运行 来自 t=2 to 50,我不太确定如何将最内层循环格式化为 运行,直到算法生成所有可能的值。正如所写的那样,宏花费了很长时间,以至于我没有等到它停止。该算法最多不应生成超过一千行数据。

For t = 2 To 50
    For b = 2 To 20
        For r = 1 To 20
            For k = 3 To 7
                If t * k = b * k Then
                lambda = r * (k - 1) / (t - 1)
                    If lambda = Int(lambda) Then
                        Do While t < 51
                        Cells(i, 1) = t
                        Cells(i, 2) = b
                        Cells(i, 3) = k
                        Cells(i, 4) = r
                        Cells(i, 5) = lambda
                        Debug.Print t, b, k, r, lambda
                        i = i + 1
                        Loop
                    End If
                End If
            Next k
        Next r
    Next b
Next t

忽略非退出循环问题,这样会更快:

Do While t < 51
    Cells(i, 1).Resize(1, 5).Value = Array(t, b, k, r, lambda)
    i = i + 1
Loop

如果您需要更快的速度,则声明一个二维数组 arr(1 to [max # of rows], 1 to 5),将其填充到循环中,然后将其放到工作表中:

 Range("a1").Resize([max # of rows],5).Value = arr

正如 Tim 和我所说的那样,不需要 do 循环,它会永远持续下去。因此,您需要指定行,然后让它迭代,而不是循环。

For t = 2 To 50
    For b = 2 To 20
        For r = 1 To 20
            For k = 3 To 7
                If t * k = b * k Then
                lambda = r * (k - 1) / (t - 1)
                    If lambda = Int(lambda) Then
                        I = Range("A" & Rows.count).End(xlUp).Offset(1).Row
                        Cells(I, 1) = t
                        Cells(I, 2) = b
                        Cells(I, 3) = k
                        Cells(I, 4) = r
                        Cells(I, 5) = lambda
                        'Debug.Print t, b, k, r, lambda
                        'I = I + 1

                    End If
                End If
            Next k
        Next r
    Next b
Next t