2016-10-02 69 views
0

我想在VBA中使用數組創建引導程序,但它不工作。我有兩股,在列B和C的數據的數據集:Bootstrap,Arrays,Large dataset,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 

我需要選擇從列C中隨機萬次,取單元格D1的平均和顯示。接下來,生成隨機D2 10000次和顯示器等類似的E1,E2,...,恩,但基於列的數據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

您好,感謝的快速反應。我明白,這是不明確的,道歉。但是,你明白我想要什麼。我在B和C列股票價格上有超過6,500行的數據。我想用重新採樣技術生成一個類似的數據集,即6,500行。你的代碼沒有運行在我的電腦上,拋出「內存不足」的錯誤,並且在我將10000修改爲1000之後,花費了7秒來生成兩個數據單元。我想使用重新採樣生成數據以填充範圍(「D1:E6500」)。想知道,如果這個代碼對此有效嗎?再次感謝。 – VictorD

+0

請更詳細地描述需要的計算。報告錯誤時總是指定將哪一行拋出。 – user3598756