|
||
解説: いくつかマクロを作ってきましたが、これから作る上で、処理の効率化といいますか、気づいた点を改良しておきます。 いままではサンプルファイルの関係で最終行は 30 で固定していました。いろいろなデータを扱っていくと最終行はその都度違うので調べる必要があります。またデータが増えてくると描画の関係や再計算など、処理時間に関わる部分も考えた方が良さそうです。おかしなデータがセルに入っている場合や例外処理など……と、考えてくると C++Builder でアプリを作るのとまったく同じになってきます。 ちょっと考えただけでも、 ・マクロ実行確認のメッセージを表示。 ・処理中の描画を制御する。 ・最終行を調べる。 ・シートのクリーンアップ。 ・代入する列に見出しをつける。 ・列幅の最適化。 ・色付け。 ・繰り返し使うコードの関数化。 ・期限を指定(5 日 SMA など)できるように引数付きプロシージャにする。 などなど、思い浮かびます。 あまりプログラミングの範囲を広げすぎても煩雑なので(C++Builder がメインのサイトなので VBA は補助的な記述にとどめておきます)、作成したマクロは正常に動くと仮定して、まず考えておきたい点だけを改良していくことにします。 サンプルコード: ・マクロ実行確認のメッセージを表示 マクロを実行して良いのかどうか確認します。MsgBox を使った方法はいろいろなところで役立ちます。メッセージ、アイコンなどが表示され、C++Builder の MessageBox と同じ感じです。 msg = "SMA(単純移動平均線)を算出しますか? " Response = MsgBox(msg, vbYesNo + vbQuestion + vbDefaultButton2, "確認") ・処理中の描画を制御 処理の最中、画面の再描画を停止し、ちらつきや遅くなるのを防ぎます。処理が終了した時、描画を再開します。C++Builderで BeginUpdate を呼び出して変更を加え、変更完了後 EndUpdate を呼び出す処理方法に似ています。 Application.ScreenUpdating = False ・最終行を調べる 指定した列の一番最後の行番号(空白行の手前まで)を取得します。 lastrow = Range("E4").End(xlDown).Row 使用例: 以上のコードを Macro2 に追加して、Macro3 を作成してみます。 Sub Macro3() Dim i As Integer Dim endrow As Integer Dim ret As Variant Dim msg As String Dim days As Integer ' メッセージを表示 msg = "SMA(単純移動平均線)を算出しますか? " ret = MsgBox(msg, vbYesNo + vbQuestion + vbDefaultButton2, "確認") '実行しない If ret = vbNo Then Exit Sub End If '画面の描画を停止 Application.ScreenUpdating = False '終値列の一番最後の行番号(空白行の手前まで)を取得 endrow = Range("E4").End(xlDown).Row '5 日 SMA(データ期間。本来は引数などで取得) days = 5 For i = 4 To endrow - days + 1 '=AVERAGE(E4:E8) Cells(i, 10) = WorksheetFunction.Average(Range(Cells(i, 5), Cells(i + days - 1, 5))) '=IF(E4>G4,1,-1) If Cells(i, 5) > Cells(i, 7) Then Cells(i, 11) = 1 Else Cells(i, 11) = -1 End If Next 'セルの形式を整える Range(Cells(4, 10), Cells(endrow - days + 1, 10)).NumberFormatLocal = "0" '画面の描画を再開 Application.ScreenUpdating = False End Sub その他気づいたところがあれば、改良してみてください。 |