2016-10-02 8 views
0

VBAでブートストラップを作成しようとしていますが、これは動作しません。私は、列BおよびCのデータを有する2社の株式のデータセットを有する:ブートストラップ、配列、大きなデータセット、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 

IがセルD1に平均及びディスプレイを取り、列Cからランダムに1万回を選択する必要があります。 E1、E2、...、Enと同様ですが、C列のデータに基づいています。

データセットが2つ以上のストックと方法論で大きく多数の実行が必要であり、各セルに毎回平均の簡単な印刷が非常に長い時間を要する。だから私は配列を使用する必要があり、私はそれを取得していません。 私はそれを "手動で"行うことができますが、より良い方法があると確信しています。

次のコードは、毎回スプレッドシートに印刷されるため、私のマシンで実行するのに時間がかかります。私は実行時に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行を生成したいと思います。あなたのコードは私のPC上で実行されておらず、「メモリ不足」というエラーが表示され、10000を1000に修正した後、2セルのデータを生成するのに7秒かかりました。 Range( "D1:E6500")にデータを取り込むためにリサンプリングを使用してデータを生成したいとします。このコードがこの目的のために効率的であるかどうか、不思議に思いますか?再度、感謝します。 – VictorD

+0

必要な計算についてもっと説明してください。また、エラーを報告するときに、いつそれらをスローするかを指定します。 – user3598756

関連する問題