Excel-最快的宏生成数据集

时间:2018-06-29 07:53:38

标签: excel vba excel-vba dataset simulation

我有一个具有以下内容的Excel文件:

  • 在第一个工作表中进行几次计算
  • 第二个工作表,其中所有相关数据都放在一行中(A2:W2)
  • 第三张工作表,我在其中收集来自每次仿真/计算的数据到新行中(=创建100K仿真的数据集)

我现在拥有的宏可以解决问题,但是复制的行越多,速度就越慢。我正在寻找一种方法,以使其尽可能干净和快速。 唯一需要做的是:从第二个工作表的数据范围复制到第三个工作表的第一个空闲行,生成新数据,复制数据,将数据粘贴到第一个空闲行,...。

我现在拥有的宏用于10K模拟,但是如果我尝试一次运行生成100K以上的数据集,则它的速度会大大降低。

感谢帮助/建议/提示。请记住,我是这个菜鸟:(

Sub Plus10000()
    '
    ' Plus10000 Macro
    '
    Application.ScreenUpdating = False
    Let x = 0
    Do While x < 10000
        Range("SourceData").Copy

        Sheets("Data").Range("B" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
        x = x + 1
    Loop
    Application.ScreenUpdating = True
    '
End Sub

3 个答案:

答案 0 :(得分:0)

您逐行复制和粘贴,这非常慢,因为每个粘贴操作都需要花费大量时间。但是您可以多次复制并粘贴一个动作。

Sub Plus10000()
    '
    ' Plus10000 Macro
    '
    Application.ScreenUpdating = False

    Range("SourceData").Copy
    Sheets("Data").Range("B1:B10000").PasteSpecial xlPasteValues

    Application.ScreenUpdating = True
    '
End Sub

这会将您的来源范围从第1行粘贴到10000。

答案 1 :(得分:0)

要做的第一件事就是避免使用CLIPBOARD!

如果程序运行1个小时,并且您同时要执行其他操作,则当用户或其他程序手动更改剪贴板时,Excel宏肯定会崩溃。

解决您问题的唯一方法是编写一个完整的宏来生成数据,而无需使用中间表,不使用Cell的公式以及不使用剪贴板!

答案 2 :(得分:0)

您可以尝试在每次迭代时都不写工作表单元格:

Sub Plus10000()
    Const nData As Long = 10000 ' set the number of calculations to be done

    ReDim data(1 To nData, 1 To Range("SourceData").Columns.Count) As Variant ' size you data array to mathc the number of calculations and "source" range

    Dim i As Long, j As Long
    Application.ScreenUpdating = False
    Do While i < nData
        i = i + 1
        Calculate ' have Excel make a new calculation of your workbook formulas
        For j = 1 To UBound(data, 2) ' fill your data current row with "Source" range current values
            data(i, j) = Range("SourceData").Cells(1, j)
        Next
    Loop
    Application.Calculation = xlCalculationManual ' prevent formula recalculation at subsequent "Data" sheet writing
    Sheets("Data").Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Resize(UBound(data), UBound(data, 2)).Value = data ' fill "data" sheet with data array values in one shot
    Application.Calculation = xlCalculationAutomatic ' set Excel automatic calculation back on
    Application.ScreenUpdating = True
End Sub