0から始めるテクニカル分析生活3
※この記事は有料設定ですが全部無料で読めます。
今後の応援をしたいという方は購入してくださると励みになります。
前回の記事ではソフトバンク(9984)の移動平均線トレードの検証をしました。
他の銘柄の検証結果も知りたくなりました。
現在、東証に上場している銘柄数は約3800銘柄あります。
これをひとつずつ手入力してはデータを取って、などをやると膨大な時間が必要になります。
VBAを使って一気に全銘柄の4本値を入手し、そのファイルを操作して銘柄の検証結果を出す方法を数回にわたって紹介したいと思います。
今回のnoteで学ぶこと
VBAの導入方法から基本的な使い方
楽天RSSとの相性問題について
例題を使った楽天RSSのエラーの回避の仕方
VBAとは
VBAというのはマイクロソフトoffice製品を動かすためのプログラミング言語です。
基本的に当noteでVBAという言葉がでてきたらエクセルを動かすExcelVBAのことになります。
プログラミング言語?わけわからんという方も多いと思います。わたしも最初は全然わかりませんでしたが、独学でもある程度は扱えるようになりました。
言語という単語が含まれていることからわかるように、プログラミングとは英語のようなものです。自分がやりたいことを書けばその通りに動いてくれます。
英語の場合は相手が意味を汲み取ってくれたり聞き返してくれたりするので多少間違えていても会話が成立しますが、プログラミングの場合は会話の相手がコンピューターなので、間違った文法を使うと「間違ってるよ!」としか答えてくれません。そこがプログラミングの難しいところです。
VBAの導入方法
VBAを使うには最初にちょっとした設定が必要になります。
まずはエクセルを開いて左上の「ファイル」をクリック。その後「オプション」をクリックしてください。(画像の赤丸)

続いて「リボンのユーザー設定」をクリック。青丸部分が「メインタブ」でオレンジ丸の「開発」のところにチェック

2007を利用の場合は少し違う可能性があります。
オプション→基本設定→[開発]タブをリボンに表示する
という流れになります。
これで完了です。ただし、このままではVBAでコードを書いても保存することができません。
下の画像のように名前を付けて保存で「EXCELマクロ有効ブック」を選んで保存してください。

すると保存した先にマクロ有効ブックが出来上がります。

画像上は右がマクロ有効ブックで左がふつうのブックです。少し見た目が違います。左のブックではVBAを実行することができません。
VBAと楽天RSSの相性問題
先に進んでプログラミングを始めているという人もいるかもしれないので先に注意事項を書いておきます。プログラミングはちんぷんかんぷんだという方は軽く目を通す程度にしてください。
実はVBAと楽天RSSは非常に相性が悪いです。
というのも、おそらくですが楽天RSSでデータを取得する時にVBAを使用しているようで、それが理由なのかこちらでVBAを使用していると楽天RSSのデータが更新されずおかしな挙動になることがあります。
例えば、こんなコードを書いたとします。
楽天RSSを使ってエクセルA列1行からA列30行までに書いてある証券コードの始値と前場終値を取得してB列C列に出力したい。そして終値>始値のものだけを抽出してD列3行以降に出力したい
Sub 陽線を探す()
Dim i As Long
Dim Drow As Long
For i = 1 To 30
Cells(i, 2) = "=RssMarket(A" & i & ", ""始値"")"
Cells(i, 3) = "=RssMarket(A" & i & ", ""前場終値"")"
If Cells(i, 2).Value < Cells(i, 3).Value Then
Drow = Range("D1").End(xlDown).Offset(1, 0).Row
Cells(Drow, 4).Value = Cells(i, 1)
End If
Next
End Sub
前場終値と始値は取得できるのですが、その後の陽線を引いた証券コードの出力をしてくれません。
もう一度実行するとちゃんと出力してくれるので、コードが間違っているわけでないようです。
今回のnoteはVBAの使い方や、この相性問題の解消方法についての話がメインになります。
↓参考エクセル
プログラミングの構成を考える
本当はここからVBAの使い方を説明すべきなのでしょうが、わたしはせっかちなのでいきなり実戦形式です。
わからなそうなところはその都度説明していきたいと思います。
エクセルのbook1つで3800銘柄の4本値を取得するとなるとさすがにファイルが大きくなりすぎて扱いにくいです。なので1bookにつき1銘柄、全部で3800ファイル作成したいと思います。(今回のnoteでは例題のみをやります)
まずは作業の流れを考えます。
エクセルでやるべきことは
・A1に証券コードを入れると4本値を取得する数式を作る
VBAでやりたいことは
1.A1に証券コードを入れる
2.値が更新される
3.保存する
4.証券コードを変える
5.2に戻る
ただし、先ほど書いた相性問題のことがあるので、「証券コードを変える」のあとは一度プログラミングを終了させて値を更新する仕組みを考えなくてはいけません。(あとで詳しく説明します)
何はともあれエクセル部分を作っていきます。
相性問題のところでダウンロードできるBOOKのシート2に、4本値の取得シートを作ってあります。このシートを使って説明していきます。
VBEの使い方

開発タブをクリックして、VisualBasicをクリックしてください。
すると上図のような別ウインドウがでてきます。
この新しく出てきたウインドウをVBE(Visual Basic Editer)と言います。VBAと名前が似ていてややこしいですが、簡単に説明するとVBAのコードを書くためのアプリのことです。
ここでは簡単にVBEの使い方を説明します。今後必要になりそうな知識はその都度紹介していきます。

ダウンロードしたファイルにはすでに一つだけマクロが出来上がっています。
最初の状態ではコードが載っておらず真っ黒な画面のままだと思いますので、コードの表示をしたいと思います。
赤丸の「RSSとの相性問題」のところをダブルクリックしてください。
するとコードが表示されるはずです。
ここに表示されたコードは少し上の方で説明した「RSSとの相性問題」で記述したものと同じものになります。
マクロ・コード・VBA
言葉の説明をします。
マクロというのは、自動で実行してくれる機能のことを指します。
自動で実行してくれる機能を作るのに、VBAというプログラミング言語を使います。
コードというのはプログラミング言語で書く命令文章のことです。
英語で例えると、マクロというのはspeaking、VBAはEnglish、コードはwritingです。
マクロの実行は原則ボタンを押すだけなので、基本的に必要な学習はwritingだけになります。
3つも単語が出てくるので少しややこしいですが、マクロを書く・コードを書く・VBAを書くという表現はだいたいどれも同じような意味になります。
マクロの実行
サンプルシートのマクロを実際に実行してみましょう。早く全銘柄を取得したいかもしれませんが、しばらくはお付き合いください。
実行結果がわかるように、シート1を表示します。そして楽天RSSを接続中にしてください。

VBEの赤丸の部分、再生マークみたいなボタンが実行ボタンです。
ここを押してください。

するとシート1に始値と前場終値が出力されます。

あれ?実行されないです。という方は下のようなポップアップがでていると思いますので「陽線を探す」を選択して実行を押してください。

ポップアップが出る方と出ない方の違いは、実行ボタンを押す前にコードのどの行を選択しているかです。
下の画像では赤丸の部分に点滅したカーソルがあります。この時は実行ボタンを押すとすぐに実行されます。

次の画像はEnd Subの後ろにカーソルがあります。この場合はポップアップがでます。

なぜこうなるのかはVBAのルールが関係しています。
1行目のSub 陽線を探す()というのはこのプログラムのタイトルです。このタイトルのことをサブプロシージャと言います。物語の始まりの合図です。
「陽線を探す」の部分は基本的にはどんな名前でもOKです。自分で名前をつけることができます。ただし、VBAで使う単語を使ってしまうと後々ややこしいことになるので、単語を覚えるまでは日本語の方が良いかなと思います。やりたい作業の名前をつけるといいでしょう。
End Sub というのは終わりの合図です。このサブプロシージャの終わりがどこであるのかを明確にするために必須です。物語の最後につける 「THE END」とか「終わり」のようなものです。
※サブプロシージャのことをここでは省略してプロシージャと表記する場合があります。厳密には少し違うようなのですがだいたい同じくらいに思ってください。

ポップアップが出て実行してくれなかったのはEnd Subの外にカーソルがある時でした。これはどのサブプロシージャを実行して良いかが分からなかったからなのです。
サブプロシージャ内にカーソルがある時に実行ボタンを押すと問答無用で実行されます。
慣れていても意図しないプロシージャの実行をしてしまい、焦ることが多々あります。(VBAで実行した場合、元に戻るが使えない場合がほとんどです。取り返しのつかなくなる場合があります)
実行ボタンを押す前は必ず上書き保存をして、最悪の場合はbookを閉じてやり直せる状況にしておく癖をつけておくと良いでしょう。
少し話が脱線したのでもう一度さきほどのマクロの実行後の画像を出しておきます。

コードの日本語訳
このコードの意味を翻訳したものが以下になります。
Sub 陽線を探す()
Dim i As Long
Dim Drow As Long
’上の2行は別noteで説明します。
For i = 1 To 30
'1行目から30行目までを処理するという意味です。
’1行目が終わったら次は2行目、2行目が終わったら次は3行目・・・と1行ずつ処理をします。
Sheets(1).Cells(i, 2) = "=RssMarket(A" & i & ", ""始値"")"
’シート1のA2に =RssMarket(A" & i & ", "始値")という数式を入力するという意味です。
’(i,2)となっている箇所。iが変数です。iが2の時はB2、3の時はC2・・・となります。
’先ほどの1行目から30行目までを処理するというコードと紐ついています。
Sheets(1).Cells(i, 3) = "=RssMarket(A" & i & ", ""前場終値"")" '※2
'上のコードと同様ですが、今度はC列に前場終値を表示する数式を入れるコードになります。
If Sheets(1).Cells(i, 2).Value < Sheets(1).Cells(i, 3).Value Then
’ここはexcelでいうところのif関数です。
’もし、「Bの値<Cの値」の時が成立する時は~ と書いてあります。
Drow = Sheets(1).Range("D1").End(xlDown).Offset(1, 0).Row
’D列における最終行の一つ下の行がどこかを探すコードです。
’わからなければひとまず軽く流してください。
Sheets(1).Cells(Drow, 4).Value = Sheets(1).Cells(i, 1)
'先ほどのif文が成立する時のコードです。
’D列の最終行の一つしたにその証券コード(つまりA行の値)を記述するように書いてあります。
End If
'if文の終わりはここ。と書いてあります。
Next
'i=1の時が終わったら次はi=2の時、というように同じ処理を数値を変えて行うのに、
’戻る位置がどこかを書いてあります。
End Sub
'このサブプロシージャの終わりを宣言しています。
B列に始値、C列に前場の終値が表示されました。
本当はD2にある「以下にコード記載」より下の行に陽線の証券コードだけを記述していくマクロなのですが、それが表示されません。
ところがこのマクロをもう一度実行すると表示されるはずです。
これがVBAと楽天RSSの相性問題のところで触れた不具合になります。
これは一つのサブプロシージャを実行し終えるまでは、RSSで取得したデータが更新されないという楽天RSS側の不具合なのです。
このマクロを実行すると
1.始値と終値を楽天RSSで取得する。
2.マクロ実行中はRSSで取得しようとした値が更新されず、どちらも0と認識されている
3.終値-始値が0なのでD列に証券コードが記述されない。(終値>始値のものだけが記述されるコードになっているため)
4.30行までの処理が終わる。
5.すべての処理が終わったので楽天RSSが更新される。
ということが起こっています。
楽天RSSとVBAを組み合わせてマクロを作成する場合は、こういった不具合に対応しなければなりません。
コメント機能
上のコードの要約部分につらつらと日本語が書いてありますよね。
どうみてもプログラミング言語ではない言語がたくさん書かれていますが、このマクロは成立しており、実行することができます。
なぜならコメントという機能を使っているからです。
プログラミング言語ではなく、自分用のメモを入れたい時は文章の前に「’」を付けます。これをつけることでその文章はコードではなくコメントという扱いになり、マクロ実行時には「’」以下の文章は無視して実行されます。
楽天RSS更新エラー回避方法
1回のマクロの実行で正しい結果を出力できるようにするには、始値と終値を取得した時点で一度サブプロシージャを終わらせて楽天RSSを更新させなければなりません。
そのためのマクロを作る前段階として、先ほどのプロシージャを二つに分ける必要があります。
Sub 始値と前場終値を出力()
Dim i As Long
For i = 1 To 30
Sheets(1).Cells(i, 2) = "=RssMarket(A" & i & ", ""始値"")"
Sheets(1).Cells(i, 3) = "=RssMarket(A" & i & ", ""前場終値"")" '※2
Next
End Sub
Sub 陽線銘柄をD列に出力()
Dim i As Long
Dim Drow As Long
For i = 1 To 30
If Sheets(1).Cells(i, 2).Value < Sheets(1).Cells(i, 3).Value Then
Drow = Sheets(1).Range("D1").End(xlDown).Offset(1, 0).Row
Sheets(1).Cells(Drow, 4).Value = Sheets(1).Cells(i, 1)
End If
Next
End Sub
これで二つのプロシージャに分けることができました。
プロシージャは一つのモジュール内にいくつも作成することができます。
以下モジュールの説明になります。少し話が脱線しますがモジュールという概念がわからない方は読んでください。
タイトル「新しいモジュールを使う」がこの話の続きになります。
モジュールとは
わたしが勉強する気がなかなか起きずに曖昧にしていたのがモジュールという概念です。
この概念をちゃんと理解していなくてもなんとかなることが多いのですが、必要最低限の知識だけを紹介しますので、それだけ覚えてください。

左側は上図のようになっていると思います。
VBAProject(0から始めるシストレ3.xlsm)というbookがあって、その下の階層にはsheetごとのMicrosoft Excel Objectsと標準モジュールというフォルダがあります。その中にファイルがいくつかあります。
モジュールの種類
最初のフォルダにはsheet1とsheet2、そしてThisWorkbookというのがあります。
このうちsheet1とsheet2のことをシートモジュールと言います。(画像の1)
ThisWorkBookのことはブックモジュールと言います。初期の名前がThisWorkBookなので、このnoteではわかりやすくThisWorkBookモジュールと表現します。(画像の2)
そして画像の3が標準モジュールです。
モジュールの意味
モジュールって何?ってなると思います。
わたし自身も完全には理解できていませんが、エクセルでいうところのシートに当たる部分です。プログラミングコードを記述するためのシート=モジュールです。
シートモジュールの場合、そのシート内でしか実行できません。sheet1で書いたコードはsheet2で実行できません。
Thisworkbookモジュールはbookに対して行います。何を言ってるのか意味するのが難しいと思いますので、簡単な例を2つ挙げます。
bookを開いた時に行うマクロや、bookを閉じる時に行うマクロを書くことができます。シストレの自動化では必須になりますが、チャート分析では不要です。そういうものがあるんだ程度の認識でOKです。
そして最後の標準モジュールですが、これはすべてのシートやbookに対して実行することができます。
たとえば、別のbookを開いて、新しく開いたbookの情報を書き換えたり、AのbookをBのbookにコピーするなどができます。
他にも便利なモジュールはあるのですが、しばらくは標準モジュールだけを使用すればOKです。
標準モジュールの増やし方・減らし方
エクセルのシートを増やしたり減らしたりできるようにモジュールも増やしたり減らしたりできます。
挿入タブから標準モジュールを選ぶと増やすことができます。

逆に不要になったモジュールを削除するには、削除したいモジュールを右クリックして、「Module1の解放」を選んでください。名前を変えている場合はModule1の部分が変わります。解放というパソコンではあまり使われない単語ですが削除と同義です。

すると以下のようなアラートがでます

エクスポートますか?とは保存するかどうかという意味です。
不要にはなったけど、もしかしたら後で使うかもしれないなという時は「はい」を選んで任意の場所に保存してください。
新しいモジュールを使う
さきほど一つのプロシージャを二つに分割しました。
今度はこの2つのプロシージャをくっつけるのですが、モジュール内がごちゃごちゃしてくるので別のモジュールを使うことにします。
同じモジュール内に書くこともできるのですが、プロシージャが増えてくると混乱したり、エラーが出た時にどれを直せばよいかわからなかったりするので分けた方が良いでしょう。
標準モジュールのModule1をダブルクリックしてください。名前が気になる場合は青丸部分を変更してください。

Module1に記載するコードは以下のようになります。

Sub 陽線を探す()
始値と前場終値を出力
Application.OnTime Now + TimeValue("00:00:05"), "陽線銘柄をD列に出力"
End Sub
同じ標準モジュールのフォルダー内に作ったプロシージャは別のモジュールで呼び出すことができます。以下はコードの要約です。
Sub 陽線を探す()
’モジュール1に新しく作ったプロシージャです。
始値と前場終値を出力
’プロシージャは↑のようにsubと()を取り外した形式で呼び出すことができます。
Application.OnTime Now + TimeValue("00:00:05"), "陽線銘柄をD列に出力"
「始値と前場終値を出力」を実行から5秒後に「陽線銘柄をD列に出力」プロシージャを実行する
という意味です。
End Sub
このマクロを実行したのが以下の画像です。

無事に一度の実行で始値と前場終値を取得して、その中で陽線の銘柄だけをD列に出力することができました。
以下のようなコードではダメなの?と思う方がいるかもしれません。

このコードだと、最初に作ったものと同じで正しく表示してくれません。
一つ一つのプロシージャは完結しているのですが、全体プロシージャである「陽線を探す」が終わっていないからです。
ん?どういう意味?となると思います。
Application.OnTime Now

上画像のコード、は、別のプロシージャを呼び出すということに関しては「陽線を探す」という全体プロシージャ内で行っているのですが、呼び出したプロシージャ自体は独立していて、「陽線を探す」プロシージャとは別のマクロになり、楽天RSSのVBA実行中は更新されないというルールに干渉しないのです。

もし「始値と前場終値を出力」というプロシージャが実行から終了まで1秒かかり(楽天RSSを記述するコードです)で、そのあとの楽天RSSにおいてのコードの取得に30秒くらいかかる場合は、TimeValueの値を30秒よりも遅くしなければいけません。

このApplication.OnTime Nowというコードは楽天RSSを使ったVBAでは習得必須となります。コードの実行時間と終了時間の把握と理解が特に重要です。
ここでひとまず例題に関しては終了です。
今回はコードの書き方などの細かなことは説明していませんが、本命の個別株のbookを作成するマクロを作る時はコードの書き方も説明していく予定です。
次回のnoteでは全銘柄の4本値を記述したbookを作りたいと思います。
ここから先は
¥ 200
この記事が気に入ったらチップで応援してみませんか?