VBAでIEを操作し、指定のWebサイトへのログイン処理後、さらに別ページに遷移する処理を作成します。
※この記事ではSBI証券のマイページを用いて紹介していきますが、SBI証券のアカウントをお持ちでなくても大丈夫です。
【処理のイメージ】
Contents
Webサイトにログイン後、他のページに遷移する
この解説記事では、下記の2ステップの処理を作成します。
- SBI証券のマイページにログインする
- ログイン後のトップページから「ポートフォリオ」画面に遷移する
※SBI証券のアカウントをお持ちでなくても大丈夫なように紹介していきます!
(事前準備)参照設定
VBAでIEを操作するためには下記2つのライブラリを参照します。
- Microsoft HTML Object Library
- Microsoft Internet Controls
VBE(エディタ)で「メニュー」→「ツール」→「参照設定」を選択します。
IEを起動して目的のWebサイトにアクセスする
まずはお決まりの処理です。ここではSBI証券のログインページにアクセスします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub SBI_Login() Dim objIE As InternetExplorer Set objIE = New InternetExplorer objIE.Visible = True 'IEを表示 objIE.navigate "https://www.sbisec.co.jp/ETGate" Call WaitIE(objIE) 'ここ以降に後続の処理を記述する End Sub Sub WaitIE(objIE As InternetExplorer) Do While objIE.Busy = True Or objIE.readyState < 4 '読み込み待ち '4=READYSTATE_COMPLETE DoEvents Loop End Sub |
SBI証券のマイページにログインする処理
SBI証券に限らず、たいていのWebサイトはこのような作りになっていますね。
- 「ユーザーネーム」を入力
- 「パスワード」を入力
- 「ログインボタン」をクリック
ユーザーネームとパスワードを入力し、ログインボタンをクリックする処理を作成するために、HTMLを確認しましょう。
ユーザーネーム・パスワード入力欄のHTMLです。
1 2 3 4 |
<dt>ユーザーネーム</dt> <dd><div id="user_input"><input type="text" name="user_id" value="" onKeyPress="enterpress();" onfocus=Monc("UI")></div></dd> <dt>パスワード</dt> <dd><div id="password_input"><input type="password" name="user_password" maxlength="10" value="" onKeyPress="enterpress();" onfocus=Monc("PW") ></div></dd> |
ログインボタンのHTMLです。
1 |
<input type="image" src="(省略)" name="ACT_login" alt="ログイン" title="ログイン" class="ov" width="152" height="42" onclick="changeNWEBFLG();"> |
これらのHTMLで注目するのは、inputタグのname属性の値です。
- ユーザーネーム = user_id
- パスワード = user_password
- ログインボタン = ACT_login
これらの値をもとにログイン処理を作ります。HTMLドキュメントオブジェクトのgetElementByIdメソッドでname属性の値を指定します。
1 2 3 4 5 6 |
Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット htmlDoc.getElementById("user_id").Value = "xxxxx" 'ユーザーネーム htmlDoc.getElementById("user_password").Value = "xxxxx" 'パスワード htmlDoc.getElementById("ACT_login").Click 'ログイン |
ログイン処理完了の待機とHTMLの再読み込み
この時点で変数htmlDocは「ログインページ」のHTMLオブジェクトを参照しています。ログインボタンをクリックしたら、ログインページのHTMLはもう不要なので、参照を破棄します。
そして、ログイン処理には通常、数秒程度かかるので、処理完了まで待機します。
ログイン処理が完了して、ログイン後のページ(=トップページ)が表示されたら、トップページのHTMLドキュメントを再度読み込みます。
1 2 3 4 5 |
Set htmlDoc = Nothing 'ログインページのHTMLをいったん破棄 Call WaitIE(objIE) '画面遷移の待機 Set htmlDoc = objIE.document 'ログイン後のページのHTMLを読み込む |
name属性のないimgタグをクリックする方法
つづいて、トップページ上部にある「ポートフォリオ」をクリックする処理を作成します。
目的のボタン「ポートフォリオ」のHTMLを確認します。
1 |
<img src="(省略)" alt="ポートフォリオ" title="ポートフォリオ" width="117" height="30"> |
この「ポートフォリオ」ボタンはimgタグで作られています(ボタンのように見える画像)
name属性がない場合はalt属性の値を利用します。
imgタグを順番に取得して、alt属性の値が “ポートフォリオ” の場合クリックする処理を作ります。
1 2 3 4 |
Dim img As Object For Each img In htmlDoc.all.tags("img") If img.alt = "ポートフォリオ" Then img.Click Next |
コードまとめ
目的のWebサイトにログインし、さらに別ページに遷移する処理のまとめです!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Sub SBI_Login() Dim objIE As InternetExplorer Set objIE = New InternetExplorer objIE.Visible = True 'IEを表示 objIE.navigate "https://www.sbisec.co.jp/ETGate" Call WaitIE(objIE) Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット htmlDoc.getElementById("user_id").Value = "xxxxx" 'ユーザーネーム htmlDoc.getElementById("user_password").Value = "xxxxx" 'パスワード htmlDoc.getElementById("ACT_login").Click 'ログイン Set htmlDoc = Nothing 'ログインページのHTMLをいったん破棄 Call WaitIE(objIE) '画面遷移の待機 Set htmlDoc = objIE.document 'ログイン後のページのHTMLを読み込む 'ポートフォリオをクリック Dim img As Object For Each img In htmlDoc.all.tags("img") If img.alt = "ポートフォリオ" Then img.Click Next End Sub Sub WaitIE(objIE As InternetExplorer) Do While objIE.Busy = True Or objIE.readyState < 4 '読み込み待ち '4=READYSTATE_COMPLETE DoEvents Loop End Sub |
(おまけ)目的の画面のHTMLを直接取得する
そのページにたどり着くまで大変なんだよね
起動済みの画面のHTMLを取得する方法だよ