エクセルVBAによるシステムトレードソフトの作り方

エクセルVBAを使ってトレードシステムを自動構築するツールを無料で配布しています。複数の相場データに対して複数の手法を連続的に自動で検証できます。FX、先物、個別株なんでも使えます。ファイルのダウンロードはこちらから。ファイルを使いこなすことで得られるメリットはこちらで解説してます。

カテゴリ: 第3章 システムトレードのためのExcelマクロ入門

自作のツールを作る際に使用するステートメントのパターンはそれほど多くありません。

 これらを理解してしまえば、それらを組み合わせることでいろんなツールを作れるようになることができます。
ここでは、ステートメントの種類を、セルの操作、グラフの操作、ブックの操作、その他便利なステートメントに分類して紹介していきます。

 ユーザー各自で自作のツールを構築する際には、この箇所を参照してプロシージャを組んでいただければ、「こういう作業をしたいんだけど、どうやって表現したら良いんだろう?」と悩む時間は格段に削減できると思います。
  ここは、読んで暗記する必要はないので、流し読みで「このような方法があるのか・・・」程度に理解し、実際にツールを構築したり、このツールのプロシージャを読み解く際に、辞書代わりに使用するなどしてください。

セルの操作
 ツールの構築で最も使われるのは、価格データやストラテジーが書き込まれるワークシート関数や、セル内の値などを選択、コピー、貼り付け、変数に代入、などする作業であると思われます。
それらの作業の中で使用するステートメントのパターンを順番に解説していきます。

絶対参照と相対参照
ワークシート関数と同じように、マクロでもセルの指定をするときには絶対参照と相対参照があります。

Sub テスト()
Range("A1:B4").Select
Range(Cells(1, 1), Cells(4, 2)).Select
End sub
 
この二つのステートメントで行われる作業は、下の画像のようになり、同じです。
 
しかしながら、「価格データが入っている最終行までの範囲を選択しろ」という命令を表現したいときには、後述する「データの入っている最終行を取得する」というプロシージャ内のステートメントを使って最終行の行数を変数に代入して、セル範囲を指定することになります。そのため、自作のツールを構築する際には、相対参照を主に使うことになると思われます。
 
セルにワークシート関数を書き込む

Sub テスト()
Range("A6").FormulaR1C1 = "=SUM(R[-5]C:R[-2]C)"
Range("A6").Formula = "=SUM(A1:A4)"
End sub

セルにワークシート関数を書き込む方法にも2種類あります。
上に紹介したステートメントを実行すると共に下の画面のように、セルA6にA1~A4の値を合計する関数が書き込まれます。


セルに値を書き込む

Sub テスト()
Range("C6").FormulaR1C1 = "1234"
Range("C6").Value = 1234
Cells(3, 6).Value = 1234
End sub

セルに値を書き込む方法にもいくつかのパターンがあります。
 
 自動記録で値を書き込むと、Formulaメソッドが記録されますが、値を書き込むのですからvalueを使用したほうがわかりやすいかもしれません。どれを実行しても下の画面のような同じ結果になります。どのような違いがあるかと言えば、せいぜい自分が作ったツールのプロシージャを他人に見せるときに、読みやすくなる、という程度でしょう。
 
セルにテキストを書き込む

Sub テスト()
Range("C8").Value = "実験"
Range("C8").Formula = "実験"
Cells(8, 3).Value = "実験"
End sub
 
セルにテキストを書き込む方法にもいくつかのパターンがあります。
値を書き込む場合と同様に、どれを実行しても下の画面のような同じ結果になります。
書き込む場所を変数で指定するような場合は、相対参照を使います。

位置の指定をしてペーストする

Sub テスト()
Range("A1:B4").Copy
Range("D1").Select
ActiveSheet.Paste
Range(Cells(1, 1), Cells(4, 2)).Copy
Cells(1, 4).Select
ActiveSheet.Paste
End sub
 
セルの内容をコピー&ペーストするには次のような方法があります。
値を書き込む場合と同様に、どれを実行しても下の画面のような同じ結果になります。
書き込む場所を変数で指定するような場合は、相対参照を使います。

シート上のすべての行を削除する

Sub テスト()
Sheets("sheet1").Rows("1:65536").Delete
End sub
シート上の全ての値、全てのワークシート関数を削除するには、このようなステートメントを使います。

指定した全ての行を削除する

Sub テスト()
Range(Cells(5, 1), Cells(65536, 1)).EntireRow.Delete
End sub
このステートメントは、検証シートに価格データを流し込んだあとに、流し込んだデータより下の行の全てを削除したい時などに使用します。

シート内のセルの値を別のシート内のセルに書き込む
 
Sub テスト()
Dim x As Long
x = Sheets("sheet1").Cells(1, 1).Value
Sheets("sheet2").Cells(1, 1).Value = x
End sub
 
このステートメントは、検証シートや評価シート上の変数や値を別のシートに貼り付ける際などに使用します。
一旦、シート上の値を変数に代入し、別シートに変数を書き込む、という方法をとっています。

データの入っている最終行の行数を取得する
 
Sub テスト()
Dim x As Long
x = Range("A65536").End(xlUp).Row
MsgBox x
End Sub
 
 これは、A列の一番下の行から上に遡って、データが入っている一番下のセルの行数を返します。おもに、価格データを流し込んだあとに、このステートメントで行数を変数に代入して、その行までワークシート関数をコピーしたり、余計な行を削除したりするのに使用されます。
 
↑この画像の例でいうと、データの入っている最終行は7行目になります8行目以下はブランクになっています(。

データの入っている最右列の列数を取得する

Sub テスト()
Dim x As Long
x = Range("IV1").End(xlToLeft).Column
MsgBox x
End Sub

 このステートメントは、データの入っている一番右の列の列数を返します。
 たとえば、下の画面の場合、データが入っている一番右の列はC列ですから、A列1列目(、B列2列目(、C列3列目(と数えていき、3という値を返します。

マクロでワークシート関数を使う

Sub テスト()
Dim ObjectR As Variant
ObjectR = Range(Cells(1, 1), Cells(4, 2))
Cells(3, 4).Formula = Application.WorksheetFunction.Max(ObjectR)
End Sub

 マクロを使ってワークシート上に関数を用いた計算結果を返すためのステートメントです。上のプロシージャではObjectRという変数にA1~B4という範囲を代入し、Application.WorksheetFunction.Maxに変数を代入することで、セルD3にA1~B4の範囲で最も大きな値を返します。
 
 なお、セルD3の中に書き込まれるのは「=MAX(A1:B4)」という関数ではなく、その結果となる値であることにご注意ください。
↑A1~B4の範囲の中の最大値が返っている。

オートフィルでデータの入っている最終行まで関数をコピーする

Sub テスト()
Range("B4").AutoFill Destination:=Range("B4", Range("A65536").End(xlUp).Offset(, 1))
End Sub

このステートメントは、検証シートなどにおいて、書き込まれたワークシート関数をデータが入っている最終行までコピーする際などに使われます。
Offset,1(というのは、A列から右に1列ずれた列でオートフィルを行うという意味です。画面の例では、B列なので、Offset,1(ですが、これがF列であった場合、Offset(,5)となります。
↑セルB4にワークシート関数を書き込む。
↑ステートメント実行後、セルB8までワークシート関数がコピーされた。

再計算を実行する

Sub テスト()
Calculate
End Sub

このステートメントの中ではランダムエントリーのテストの箇所で使用されています。
このステートメントを実行すると、ワークシート上のRAND関数は再計算され、違う値を返します。

↑B列にRAND関数を用いて計算された値が返されている。
↑再計算後、異なる値が返っている。
 
以上で、このツール内で使われているセル操作のステートメントは、98%は解説されたと思います。自作ツールを作る際には、これらのステートメントを組み合わせていくことになります。
 
グラフの操作
 
次にグラフのレイアウト、データ範囲指定などに使用されるステートメントを紹介します。
実は、グラフの仕様の指定を行うマクロは、最も面倒なもののひとつです。なぜならば、自動記録を使ってグラフのレイアウトを指定してもステートメントが記録されないのです。
このため、グラフの仕様を指定するためには、VBEのヘルプを参照したり、市販の書籍を購入するなどする必要があります。
 
なお、当方でグラフを操作するマクロを調べるのに、最も役に立った書籍は下記の書籍でしたので紹介しておきます。

2002/2003/2007対応 ExcelVBA辞典
著 者: E-Trainer.jp常見美保
定 価: 2,310円
発行所 秀和システム
 
データの範囲を指定しグラフを描画する
 
Sub テスト()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range(Cells(1, 1), Cells(5, 2))
ActiveChart.ChartType = xlLine
End Sub
 
このステートメントを用いれば、グラフの描画が可能です。
ActiveChart.SetSourceData Sourceは、グラフ化するデータの範囲。
ActiveChart.ChartType はグラフの種類棒グラフ、折れ線グラフ(の指定です。

グラフにグラフのタイトルを書き込む
ActiveChart.HasTitle = True
ActiveChart.ChartTitle.Text = "テスト"
前述のグラフ描画のプロシージャに上のステートメントを追加するとグラフにタイトルを追加できます。
 
グラフの凡例の位置を指定する
ActiveChart.Legend.Select
Selection.Position = xlTop
さらに上のステートメントを追加することで、グラフの凡例の位置を指定できます。
↑「系列」の解説の場所が変わりました。

埋め込みグラフを表示する位置を指定する
ActiveChart.Parent.Left = Worksheets("sheet1").Range("H1").Left
ActiveChart.Parent.Top = Worksheets("sheet1").Range("H1").Top
このステートメントは、グラフの表示位置を指定します。
セルH1をグラフの左上にして貼り付けるステートメントです。
↑グラフの左上の位置がセルH1になっている。
 
もし、ブック上にグラフシートがあれば削除する
If ActiveWorkbook.Charts.Count > 0 Then
ActiveWorkbook.Charts.Delete
End If
このステートメントは、ブック上にグラフシートがあれば、削除するステートメントです。もし、グラフシートが存在しないなら何も作業が行われません。

もし、シート上に埋め込みグラフがあれば削除する
If Sheets("sheet1").ChartObjects.Count > 0 Then
Sheets("sheet1").ChartObjects.Delete
End If
このステートメントは、シート上に埋め込みグラフが存在すれば削除するステートメントです。もし、グラフが存在しないなら何も作業が行われません。

グラフを画像として別のブックに貼り付ける
 
Sub テスト()
Windows("マクロ入門.xls").Activate
Sheets("sheet1").Select
ActiveSheet.Shapes(1).Cut
Windows("コピー先ブック.xls").Activate
Sheets("sheet1").Select
Sheets("sheet1").PasteSpecial Format:="図 (GIF)"
End Sub
 
これは、グラフをGIFブック化して、別のブックに貼り付けるステートメントです。
グラフをGIF化することで、コピー元のデータが変化してもグラフに影響が出なくなります。

ブックの操作
 
 ここで紹介するステートメントは、Excelブックを開いたり、ブックに名前を付けたり、ブックを閉じたり、といった作業で使用されるステートメントです。セルを操作し、グラフを操作して構築されたブックを保存したり、閉じたりすることができると、連続でブックを作成するときなどに便利です。

使用中のブックの所在を取得する
expath = ActiveWorkbook.Path & "\"

このステートメントは、現在アクティブになっているブックのパソコン内部における所在を返します。
例えば、「C:\Users\ユーザー名\Desktop\EXCEL-TRADINフォルダ」という形のものです。
これを使用すれば、後述するような「アクティブフォルダ内の○○というブックを開く、閉じる」といった命令を出すことが可能になります。
 
ブックを開いてアクティブにする
Workbooks.Open filename:=expath & "\databook.xls"
Windows("databook.xls").Activate
これは、アクティブなブックのあるフォルダ内にある「databook」というブックを開くステートメントです。
↑この画面の例でいうと、EXCEL-TRADINGがアクティブなブックであるとき、同じフォルダ内にある「databook」を開くことが可能になる。

フォルダを指定してブックを開く
Workbooks.Open filename:=expath & "\検証結果\一時ファイル.xls"
このステートメントはフォルダとブック名を指定してブックを開く、というものです。
ここでは、「アクティブなブックと同じフォルダ内にある「検証結果」というフォルダ内の「一時ファイル」というExcelブックを開け」という命令になっています。
 
ブック名に変数を入れて保存する
ActiveWorkbook.SaveAs filename:=expath & abc & xyz & ".xls"
このステートメントは、ブック名を指定してブックを保存するステートメントです。
この場合、変数abcに「日経225」というテキストが代入され、変数xyzに「トレンドフォロー」というテキストが代入されていた場合、アクティブなブック内に「日経225トレンドフォロー」というブック名で保存せよ、という命令になります。
 
ブック名を指定してブックを閉じる
Windows(abc & xyz & ".xls").Close
Windows("databook.xls").Close
このステートメントは、ブックを閉じるステートメントです。
変数abcが「日経225」で、変数xyzが「逆張り」であった場合、「日経225逆張り」というブックを閉じろ、という命令になります。
同様にブック名は、変数でなくても同じように使用できます。

制御構造
制御構造とは、「もし、XであればYをする」とか「Xという処理を回数Yだけ繰り返す」といったようなステートメントのことです。
 
作業を自動化するには必須の知識なので必ず押さえましょう。
 
条件分岐 IF~else ~end if
 
Sub テスト()
If Range("A1").Value = 1 Then
MsgBox "セルA1に値1が入っています。"
Else
MsgBox "セルA1に値1が入っていません。"
End If
End Sub
 
このステートメントは、セルA1に1が入っているならば、「セルA1に1が入っています」というメッセージを表示し、セルA1が1以外のものであれば、「セルA1に値1が入っていません」というメッセージを表示する、というステートメントです。
 
条件分岐 Select case
 
Sub テスト()
Select Case Range("A1").Value
Case Is = 1
MsgBox "セルA1の値は1です"
Case Is = 2
MsgBox "セルA1の値は2です"
Case Is = 3
MsgBox "セルA1の値は3です"
End Select
MsgBox "セルA1の値は1,2,3,以外の値です"
End Sub
 
このステートメントの意味は、「もし、セルA1の値が1なら『セルA1の値は1です』と表示し、も

しセルA1の値が2なら『セルA1の値は2です』と表示し、もしセルA1の値が3なら『セルA1の値は3です』と表示する。もしいずれでもなかったら、『セルA1の値は1,2,3以外の値です』というメッセージを表示する」ということです。

繰り返し処理 for next

Sub テスト3()
Dim x As Long
For x = 1 To 3
MsgBox x
Next
End Sub
 
このステートメントの意味は、「変数Xを1から3まで変化させ、forとnextの間の処理を行え」ということです。
つまり、このステートメントを実行すれば、メッセージボックスが連続して開き、それぞれ「1」、「2」、「3」と表示します。
このステートメントは主に、「移動平均線の算出日数を2日から20日まで変化させる」といったような最適化の処理を行わせる際に使用します。
 
その他、便利なステートメント
ここでは、今まで紹介したステートメントに加えて、ユーザーにとってツールを使いやすいものにするために便利なステートメントを紹介しようと思います。
別のプロシージャをサブルーチンとして呼び出す
 
Subテスト()
Call ENTRY_KINGKAERNTNER
Call SheetAdjust_test
Call SheetAdjust_paformance
End sub
 
プロシージャ内で呼び出されるプロシージャのことをサブルーチンと呼びます。
サブルーチンとして呼び出すことにより、ひとつのプロシージャを簡潔にして、デバックも行いやすくしたり、コードの可視性を高めることが可能です。
 
上の例では、「テスト」プロシージャを実行すると、「ENTRY_KINGKAERNTNER」、

「SheetAdjust_test」、「SheetAdjust_paformance」というプロシージャが順番に実行されることになります。
このように、プロシージャを相互に利用し合うことで複雑な作業を構築することが可能になるのです。
 
現在の時刻を変数に代入する
filename = Format(Now(), "yyyy年mm月dd日の検証結果hh時mm分ss秒に保存(")
このステートメントは、変数に現在の時刻を代入するステートメントです。
 
これを使用して、ブックの保存時などにブック名の一部に使用することで、あとでブックを確認する際に、そのブックがいつ保存されたのか一目で確認でき、また、作業中保存が頻繁に行われる際に、いちいちブック名を変えなくても、時間の経過によりブック名が変化するので、手間が省けます。
 
↑たくさんブックを保存する作業ではブック名の変更に手間がかかります。
デスクトップ上に表示するシートの位置を指定する
Application.Goto reference:=Sheets("検証シート").Cells(103, 18)
ActiveWindow.ScrollColumn = 13
ActiveWindow.ScrollRow = 90

このステートメントを使用すれば、プロシージャの処理が終了した際に、ウィンドウの位置を終了箇所へ移動する、といった命令が可能になります。
 
プロシージャの実行後に、作業が行われたシートに移動するのは面倒ですが、このステートメントを使用すれば、その手間が省けるようになります。
 
インプットボックスから変数を代入する
datasheet = InputBox("シート名を指定してください。例:「data1」")
インプットボックスを使用すれば、変数をキーボードから打ち込むことが可能です。
 
↑インプットボックス実行時の画面。このウィンドウに変数を書き込み、「OK」を押すことで、変数が代入される。
以上で、このツール内で使用されるステートメントの90%は解説されてしまったと思います。次はこれらを組み合わせることによって、どのようなことができるのか実験してみましょう。
 
5.ステートメントを組み合わせた例 その1
 
ブック「マクロ入門」のプロシージャ「ステートメントを組み合わせた例」を実行したときの画面をご覧になって下さい。

※このマクロを実行した結果の例セルD1の値によって結果が異なります
 
以下で紹介するマクロで行っているのは次のような作業です。
1. Sheet1セルD1の値の分だけA1から下に向かって数字を書き込んでいく
2. 数字が書き込まれている範囲を選択して、グラフを描く
 
では、コードの詳細を見てみましょう。
 
実際には、ゴシックのフォントで書き込まれているテキストは、プロシージャ内には書き込まれておりませんので、ご注意ください。
 
Sub ステートメントを組み合わせた例()
'変数の宣言
Dim x As Long
Dim y As Long
Dim lastrow As Long
※変数の宣言を行っています。変数は、行いたい作業の中で「ある値が1のとき、2のとき、3のとき・・・それぞれ結果はどうなるかを素早く計算したい」といったときに、値を変数として宣言し、繰り返しの計算に大変役立ちます。
 
'A列全体を削除する
Sheets("sheet1").Columns("A:A").Clear

※A列内のデータの削除を行うマクロです。実行前にすでにマクロが回っていた場合にデータが邪魔になる場合があるので、実行前に削除しておきます。
 
'ワークシート上の値をマクロの変数に代入する
y = Sheets("sheet1").Cells(1, 4).Value
 
※ワークシート上の値をマクロの変数に代入する場合、このような表現を用います。セル1.4(とは、つまり、セルD1のことです。セルD1に書き込まれている値の行数だけ、A列に数字が書き込まれます。
 
'ループ処理
For x = 1 To y
Cells(x, 1).Value = x
Next
 
※FOR NEXTを使った制御構造です。この意味は、Xの値を1からYの値セルD1の値(までひとつずつ増やしていけ、という命令です。例えば、Xが5のときには、セルCell5,1(つまり、セルA5(にXつまり、5(を書き込め、という命令になっています。
 
'A列にデータが入っている最終行の行数をlastrowに代入する
lastrow = Range("A65356").End(xlUp).Row
※このコードは、セルA65356つまり、A列の最終行から上にさかのぼって、最初にデータが入っているセルの行数をLastrowに代入しろ、という命令です。
 
'セルA1~データの入っている最終行までの範囲を選択する
Range(Cells(1, 1), Cells(lastrow, 1)).Select
※これはA1からデータの入っている最終行までの範囲を選択しろ、という命令です。
 
'選択範囲をグラフ化する
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range(Cells(1, 1), Cells(lastrow, 1))
ActiveChart.ChartType = xlLine

※この命令は、選択中の範囲をグラフ化せよ、という命令です。SetSourceData Sourceは、グラフ化するデータの範囲を指定しています。
 
'計算終了を知らせるメッセージを表示する
MsgBox "計算が終了しました"
 
※msgboxとは、ユーザーにメッセージを表示する命令です。すべての計算が終了した場所に書き込むことで、計算終了のメッセージとして機能します。
 
End Sub
 
となっています。
 
このようにマクロを読み解いてみると、プロシージャの上から下へ、と順番に作業すべき内容が書き込まれていることがおわかりいただけるかと思います。
 
6.ステートメントを組み合わせた例 その2
 
 プロシージャ「ステートメントを組み合わせた例その2」をご覧ください実際には、太いゴシックのフォントで書き込まれているテキストは、コード内には書き込まれておりませんので、ご注意ください。
 
この中になるweb上からデータをダウンロードするコードの箇所ですが、現在のところテーブルの番号が変化してうまく回らない現象を確認しています。おそらくサイトによっては、Htmlをランダムに変更させているのだと思われます。
 
ご自身でダウンロードしたいサイトとデータがある場合、マクロの記録→webクエリでコードを書いてください。
 
↑「ステートメントを組み合わせた例その2」の実行後に表示されるメッセージボックス。マクロをまわした時間がブック名になります。
 
Sub ステートメントを組み合わせた例その2()
Dim filename As String
filename = Format(Now(), "yyyy年mm月dd日の市況(hh時mm分ss秒に保存)")
Application.DisplayAlerts = False
※これは、マクロ実行中に「シートを削除する」などすると、「削除しますか?」というような確認のアラートが出るのをストップしておくためのステートメントです。これを書き込むことで、いちいち確認を入れずにパソコンを放置したままで作業を続けさせることができるようになります。
Application.ScreenUpdating = False
Windows("マクロ入門.xls").Activate
Sheets("Sheet1").Select
'A列~IV列の全体をクリアにする
Sheets("sheet1").Columns("A:IV").Clear
exPath = ActiveWorkbook.Path & "\"
※これは、アクティブなブックのブックの位置を変数に代入しています。これにより、「今ブックが置いてあるフォルダにブックをコピーしろ」といった命令が可能になります。
'WEBクエリを使ってYahooのサイトから、市況データをダウンロードする。
'yahooのページのレイアウトが変更されると、機能しなくなりますのでご了承ください。
With ActiveSheet.QueryTables.Add(Connection:="URL;http://quote.yahoo.co.jp", Destination:=Range("$A$1"))
中略(
End With
※このWEBクエリを使った箇所のコードはややこしいですが、このあたりは自動記録で記録されるので、細かく意味を理解する必要はありません。
'ダウンロードした市況をシート上で整理する。
Range("C1").Select
Selection.ClearContents
Columns("A:IV").Select
Selection.ColumnWidth = 10
Range("D1").Value = Date
Range("c1") = "前日比"
'セルC3の値(日経平均株価の前日比を表す値)によって、条件分岐で実行する作業を変える。
Select Case Range("C3").Value
※セルC3の値によって条件分岐して異なった処理をさせています。
Case Is > 0
'日経平均株価の前日比がプラスなら行う作業。
MsgBox "今日 " & Date & " 日経平均株価は値上がりしたので、市況をフォルダ「ステートメントを組み合わせた例その2」に保存します。"
※メッセージボックス内に「" & 変数 & “」を書き込むことで、そのとき代入されている変数を表示させることが可能です。
'ステートメントを組み合わせた例その2というフォルダ内の「一時ファイル」というExcel

ブックを開く
Workbooks.Open filename:=exPath & "\ステートメントを組み合わせた例その2\一時ファイル.xls"
※さきほど、代入したブックの位置を指定する変数を使って、「現在アクティブなブックのあるフォルダの中にあるステートメントを組み合わせた例その2というフォルダ内の一時ファイルという名前のブックを開け」という命令です。
'開いたブックにシートをコピーする
Windows("マクロ入門.xls").Activate
Sheets("Sheet1").Select
Sheets("Sheet1").Copy Before:=Workbooks("一時ファイル.xls").Sheets(1)
Sheets("Sheet1 (2)").Select
Sheets("Sheet1 (2)").Name = filename
exPath = ActiveWorkbook.Path & "\"
Sheets("Sheet1").Delete
Sheets("Sheet2").Delete
Sheets("Sheet3").Delete
'開いた「一時ファイル」のブック名を変更して保存する。
ActiveWorkbook.SaveAs filename:=exPath & (filename & ".xls")
ActiveWorkbook.Close
MsgBox "本日の市況を保存しました。ブック名は「" & filename & "」です。"
※同様に変数をメッセージに表示しています。
Case Is = ""
'WEBクエリによるダウンロードが失敗した際に行う作業
MsgBox "WEBクエリによる市況のダウンロードに失敗しました。もう一度実行してください。"
Case Is <= 0

'日経平均株価が値下がりした際に行う作業
MsgBox "今日 " & Date & " 日経平均株価は値上がりしませんでした。"
End Select
Range("a1").Select
End Sub
 
7.ステートメントを組み合わせた例その3

プロシージャ「ステートメントを組み合わせた例その3」をご覧ください実際には、太いゴシックのフォントで書き込まれているテキストは、コード内には書き込まれておりませんので、ご注意ください(。
↑「ステートメントを組み合わせた例その3」の実行後に表示されるメッセージボックス。ここで入力した値がサプルーチンへ渡されます。
 
Sub ステートメントを組み合わせた例その3()
Dim x As Long
Range("A1").Value = "1"
Range("A2").Value = "2"
Range("A3").Value = "3"
Range("A4").Value = "4"
Range("A5").Value = "5"
'「A1~A5」というセルの範囲を「対象範囲A」という変数に代入します。

対象範囲A = "A1:A5"
'対象範囲Aに対して、ワークシート関数を使い値を返します。
Range("B1").Value = Application.WorksheetFunction.Sum(Range(対象範囲A))
Range("B2").Value = Application.WorksheetFunction.Max(Range(対象範囲A))
Range("B3").Value = Application.WorksheetFunction.Average(Range(対象範囲A))
※対象範囲を変数に代入したら、その変数をワークシート関数の対象に書き込みます。マクロで使用できるワークシート関数の種類には、若干制限がありますが、セルの操作にはほとんど問題ないでしょう。
 
'「A1~A5」というセルの範囲を「対象範囲A」という変数に代入します。
'範囲の指定方法は上のステートメントと変えてあります。
 
対象範囲B = Range(Cells(1, 1), Cells(5, 1))
'対象範囲Bに対して、ワークシート関数を使い値を返します。
Range("C1").Value = Application.WorksheetFunction.Sum(対象範囲B)
Range("C2").Value = Application.WorksheetFunction.Max(対象範囲B)
Range("C3").Value = Application.WorksheetFunction.Average(対象範囲B)
 
'インプットボックから、yに代入する値を指定します。
x = InputBox("値を半角数字で入力してください。", "インプットボックスの実験", "初期値はここに書き込みます")
'「サブルーチン」というプロシージャを呼び出して実行します。
'その際に、変数xをサブルーチンへ渡します。
 
サブルーチン x
 
※このプロシージャ内に別のプロシージャ名を書き込むことにより、そのプロシージャをサブルーチンとして呼び出すことが可能になります。また、サブルーチンの横に変数xを書き込むことで、サブルーチンへ変数xを渡すことになります。
End Sub

Sub サブルーチン(x As Long)
'「ステートメントを組み合わせた例その3」からxの値を渡されたので、
'xの値を説明することなく、メッセージボックスで値を表示できます。
MsgBox "サブルーチンへの引き渡しが成功しました。引き渡した値は" & x & "です。"
※このメッセージボックスには、親プロシージャから渡された変数が表示されることになります。
End Sub
 
以上のように、プロシージャというのは、ひとつひとつの作業を指示するステートメントの集合であるということがわかると思います。
 
ここまで理解していただけたら、自分だけのトレードツールを作る、というときどのような手順で発想していったら良いかわかっていただけたと思います。

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

 マクロを使って自分だけのツールを作る際に、いちいちオブジェクトとメソッドを辞書でひきながら1行1行書いていくわけではありません。
 Excelに付属している自動記録という機能を使えば、プロパティやメソッドを調べなくても、自分でExcelを動かした動作を自動的に記録して、コードに書きだしてくれます。
 この自動記録をやってみましょう。

Excelのバージョンによって、操作方法が若干異なります。
Excel2003の場合、[ツール]→[マクロ]→[マクロの記録]
Excel2007の場合、メニューバー[表示]→[マクロ]→[マクロの記録]
という順序で記録を開始できます。
↑Excel2007の画面です。「OK」を押すと自動記録が開始されます。


ここでは、例として次のような作業をマクロに記録してみます。

作業手順は、
1. セルA1~A10まで1から10を順番に書き込む
2. セルB1に「=A1*2」と書き込み、セルB1のセルをB10までオートフィルでコピーする
3. A1~B10の範囲を選択し、グラフを描く
4. マクロの記録を終了する
以上を手作業で行ったあとの画面が下の画像です。

では、この作業を記録したマクロを見てみましょう。
フォルダ「付録ブック」内のブック「マクロ入門」を開いて、Alt+F11でVBEを起動し、プロシージャ内をご覧になって下さい。

Sub マクロの記録()
'
' マクロの記録 Macro
'
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "1"
53
Range("A2").Select
ActiveCell.FormulaR1C1 = "2"
Range("A3").Select
ActiveCell.FormulaR1C1 = "3"
Range("A4").Select
ActiveCell.FormulaR1C1 = "4"
Range("A5").Select
ActiveCell.FormulaR1C1 = "5"
Range("A6").Select
ActiveCell.FormulaR1C1 = "6"
Range("A7").Select
ActiveCell.FormulaR1C1 = "7"
Range("A8").Select
ActiveCell.FormulaR1C1 = "8"
Range("A9").Select
ActiveCell.FormulaR1C1 = "9"
Range("A10").Select
ActiveCell.FormulaR1C1 = "10"
Range("B1").Select
ActiveCell.FormulaR1C1 = "=2*RC[-1]"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B10")
Range("B1:B10").Select
Range("A1:B10").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$B$10")
ActiveChart.ChartType = xlLine
End Sub
というように記録されました。
 
Rangeオブジェクト、Selectメソッド、FormulaR1C1プロパティなどを用いられて記録されているのがわかります。オートフィルやグラフの描画など若干マクロが複雑で、ヘルプや辞書で調べようとすると手間がかかりますが、自動記録を用いることにより、簡単にコード化することができました。


自動記録は大変便利ですが、必要のないコードまでも記録されてしまうため、これを日々の作業に用いようとすると、少々作業が遅くなってしまうので、不要なコードを削除して軽くしてみましょう。

先ほどのマクロを次のように改造しました。「マクロの記録2」をご覧ください。

Sub マクロの記録2()
'
' マクロの記録2 Macro
'
'画面の更新を停止させる
Application.ScreenUpdating = False
Range("A1") = "1"
Range("A2") = "2"
Range("A3") = "3"
Range("A4") = "4"
Range("A5") = "5"
Range("A6") = "6"
Range("A7") = "7"
Range("A8") = "8"
Range("A9") = "9"
Range("A10") = "10"
Range("B1") = "=2*RC[-1]"
Range("B1").Select
Selection.AutoFill Destination:=Range("B1:B10")
Range("B1:B10").Select
Range("A1:B10").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$B$10")
ActiveChart.ChartType = xlLine
'画面の更新の停止を解除
55
Application.ScreenUpdating = True
End Sub
 
「Application.ScreenUpdating = False」を追加・・・これにより、画面の更新をストップさせることができ、計算が素早くなります。

余計なSelectメソッドの削除・・・自動記録のマクロでは、「セルを選択し、セル内に値を書き込む」というコードでしたが、修正後のマクロでは、Selectを使用せず直接セルに値を書き込むようにしました。

これらのコードは短いのでまだまだ速度の差が確認しづらいですが、ワークシートが複雑になったり、ループをさせる制御構造を使用したりするようになると、処理速度の差が顕著になってきます。

マクロの処理速度を高めるポイント

1.Selectメソッドの使用を控える。
2.「Application.ScreenUpdating = False」というステートメントを挿入する。

このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

ブック「マクロ入門」内にあるプロパティ「テスト1」をご覧ください。
 
Sub テスト1()
Range("a1").Value = "テスト1"
Range("a5").Value = Range("A1").Value
End Sub
 
これらのステートメントは、オブジェクトとプロパティを次のように組み合わされています。
 
Valueは、セルの中の値を操作するプロパティです
 
Range("a1") .Value = "テスト1"
セルA1 の 値を 「テスト1」にする
 
Range("a5") .Value = Range("A1").Value
セルA5 の 値を セルA1の値にする
 
このように、マクロのステートメントも我々が普段話す言語と同じように、「XをYにする」、「XにYを書き込む」といったような具合に翻訳できるのです。
 
では、次にメソッドを使ったプロシージャ「テスト2」を見てみます。
 
Sub テスト2()
Range("A1").Clear
Range("A5").Clear
End Sub
 
このコードは、オブジェクトとメソッドを次のように組み合わせています。
Clearは、セルの値をクリアにするメソッドです
 
Range("A1") .Clear
セルA1を クリアする

Range("A5") .Clear
セルA5を クリアする
 
 プロパティは、セルの属性を設定するものでしたが、メソッドは、オブジェクトに対する作業であることがわかります。

 以上のように、マクロに何が書かれているのかを理解するには、オブジェクトとメソッドに注目して読み解いていくのがコツです。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

   ここでは、システムの構築を行うために必要となってくるマクロの使用方法を解説いたします。
 
 「ワークシート関数は使えるけど、マクロはよくわからない・・・」と感じている方もいらっしゃると思いますが、順番に理解していけばそれほど難しいものではありません。

Excelを用いて自分だけのツールを作れるようになるためには、
 
1.ワークシート関数を理解する。
2.マクロの文法、マクロに関係する用語を理解する。
3.作業に使われるステートメントのプロパティ、メソッドなどの組み合わせパターンを知る。
4.自動記録と記録されたコードの修正方法を理解する。
5.制御構造を理解する
6.サブルーチンを理解する
ということが必要になると思います。

 プロパティやメソッドの種類にはどのようなものがあるのかを調べるには、ExcelやVBEのヘルプを参照するのも一つですが、市販のマクロ辞典のようなものを購入するのもよいでしょう。
 また、Excelにはマクロの自動記録という機能があり、これを用いればメソッドやプロパティを辞書で調べたりしなくても、マクロが自動的に記録してくれます。
 この章では、上に挙げた必要事項の最小限の事柄を順番に解説していこうと思います。
 最小限のことを覚えてしまえば、そこから、応用するのも容易になります。

1.用語の解説
 ここでは、マクロを使用する際に多く用いられる用語を解説いたします。
 詳しい解説は、市販のマクロの教則本に譲り、ここではExcelを用いてシステムトレードを行う際に必要になる用語だけを解説いたします。
 マクロの敷居が高く感じてしまう要因の一つに聞きなれない用語が多数使われることがあげられると思います。ここでまとめて解説してしまいますが、必ずしも用語を丸暗記する必要はありません。本文中で用語に引っ掛かってしまったらこのページを読み返す、という読み方でもかまいません。

0622


■変数
 変数とは、データを代入する箱のようなものです。
 プロシージャの先頭では、プロシージャの中で変数を使用するために、「変数の宣言」ということを行います。

例えば、
 
Subテスト ()
Dim xyz as long

 
のDimで始まるステートメントがそれです。
 
これは、
Dim 変数名 as データ型
を表しています。

Longは、-2,147,483,648~2,147,483,648の整数値を代入する場合に使用し、String は、文字列を代入する場合に、variantはセルの範囲などを代入するのに使用します。

詳しい例は、後述する「よく使われるステートメント」内でご紹介します。

 このツールで使用されているマクロを理解するのに必要になってくる用語は、この程度です。
 では、次はオブジェクト、プロパティ、メソッドの違いを理解しながら、実際に使用するコードを読み解いてみましょう。
このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr Clip to Evernote

このページのトップヘ