前回は、JSON形式データ取得後のExcelシート上にデータを表示する配列処理のプログラムについてお伝えします。
前回までのプログラムはこちら↓
第1回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA
第2回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA
今回は前回のプログラムの改良版となります。前回はベースとなる時間足データ取得から3分足などの任意の時間足を集計するところまでセルに出さずに配列変数内で処理していましたが、それだと処理速度が遅くなってしまったため、今回は時間足データ取得後に一旦セルに出力し、worksheetfunctionを使用して集計し、集計結果をまたセルに出力したいと思います。
ちなみに、このプログラムは約70万行の1分足のOHLCVデータを約2分程度で取得して表示します。環境は私個人の普通のPCです。努力次第でまだ速くなるかもしれません。
それでは早速VBAコードを見てみましょう。
・VBAコード
流れとしては、取得したJSONデータをセルに出力し、配列変数に格納し集計してまたセルに出力します。
公式APIから公開されているベース時間足(1分足、5分足、1時間足、日足)だけでなく、それを利用して3分足、15分足、30分足、2時間足、週足などのデータを集計しています。
同じシートの同じ場所に集計したデータを出すため、シート上に出力したベース時間足を集計したデータを一旦配列に入れて、シート上にあるベース時間足削除して、配列をその場所に貼り付けるようにしています。
tmp1 = Split(CryptoJSON.t, ",")
tmp2 = Split(CryptoJSON.o, ",")
tmp3 = Split(CryptoJSON.h, ",")
tmp4 = Split(CryptoJSON.l, ",")
tmp5 = Split(CryptoJSON.c, ",")
tmp6 = Split(CryptoJSON.v, ",")
’ベース時間足
Range(Cells(1 + i * 10000, 12), Cells(i * 10000 + UBound(tmp1), 12)) = WorksheetFunction.Transpose(tmp1)
Range(Cells(1 + i * 10000, 7), Cells(i * 10000 + UBound(tmp2), 7)) = WorksheetFunction.Transpose(tmp2)
Range(Cells(1 + i * 10000, 8), Cells(i * 10000 + UBound(tmp3), 8)) = WorksheetFunction.Transpose(tmp3)
Range(Cells(1 + i * 10000, 9), Cells(i * 10000 + UBound(tmp4), 9)) = WorksheetFunction.Transpose(tmp4)
Range(Cells(1 + i * 10000, 10), Cells(i * 10000 + UBound(tmp5), 10)) = WorksheetFunction.Transpose(tmp5)
Range(Cells(1 + i * 10000, 11), Cells(i * 10000 + UBound(tmp6), 11)) = WorksheetFunction.Transpose(tmp6)
i = i + 1
a = 0
Loop
’ここからベース時間足以外の時間足を集計
MaxRow = Cells(Rows.Count, 7).End(xlUp).Row
If binsize <> "1m" And binsize <> "5m" And binsize <> "1h" And binsize <> "1d" Then
For j = 0 To MaxRow - 1 Step stick
utm_arr(a) = Cells(1 + j, 12).Value
opn_arr(a) = Cells(1 + j, 7).Value
cls_arr(a) = Cells(1 + j, 10).Value
max_arr(a) = WorksheetFunction.max(Range(Cells(1 + j, 8), Cells(stick + j, 8)))
min_arr(a) = WorksheetFunction.min(Range(Cells(1 + j, 9), Cells(stick + j, 9)))
vol_arr(a) = WorksheetFunction.Sum(Range(Cells(1 + j, 11), Cells(stick + j, 11)))
a = a + 1
Next
For j = 0 To a - 1
Region(j + 1, 6) = utm_arr(j)
Region(j + 1, 1) = opn_arr(j)
Region(j + 1, 2) = max_arr(j)
Region(j + 1, 3) = min_arr(j)
Region(j + 1, 4) = cls_arr(j)
Region(j + 1, 5) = vol_arr(j)
Next
Range("G:T").Clear
Dim RowMax As Long
'1次元目の要素数を取得
RowMax = UBound(Region, 1) - LBound(Region, 1) + 1
'Rangeで開始セルから貼り付ける
Range("G1").Resize(RowMax, 6).Value = Region
Else: End If
このプログラムよりも良い記述の仕方があるかもしれません。今回は大量のデータを扱いますので、for文を1個追加しただけで速度が大分落ちてしまいます。そのためできるだけfor文を使用しないように一括処理を考えて記述しました。
WorksheetFunctionやRangeをうまく使えば、コードが少なくて済み、処理速度が向上します。前回の第2回のプログラムでは20、30分くらいかかる処理が今回のプログラムでは2,3分程度になりました。ポイントは一括処理をできるだけ増やすことです。
さて、次回はプログラムの最初から最後までの全体についてお伝えします。
次回に続く
第1回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA
第2回 仮想通貨取引所BitmexからOHLCVデータを取得するVBAプログラム -Excel VBA
他にもエクセルツールを作成しています!
どんなに小さな額でもチップをいただけると嬉しいです!
Donate BTC: 1LcULwCQPjxLGXdpEJkhNkPpqCwG5csasU
Donate LTC: LSXEG7tjeCCGWuzvf5eFvJUZM6Xpvsdc4f
当エクセルツールから表示される情報は、
内容の正確性、信頼性等を保証するものではありません。
これらの情報に基づいて被ったいかなる損害についても、当サイトは一切の責任を負いません。