Excel VBA - копировать / вставлять строки - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу прочитать диапазон, состоящий из одной строки в ячейках 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 

1 Ответ

0 голосов
/ 19 декабря 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...