【问题标题】:Excel VBA - copy/paste rowsExcel VBA - 复制/粘贴行
【发布时间】:2018-12-19 19:26:18
【问题描述】:

我希望将由单元格 A1:G1 上的单行组成的范围读入一个有 10 行的数组,然后在单元格 A2:G11 的同一张表上输出结果。输入行中的数据会根据包含随机数的公式而变化。有人告诉我,最快的方法是使用数组。不知道该怎么做。到目前为止,我的代码如下所示。这不起作用,因为它在将输入数据粘贴到输出单元格之前不会重新计算输入数据,因此它会一遍又一遍地粘贴相同的值。解决这个问题的最佳方法是什么?

Sub MyRange()
Dim DataInput As Variant
Dim NumberOfSims As Long, i As Long

Application.Calculation = xlManual
NumberOfSims = 10

DataInput = Range("DataInput").Value

For i = 1 To NumberOfSims
    Range(Cells(1 + i, "A"), Cells(1 + i, "g")).Value = DataInput
    Application.Calculate
Next i

End Sub 

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    DataInput 永远不会改变,因为DataInput = Range("DataInput").Value 在循环之外,所以相同的值会被一遍又一遍地粘贴。

    将它移到里面,它会随着每次迭代而更新。

    Sub MyRange()
        Dim DataInput As Variant
        Dim NumberOfSims As Long, i As Long
    
        Application.Calculation = xlManual
        NumberOfSims = 10
    
        For i = 1 To NumberOfSims
            DataInput = Range("DataInput").Value
            Range(Cells(1 + i, "A"), Cells(1 + i, "G")).Value = DataInput
            Application.Calculate
        Next i
    
    End Sub
    

    您可以完全避免使用数组而只传输值:

    For i = 1 To NumberOfSims
        Range(Cells(1 + i, "A"), Cells(1 + i, "G")).Value = Range("DataInput").Value
        Application.Calculate
    Next i
    

    编辑:

    您可以将公式读入一个数组,Evaluate 它们,然后一次全部写回工作表,而不是不断地重新计算和重新读取工作表。

    大概是这样的:

    Sub MyRange()
        Dim NumberOfSims As Long, NumberOfCols As Long
    
        NumberOfSims = 5000
        NumberOfCols = Range("DataInput").Columns.Count
    
        Dim InputFormulas() As Variant
        InputFormulas = Range("DataInput").Formula
    
        Dim OutputValues() As Variant
        ReDim OutputValues(1 To NumberOfSims, 1 To NumberOfCols)
    
        Dim R As Long, C As Long
    
        For R = 1 To UBound(OutputValues, 1)
            For C = 1 To UBound(OutputValues, 2)
                OutputValues(R, C) = Application.Evaluate(InputFormulas(1, C))
            Next C
        Next R
    
        Range("A2").Resize(UBound(OutputValues, 1), UBound(OutputValues, 2)).Value = OutputValues
    End Sub
    

    【讨论】:

    • 'Application.Calculation = xlAutomatic' 在最后?
    • 行得通!谢谢。如果迭代次数很大(比如超过 5,000 次),这需要一段时间才能运行。有没有办法使用数组来加快速度?
    • 这只是 RAND()。实际上,它将从另一个页面上使用随机数生成器的公式中提取。但这将作为一个测试。
    • 查看编辑。它要快得多,因为它只从工作表中读取一次,向工作表写入一次。
    • 这就是票。正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多