После запуска моделирования с 100 000 итераций я попытался сбросить значения с каждой итерации в столбец. Вот суть кода:Лучшее решение для ограничения длины массива VBA Transpose?
Sub test()
Application.ScreenUpdating = False
Dim totalgoals() As Variant, ko As Worksheet, out As Worksheet, iter As Long
Set ko = Sheets("KO Sim")
Set out = Sheets("Monte Carlo")
iter = out.Range("P2").Value
For i = 1 To iter
ko.Calculate
If i = 1 Then
ReDim totalgoals(1 To 1, 1 To 1) As Variant
totalgoals(1, 1) = ko.Range("F23").Value
Else
ReDim Preserve totalgoals(1 To 1, 1 To i) As Variant
totalgoals(1, i) = ko.Range("F23").Value
End If
Next i
out.Range("U1:U" & iter) = Application.WorksheetFunction.Transpose(totalgoals)
Application.ScreenUpdating = True
End Sub
Это вызывает ошибку типа несовпадение на предпоследней строке, потому что Transpose
может обрабатывать только массивы длиной до 2^16 (~ 64000). Итак, как мне это решить? Каков мой самый эффективный вариант?
Я установил свой код для хранения значений в массиве только для простого вывода, но, похоже, это не будет работать для этих многих значений. Будет ли я лучше придерживаться массивов и просто написать свою собственную функцию транспонирования (т. Е. Перебрать массив и записать значения в новый массив), или мне будет лучше работать с другим классом с самого начала, например, с коллекцией , если мне все равно придется все время кончать результаты?
Или еще лучше, есть ли все это, чтобы сделать это без, чтобы снова перевернуть значения?
EDIT:
я предоставил плохой пример, потому что ReDim Preserve
звонки были не нужны. Итак, рассмотрите следующее, где они необходимы.
ReDim totalgoals(1 To 1, 1 To 1) As Variant
For i = 1 To iter
ko.Calculate
If ko.Range("F23") > 100 Then
If totalgoals(1, 1) = Empty Then
totalgoals(1, 1) = ko.Range("F23").Value
Else
ReDim Preserve totalgoals(1 To 1, 1 To UBound(totalgoals, 2) + 1) As Variant
totalgoals(1, UBound(totalgoals, 2)) = ko.Range("F23").Value
End If
End If
Next i
out.Range("U1").Resize(UBound(totalgoals, 2),1) = Application.WorksheetFunction.Transpose(totalgoals)
Транспонирование сами в VBA. – RBarryYoung
Кроме того, цикл в VBA довольно быстро. Взаимодействие с Excel из VBA - нет. Так что, пока вы просто делаете вещи VBA, повторная петля не должна быть проблемой. – RBarryYoung