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

魔法使いの嫁 羽鳥チセ 困惑する 20171022-Hatori-Chise_s.jpg

なんかテーマ「魔法使い」って胡散臭いんで注文取消したいんですけど…





MONELIO(マネリオ)計画について。


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

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

monelioシステム

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

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

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


 前回の自動一括注文編に続き、

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

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


 今回は同じくシステムBのワン株注文を一括取消する部分のプログラム製作に挑戦していきます。

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

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

 なお本プログラム開発にあたり、引き続き「VBAのIE制御入門」様で勉強させていただいております。

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

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



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


 まずインターネットエクスプローラを立ち上げてマネックス証券にログインするコードです。
 やっていることは前回の自動一括注文での説明1~4とほぼ同じになります。
 ログインする部分は注文・取消・売却で共用して使うことになりますので関数化してあります。
 またログインIDとパスワードはダイアログボックスを表示させて入力するようにしてあります。

MONELIO注文取消し01-ログイン画面
Sub Cansel_Canon()
Dim objIE As Object

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

    (省略)

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

'--------------------------------------------------
'--- ボタンを押す関数 ---
'--------------------------------------------------
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


2.現在の注文内容を表示する。


 注文の取消を行うために「注文約定一覧」リンクをクリックして現在の注文内容を表示させます。
 画面遷移を行った後はちゃんと目的の画面になっているかh1タグを確認するようにしています。その際の処理中断に伴うログアウト処理もよく使う為、サブルーチン化してあります。
 ここ以降は画面遷移後のh1タグ確認のコード記載を割愛させていただきます。

MONELIO注文取消し02-注文約定一覧入力
     ' 注文約定一覧をクリック
Call IELinkClick(objIE, "注文約定一覧")
Call IEWait(objIE) 'IEを待機

' 「注文約定一覧」画面でない時はログアウトして終了
If H1TagCheck(objIE, "注文約定一覧") = False Then
Call MonexLogout(objIE)
Exit Sub
End If

    (省略)

End Sub


'--------------------------------------------------
'--- マネックス証券をログアウトして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


3.一括訂正・取消画面に移行する。


 注文約定一覧画面では一注文ずつ取消を行わなければなりません。
 ここでの説明のようにキヤノン1銘柄であれば支障にはならないと思いますが、10銘柄もそれを繰り返すとなると少々時間が掛かってしまいます。
 そこでチェックボックスによる取消選択ができる一括取消画面に移動するため、「一括訂正・取消」リンクをクリックします。

MONELIO注文取消し03-注文約定一覧画面1

   ' 一括訂正・取消をクリック
Call IELinkClick(objIE, "一括訂正・取消")
Call IEWait(objIE) 'IEを待機


4.対象銘柄の取消チェックボックスをチェックする。


 全ての取消チェックボックスをチェックする「取消全チェック」のリンククリックが簡単ではあるのですが、それだと使い勝手が悪いケースも出てくるだろうと思い、勉強も兼ねてち銘柄コード検索して該当注文のみチェックするようにしてみました。

MONELIO注文取消し05-チェックボックス

    Dim objClass As Object
Dim st_point As Integer
Dim ed_point As Integer
Dim checkbox_name As String
Dim i As Integer
Dim flg As Boolean

i = 1
flg = False
' 注文約定一覧を上から順番に検索していく

Do While objIE.document.getElementsByClassName("list_line" & i).Length > 0
For Each objClass In objIE.document.getElementsByClassName("list_line" & i)
' 銘柄コード一致している時
If (InStr(objClass.outerHTML, "7751" & " ") > 0) Then
' チェックボックスのnameを取得
st_point = InStr(1, objClass.outerHTML, "correctCancel_")
If st_point > 0 Then ' チェックボックスのnameが見つかった時
ed_point = InStr(st_point + 1, objClass.outerHTML, """")
checkbox_name = Mid(objClass.outerHTML, st_point, ed_point - st_point)
' チェックボックスが存在している時
If objIE.document.getElementsByName(checkbox_name).Length > 0 Then
' チェックボックスを選択
objIE.document.getElementsByName(checkbox_name)(0).Checked = True
Call WaitFor(1) ' 1秒停止
flg = True ' 注文有りフラグをセット
Exit For
End If
End If
End If
Next
i = i + 1 ' 次の行の注文を確認
If flg = True Then Exit Do ' 取消済の時はループを抜ける
Loop

If flg = False Then ' 該当銘柄の注文が無かった時
MsgBox "銘柄コード【7751】は注文されていません。"
End If

 ここでのポイントはgetElementsByClassName("").outerHTMLを使って対象目的のClassタグ毎にHTMLコードを取得し、銘柄コードの検索やチェックボックス名称の切り出しを行っているところです。

 Classタグは注文一覧表のテーブル行毎に"list_line1"とか"list_line2"といった形で設定されており、それを該当チェックボックスが見つかるか、"list_line"で始まるClassタグが無くなるまでHTMLコードの解析を繰り返しています。

 ここでは1銘柄だけですが、Do While~Loopの外から繰り返し処理することで複数銘柄の取消が行えるようになります。


5.一括取消と注文内容の確認を行う。


 取消チェックボックスへのチェックが完了したら、「一括取消」「実行」「注文約定一覧」の順にクリックして注文が取消されているかを確認します。
 その後、マネックス証券をログアウトして終了となります。

MONELIO注文取消し06-一括取消ボタン
         
MONELIO注文取消し06-一括取消実行
         
MONELIO注文取消し07-一括取消完了
         
MONELIO注文取消し08-注文約定確認
         
MONELIO注文取消し09-ログアウトのクリック

   ' 一括取消ボタンをクリック
Call IEButtonClick(objIE, "一括取消(内容確認)")
Call IEWait(objIE) 'IEを待機

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

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

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

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

MsgBox ("取消が完了しました")
End Sub

以上でマネックス証券にログイン、【7751】キヤノンの注文を取り消す流れは終了です。


エクセルシートに記載された銘柄の注文を一括取消するVBAコードです。


 一括購入時同様にエクセルシートにはこんな感じで、セルD8から銘柄コード、セルE8から注文株数を書き込んでおきます。

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

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

 なお下記コードにおいて、Sub BulkCansel()以外は前回一括注文と紹介しているものと同じ共用ルーチンとなっています。



'==================================================
'=== 一括取消ルーチン ===
'==================================================
Sub BulkCansel()
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
Dim objClass As Object
Dim st_point As Integer
Dim ed_point As Integer
Dim checkbox_name As String
Dim i As Integer
Dim flg As Boolean

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

' 注文約定一覧をクリック
Call IELinkClick(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

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

' 銘柄コード記載がなくなるまで繰り返す
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

i = 1
flg = False
' 注文約定一覧を上から順番に検索していく

Do While objIE.document.getElementsByClassName("list_line" & i).Length > 0
For Each objClass In objIE.document.getElementsByClassName("list_line" & i)
' 銘柄コード一致している時
If (InStr(objClass.outerHTML, work_code_cell & " ") > 0) Then
' チェックボックスのnameを取得
st_point = InStr(1, objClass.outerHTML, "correctCancel_")
If st_point > 0 Then ' チェックボックスのnameが見つかった時
ed_point = InStr(st_point + 1, objClass.outerHTML, """")
checkbox_name = Mid(objClass.outerHTML, st_point, ed_point - st_point)
' チェックボックスが存在している時
If objIE.document.getElementsByName(checkbox_name).Length > 0 Then
' チェックボックスを選択
objIE.document.getElementsByName(checkbox_name)(0).Checked = True
Call WaitFor(1) ' 1秒停止
flg = True ' 注文有りフラグをセット
Exit For
End If
End If
End If
Next
i = i + 1 ' 次の行の注文を確認
If flg = True Then Exit Do ' 取消済の時はループを抜ける
Loop
If i = 1 Then ' 注文履歴がない時
work_code_cell.Interior.ColorIndex = org_color ' 退避していたセルの色を戻す
MsgBox "注文がありませんでした。"
Call MonexLogout(objIE) 'マネックス証券をログアウトしてIEを閉じる
Exit Sub
End If
If flg = False Then ' 該当銘柄の注文が無かった時
MsgBox "銘柄コード【" & work_code_cell & "】は注文されていません。"
End If
work_code_cell.Interior.ColorIndex = org_color ' 退避していたセルの色を戻す

CONTINUE: ' 次ループ処理ラベル
line_num = line_num + 1 ' 次の行の銘柄処理へ
Loop

' 一括取消ボタンをクリック
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

' 注文約定一覧をクリック
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


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


 「魔法使いの嫁」から、羽鳥 チセ(はとり・ちせ)ちゃんです。

TVアニメ『魔法使いの嫁』公式サイト

羽鳥チセ15歳。身寄りもなく、生きる希望も術も持たぬ彼女を金で買ったのはヒト為らざる魔法使いだった……。彼に『弟子』として、そして『花嫁』として招き入れられた時、少女の中で停まっていた針がゆっくりと動き始めていく――


 今のところ秋アニメの中で一番お気に入りの素敵な作品です。

 想像していたよりも世界観がしっかり造られていますし、ストーリー展開もテンポが良いですし、どんどん惹きこまれていってます。

 全体の雰囲気としてはシリアスながらも、ちょくちょく入ってくるコミカルなシーンにクスッとなってしまう感覚がまたたまりません。

 渋い感じのエリアスの声やちょっと脱力系な感じに落ち着いているチセちゃんの声も、この作品に良くあっているように感じます。

 いきなりドラゴンライダーにさらわれてしまったチセちゃんの命運は如何に!?って感じで次回放映が待ち遠しくて仕方がありません。


スポンサーサイト
個別株投資ExcelMONELIO魔法使いの嫁羽鳥チセ

0 Comments

Post a comment