2016-10-02 6 views
0

Я пытаюсь создать бутстрап в VBA с использованием массивов, и он не работает. У меня есть набор данных двух акций с данными в колонках В и С:Bootstrap, массивы, большой набор данных, vba

16/08/2016 79.84 70.87 
15/08/2016 80.26 71.79 
12/08/2016 80.22 71.7 
11/08/2016 80.56 71.98 
10/08/2016 80.55 71.21 
09/08/2016 81.5 73.05 
08/08/2016 81.6 72.25 
05/11/1990 17.5625 6.4011 
02/11/1990 17.0938 6.4358 
01/11/1990 17  6.5137 
31/10/1990 16.8438 6.583 
30/10/1990 17.3438 6.4444 
29/10/1990 17.7813 6.3232 

мне нужно выбрать случайным образом 10000 раз из колонки C, взять среднее и отображение в ячейке D1. Затем генерируйте случайные 10 000 раз и показывайте в D2 и т. Д. Аналогично для E1, E2, ..., En, но на основе данных в столбце C.

Поскольку наборы данных являются большими с двумя или более запасами и методологией требует много запусков, простая печать среднего значения каждый раз в каждую ячейку занимает очень много времени. Поэтому мне нужно использовать массивы, и я не понимаю. Я могу сделать это «вручную», но я уверен, что есть лучший способ.

Приведенный ниже код требует много времени для работы на моем компьютере, так как он печатает в электронной таблице каждый раз. Я знаю, что сохраняю симулированные значения в массиве simval() при запуске, но затем он удаляется при Redim. В идеале я хочу поднять данные в массив, имитировать новый дистрибутив и распечатать результаты рядом с исходными данными.

Sub bstrap() 
Dim miRange As Range 
Dim avgsimvals() As Double, simval() As Double 
Dim start As Double, secs As Double 
start = Timer 
r = Range("A1").CurrentRegion.Rows.Count 
c = 4 
Set miRange = Range(Cells(1, 2), Cells(r, 2)) 
For j = 1 To 100 '100 runs takes over 90 secs, approx 2.5 hrs for 10,000 
     ReDim simval(1 To r) 
     For i = 1 To r 
      simval(i) = WorksheetFunction.Index(miRange, r * Rnd() + 1) 
      Cells(i, c).Value = simval(i) 
     Next i 
c = c + 1 
Next j 

secs = Round(Timer - start, 6) 
MsgBox "run in " & secs, vbInformation 

End Sub 

ответ

0

использовать массивы

ваш рассказ не так ясно для меня, как для вашей точной цели, но вы можете начать с этого:

Option Explicit 

Sub bstrap2() 
    Dim start As Double 
    Dim dataSet As Variant 

    start = Timer 
    With Worksheets("Boostrap") 
     dataSet = Application.Transpose(.Range("B1:B" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value) 
     Range("D1") = GetRandomizedAverage(dataSet, 10000) 

     dataSet = Application.Transpose(.Range("C1:C" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value) 
     Range("E1") = GetRandomizedAverage(dataSet, 10000) 
    End With 

    MsgBox "run in " & Round(Timer - start, 6), vbInformation 
End Sub 

Function GetRandomizedAverage(dataSet As Variant, repetitions As Long) As Double 
    Dim i As Long, j As Long, r As Long 

    r = UBound(dataSet) 
    ReDim simval(1 To repetitions, 1 To r) 

    For j = 1 To repetitions 
     For i = 1 To r 
      simval(j, i) = dataSet(Int(r * Rnd() + 1)) 
     Next i 
    Next j 
    GetRandomizedAverage = WorksheetFunction.Average(simval) 
End Function 
+0

Привет, спасибо за быстрый ответ. Я понимаю, что это не ясно, извиниться за это. Однако вы поняли, чего я хочу. У меня более 6500 строк данных в столбцах B и C, цены на акции. Я хочу создать аналогичный набор данных, то есть 6500 строк, используя метод повторной выборки. Ваш код не работает на моем ПК, выбросив ошибку «из памяти» и после того, как я внес 10000 до 1000, потребовалось 7 секунд для создания двух ячеек данных. Я хочу генерировать данные с использованием повторной выборки для заполнения диапазона («D1: E6500»). Интересно, будет ли этот код эффективным для этой цели? Еще раз спасибо. – VictorD

+0

Просьба описать необходимые вычисления. И когда сообщения об ошибках всегда указывают, какая строка их бросает. – user3598756