FOLIOやS株Now!みたいにワン株を一括注文しちゃおう!! 【MONELIO(マネリオ)製作記その1】 ~ マネックス証券ワン株で分散テーマ投資を行うエクセルVBAツール ~

妹さえいればいい。 可児那由多 ほっこり 20171015-Kani-Nayuta_s.jpg

私も先輩のお○○○○をいっぱい注文しちゃいました。 





MONELIO(マネリオ)計画始動。


 少額テーマ投資サイトFOLIOやSBI証券のS株Now!をパクって、エクセルVBAを駆使してマネックス証券ワン株で分散テーマ投資を行うツールを作っちゃおうというのが本企画の趣旨になります。

monelioシステム

 MONELIO(マネリオ)システムの構成としてはエクセルをプラットフォームとして大きく3つのシステムから構成されています。

 A:FOLIOからテーマ銘柄情報をパクりエクセルに自動入力

 B:マネックス証券にオートログインしてワン株売買を自動発注

 C:ヤフーファイナンスから株価情報をパクり運用管理


 今回はシステムBの中のワン株購入を自動注文する部分のプログラム製作に挑戦していきます。

 まずマネックス証券にログインしてワン株で【7751】キヤノンを1株購入するプログラムをVBAコードの説明を交えて紹介していきます。

 一通りの紹介のあと、最後にエクセルシートに記入されている銘柄コードと株数を参照して複数銘柄を一括で購入するVBAコードをまとめて紹介しています。

 なお本プログラム開発にあたり、サイト「VBAのIE制御入門」様で勉強させていただきました。また一部コードを利用させていただいております。
 あのような素晴らしいコンテンツを無償開示していただいていることに感謝致します。

VBAのIE制御入門 | IE操作の自動化

EXCELのVBAを利用したIE(Internet Explorer)の制御方法や自動操作についての入門サイトです。



1.IEの起動とマネックス証券ログイン画面への接続。


 まずインターネットエクスプローラを立ち上げてマネックス証券ログイン画面に接続するまでのコードを紹介します。
Sub Buy_Canon()
Dim objIE As Object

' IEを起動
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

' マネックス証券に接続
objIE.navigate "https://mst.monex.co.jp/pc/ITS/login/LoginIDPassword.jsp"

Call IEWait(objIE) ' IEを待機

    (省略)

End Sub

'--------------------------------------------------
'--- IEを待機する関数 ---
'--------------------------------------------------
Sub IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
Do While objIE.document.ReadyState <> "complete"
DoEvents
Loop
End Sub

 Dim objIE As Object ~ Set objIE = まではIEを起動する為のおまじないのようなものだと思って下さい。

 objIE.Visible = True でIE画面を表示して自動入力が進んでいく様子を見ることができます。
 IE画面を表示したくない時は、objIE.Visible = False としてください。

 objIE.navigate の後にURLを指定するとIEが指定URLに接続してくれます。

 Call IEWait(objIE) で上記コードの下の方に記述されているIE待機関数を呼び出して、IEの表示が完了するのを待ちます。
 ボタンクリック等でページが変わったあとは必ずIE表示完了を待ってから次のコントロールをするようにしてください。


2.ログインIDとパスワードの入力。


 マネックス証券ログイン画面が表示されたらログインIDとパスワードを入力します。
    ' ログインIDとパスワードを入力
objIE.document.getElementById("loginid").Value = "********"
objIE.document.getElementById("passwd").Value = "********"
Call WaitFor(1) ' 1秒停止

    (省略)

End Sub

'--------------------------------------------------
'--- 指定した秒だけ停止する関数 ---
'--------------------------------------------------
Sub WaitFor(ByVal second As Integer)
Dim futureTime As Date

futureTime = DateAdd("s", second, Now)

While Now < futureTime
DoEvents
Wend
End Sub

MONELIO一括購入01-ログイン画面

 objIE.document.getElementById を使ってログインIDやパスワードを入力します。
 "******"のところは自分のIDやパスワードに置き換えてください。

 またデータセット待ち時間として Call WaitFor(1) で1秒時間待ちをするようにしています。

 getElementById("loginid") id="loginid" で定義されている入力ボックスを指しています。
 どの入力ボックスがどのような形で定義されているかはHTMLソースを解析して探す必要があります。

 例えばログインIDでしたら以下のような手順で探していきます。
 ログイン画面が表示されている状態でIEの【表示(V)】【ソース(C)】を選択してHTMLソースを表示させます。
 Ctrl+Fで検索ボックスを開いて、ログインID入力ボックスの左にある"ログインID"をキーワードとして検索をかけます。
 "ログインID"周辺のコードを見ていくと、それらしきid="loginid"というのが書かれています。
<dl class="clear-fix">
  <dt class="fl-l width-80 mr-20 mt-5"><strong>ログインID</strong></dt>
  <dd class="fl-l"><input class="ime-off width-160" name="loginid" id="loginid" type="text" size="11" maxlength="10" onfocus="change_focus('0')" autocomplete="on" /></dd>
</dl>

 まぁ僕もHTMLを理解しているわけじゃないんで、カット&トライしながらうまくいくやり方を見つけていく感じです。


3.ログインボタンのクリック。


 IDとパスワードが入力できたら【ログイン】ボタンをクリックさせます。
    ' ログインボタンをクリック
Call IEButtonClick(objIE, "ログイン")
Call IEWait(objIE) ' IEを待機

    (省略)

End Sub

'--------------------------------------------------
'--- ボタンを押す関数 ---
'--------------------------------------------------
Sub IEButtonClick(ByRef objIE As Object, buttonValue As String)
Dim objInput As Object

For Each objInput In objIE.document.getElementsByTagName("INPUT")
If objInput.Value = buttonValue Then
objInput.Click
Exit For
End If
Next
End Sub

 Call IEButtonClick(objIE, "ログイン")で上記コードの下の方に記述されているIEボタンクリック関数を呼び出して、【ログイン】と書かれたボタンをクリックします。

 ボタンについてはHTMLの方も比較的単純な場合が多く、
<input type="submit" value="ログイン" />

 といったような感じでvalue=""で設定された内容がそのままボタンとして表示されているので、応用しやすいと思います。


4.ログインできたか確認。


 ちゃんとログイン後の画面になっているか確認します。
    ' ログイン後のページでないときは終了
If objIE.document.all.tags("title")(0).innerText _
<> "ホーム/マネックス証券 取引サイト" Then
MsgBox ("ログインできませんでした")
objIE.Quit
Set objIE = Nothing
Exit Sub
End If

 objIE.document.all.tags("title")(0).innerTextで、HTMLソースのtitleタグの内容がログイン後の画面のものと一致しているか確認します。

objIE.Quit でIEを閉じます。
Set objIE = Nothing は使ったオブジェクト変数をキレイにするおまじないです。


5.購入する銘柄コードを設定。


 画面上の買い注文ボックスにキャノンの銘柄コード7551を入力して【買い注文】ボタンをクリックします。
    ' 銘柄コードを入力
objIE.document.getElementById("txt_order-buy").Value = "7751"
Call WaitFor(1) ' 1秒停止

' 買い注文ボタンをクリック
Call IEButtonClick(objIE, "買い注文")
Call IEWait(objIE) ' IEを待機

MONELIO一括購入02-銘柄コード入力

 前項2・3で説明したログインID入力や【ログイン】ボタンのクリックと同じようなことをやっています。


6.購入画面になっていることを確認。


 ちゃんと購入画面になっているかを確認します。
    ' 「スタンダード注文 買い注文」画面でない時はログアウトして終了
If objIE.document.all.tags("h1")(0).innerText _
<> "スタンダード注文 買い注文" Then
MsgBox ("例外事象が発生しました")
Call IELinkClick(objIE, "ログアウト")
Call IEWait(objIE) ' IEを待機
objIE.Quit
Set objIE = Nothing
Exit Sub
End If

MONELIO一括購入03-スタンダード注文画面

 前項4のログイン確認と違って、ここではtitleタグではなくh1タグで比較しているところです。
 titleタグはページ遷移での大雑把な区分けなので注文画面の中では変化がありません。
 そこでより詳細に判別できるh1タグで比較するようにしています。

 この後の説明ではページ遷移の確認は省いてありますが、サイト変更などによって画面構成が変わって自動でとんでもない注文がされてしまうことを避けるためにも、都度確認していった方が良いと思います。


7.注文画面をワン株用に切り替える。


 ワン株注文タブをクリックしてワン株用の注文画面に切り替えます。
    ' ワン株注文タブを選択
Call IELinkClick(objIE, "ワン株注文")
Call IEWait(objIE) ' IEを待機

    (省略)

End Sub

'--------------------------------------------------
'--- リンクをクリックする関数 ---
'--------------------------------------------------
Sub IELinkClick(ByRef objIE As Object, ByVal anchorText As String)
Dim objLink As Object

For Each objLink In objIE.document.getElementsByTagName("A")
If objLink.innerText = anchorText Then
objIE.navigate objLink.href
Exit For
End If
Next
End Sub

MONELIO一括購入04-ワン株注文画面

 ワン株注文タブはリンクが張られたアンカーテキストになっていますので、リンククリック用の関数を呼び出すようにしています。


8.購入株数の入力と口座区分のチェック。


 購入株数の入力と口座区分を特定口座にチェックします。
    ' 購入数を入力
objIE.document.getElementById("orderNominal").Value = "1"
' 特定(0)を設定(一般は(1))
objIE.document.getElementsByName("spAccKbn")(0).Click
Call WaitFor(1) ' 1秒停止

' 次へボタンをクリック
Call IEButtonClick(objIE, "次へ(注文内容確認)")
Call IEWait(objIE) ' IEを待機

MONELIO一括購入05-購入株数入力画面

 口座区分は特に指定しなくてもいつも使っている区分が最初からチェックされていますが、ここでは勉強も兼ねてobjIE.document.getElementsByNameを使ってチェックコントロールしています。
 ちなみに口座区分を一般口座にチェックするときは()内を1にします。
 objIE.document.getElementsByName("spAccKbn")(1).Click


9.注文内容の確認。


 注文内容確認の実行ならびに注文約定一覧を表示させます。
    ' 実行ボタンをクリック
Call IEButtonClick(objIE, "実行する")
Call IEWait(objIE) ' IEを待機

' 注文約定一覧をクリック
Call IELinkClick(objIE, "注文約定一覧")
Call IEWait(objIE) ' IEを待機

MsgBox ("注文内容を確認してください")

MONELIO一括購入06-ワン株注文確認画面 MONELIO一括購入07-ワン株注文受付完了

MONELIO一括購入08-注文約定一覧画面

 【実行する】ボタンをクリック後に前項5から繰り返すことで複数銘柄の購入ができます。


10.ログアウト処理。


 画面右上の【ログアウト】ボタンをクリックして、マネックス証券をログアウト後にIEを閉じます。
   ' ログアウトボタンをクリック
Call IELinkClick(objIE, "ログアウト")
Call IEWait(objIE) ' IEを待機

' IE終了
objIE.Quit
Set objIE = Nothing

MsgBox ("注文が完了しました")
End Sub

MONELIO一括購入09-ログアウトのクリック

以上でマネックス証券にログイン、ワン株で【7751】キヤノンを1株購入する流れは終了です。


エクセルシートに記載された銘柄を一括購入するVBAコードです。


 これまでのIEコントロールをまとめた感じで、エクセルシートに記載された銘柄を一括購入するプログラムを紹介します。
 エクセルシートにはこんな感じで、セルD8から銘柄コード、セルE8から注文株数を書き込んでおきます。

MONELIO一括購入-エクセル画面構成

 セルD8から下へ順番に各銘柄の購入を行い、最後に注文約定一覧を表示させてます。

MONELIO一括購入-注文約定一覧(ドローン)



'==================================================
'=== 一括購入ルーチン ===
'==================================================
Sub BulkBuy()
Dim objIE As Object
Dim sosa_sh As Worksheet
Dim start_code_cell As String
Dim work_code_cell As Range
Dim start_order_cell As String
Dim work_order_cell As String
Dim org_color As Integer
Dim line_num As Integer

Set sosa_sh = ActiveSheet ' 現在のシートを退避
start_code_cell = "D8" ' セル"D8"から株価コード記載
start_order_cell = "E8" ' セル"E8"から売買株数記載

' IEを立ち上げてマネックス証券にログイン
If MonexLogin(objIE) = False Then Exit Sub

' 銘柄コード記載がなくなるまで繰り返す
line_num = 0
Do While sosa_sh.Range(start_code_cell).Offset(line_num, 0) <> ""
' シートから銘柄コードを取得
Set work_code_cell = sosa_sh.Range(start_code_cell).Offset(line_num, 0)
work_order_cell = sosa_sh.Range(start_order_cell).Offset(line_num, 0)

' 注文株数が0の時
If (work_order_cell = "") Or (work_order_cell = "0") Then
GoTo CONTINUE ' 次の行の銘柄処理へ
End If

' 処理銘柄のセルの色番号を一時退避させ黄色に塗る
org_color = work_code_cell.Interior.ColorIndex
work_code_cell.Interior.ColorIndex = 6

' 銘柄コードを入力
objIE.document.getElementById("txt_order-buy").Value = work_code_cell
Call WaitFor(1) ' 1秒停止

' 買い注文ボタンをクリック
Call IEButtonClick(objIE, "買い注文")
Call IEWait(objIE) ' IEを待機

'「スタンダード注文 買い注文」画面でない時はログアウトして終了
If H1TagCheck(objIE, "スタンダード注文 買い注文") = False Then
Call MonexLogout(objIE)
Exit Sub
End If

' ワン株注文タブを選択
Call IELinkClick(objIE, "ワン株注文")
Call IEWait(objIE) ' IEを待機

' 「単元未満株 買い注文」画面でない時はログアウトして終了
If H1TagCheck(objIE, "単元未満株 買い注文") = False Then
Call MonexLogout(objIE)
Exit Sub
End If

' 購入数を入力
objIE.document.getElementById("orderNominal").Value = work_order_cell
' 特定(0)を設定(一般は(1))
objIE.document.getElementsByName("spAccKbn")(0).Click
Call WaitFor(1) ' 1秒停止

' 次へボタンをクリック
Call IEButtonClick(objIE, "次へ(注文内容確認)")
Call IEWait(objIE) ' IEを待機

' 「単元未満株 買い注文 内容確認」画面でない時はログアウトして終了
If H1TagCheck(objIE, "単元未満株 買い注文 内容確認") = False Then
Call MonexLogout(objIE)
Exit Sub
End If

' 実行ボタンをクリック
Call IEButtonClick(objIE, "実行する")
Call IEWait(objIE) ' IEを待機

' 「単元未満株 買い注文 受付完了」画面でない時はログアウトして終了
If H1TagCheck(objIE, "単元未満株 買い注文 受付完了") = False Then
Call MonexLogout(objIE)
Exit Sub
End If
' 退避していたセルの色を戻す
work_code_cell.Interior.ColorIndex = org_color

CONTINUE: ' 次ループ処理ラベル

line_num = line_num + 1 ' 次の行の銘柄処理へ
Loop

' 注文約定一覧をクリック
Call IELinkClick(objIE, "注文約定一覧")
Call IEWait(objIE) ' IEを待機

MsgBox ("注文内容を確認してください")

Call MonexLogout(objIE) ' マネックス証券をログアウトしてIEを閉じる

MsgBox ("注文が完了しました")

End Sub

'--------------------------------------------------
'--- IEを立ち上げてマネックス証券にログインする ---
'--------------------------------------------------
Function MonexLogin(ByRef objIE As Object) As Boolean
Dim loginid As String
Dim password As String

loginid = InputBox("ログインIDを入力して下さい", "ログインID入力")
If loginid = "" Then
MsgBox ("ログインをキャンセルしました")
MonexLogin = False
Exit Function
End If
password = InputBox("パスワードを入力して下さい", "パスワード入力")
If password = "" Then
MsgBox ("ログインをキャンセルしました")
MonexLogin = False
Exit Function
End If

' IEを起動
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

' マネックス証券に接続
objIE.navigate "https://mst.monex.co.jp/pc/ITS/login/LoginIDPassword.jsp"

Call IEWait(objIE) ' IEを待機

' ログインIDとパスワードを入力
objIE.document.getElementById("loginid").Value = loginid
objIE.document.getElementById("passwd").Value = password
Call WaitFor(1) ' 1秒停止

' ログインボタンをクリック
Call IEButtonClick(objIE, "ログイン")

Call IEWait(objIE) ' IEを待機

' ログイン後のページでないときは終了
If objIE.document.all.tags("title")(0).innerText _
= "ホーム/マネックス証券 取引サイト" Then
MonexLogin = True
Else
MsgBox ("ログインできませんでした")
objIE.Quit
Set objIE = Nothing
MonexLogin = False
End If

End Function


'--------------------------------------------------
'--- マネックス証券をログアウトしてIEを閉じる ---
'--------------------------------------------------
Sub MonexLogout(ByRef objIE As Object)

' ログアウトボタンをクリック
Call IELinkClick(objIE, "ログアウト")
Call IEWait(objIE) 'IEを待機

' IE終了
objIE.Quit
Set objIE = Nothing

End Sub


'--------------------------------------------------
'--- h1タグタイトルを確認する ---
'--------------------------------------------------
Function H1TagCheck(ByRef objIE As Object, ByVal Title As String) As Boolean
If objIE.document.all.tags("h1")(0).innerText = Title Then
H1TagCheck = True
Else
MsgBox ("例外事象が発生しました")
H1TagCheck = False
End If
End Function


'--------------------------------------------------
'--- リンクをクリックする関数 ---
'--------------------------------------------------
Sub IELinkClick(ByRef objIE As Object, ByVal anchorText As String)
Dim objLink As Object

For Each objLink In objIE.document.getElementsByTagName("A")
If objLink.innerText = anchorText Then
objIE.navigate objLink.href
Exit For
End If
Next
End Sub

'--------------------------------------------------
'--- ボタンを押す関数 ---
'--------------------------------------------------
Sub IEButtonClick(ByRef objIE As Object, buttonValue As String)
Dim objInput As Object

For Each objInput In objIE.document.getElementsByTagName("INPUT")
If objInput.Value = buttonValue Then
objInput.Click
Exit For
End If
Next
End Sub


'--------------------------------------------------
'--- IEを待機する関数 ---
'--------------------------------------------------
Sub IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
Do While objIE.document.ReadyState <> "complete"
DoEvents
Loop
End Sub

'--------------------------------------------------
'--- 指定した秒だけ停止する関数 ---
'--------------------------------------------------
Sub WaitFor(ByVal second As Integer)
Dim futureTime As Date

futureTime = DateAdd("s", second, Now)

While Now < futureTime
DoEvents
Wend
End Sub


今日のアイキャッチ画像は。


 「妹さえいればいい。」から、メインヒロインで天才ラノベ作家の可児 那由多(かに・なゆた)ちゃんです。

「妹さえいればいい。」

妹さえいれば人生は常に最高なのに、なぜ俺には妹がいないのか……」 妹モノの作品ばかりを書き続けている妹バカの小説家・羽島伊月の周囲には、天才作家にして変態の可児那由多、女子大生の白川京、イラストレーターのぷりけつ、鬼畜税理士の大野アシュリーなど、個性豊かな人物たちが集まっている。


 那由多ちゃんが変態チックで下ネタ魔王ではありますが、1話冒頭の妄想小説オチを除けば謎のヒカリが飛び交うようなキツイ描写もなく、女の子の可愛さが目立つ作風に感じます。

 ただ”締切”のくだりはアニメなので演出的にもう一工夫欲しかったところです。

 オープンエッチな雰囲気のある那由多ちゃんですが、主人公をからかっているだけで、いざとなるとひいてしまうタイプなんじゃないかと想像しているのですが、主人公のパンツを嗅いで恍惚とする様を見ているとどこまで本気だかちょっと分かりません。

 ここ最近はロリ妹系推しの作品が続いているので食傷気味にならないような展開を期待したいところではあります。


スポンサーサイト
個別株投資ExcelMONELIO妹さえいればいい。可児那由多

0 Comments

Post a comment