どうも、マサヤです!
この記事は、VBAでのIE操作が初めて or 慣れていない方向けに『Webサイト・システムの情報を取得・設定する方法』をお伝えしていく連載記事となってます!
前回はWebサイトのテキストボックスへデータを入力する方法を紹介しました!
今回は「ラジオボタンのチェック方法と判別方法」をお伝えします!
チェック方法での気を付ける点も併せてお伝えしますよ!
【動画で確認】ラジオボタンをチェック・判定する方法
今回はサンプル用ページ内のラジオボタンに対して操作を行います。
では、VBAで操作したときの動画をご覧ください。
ラジオボタンをチェック・判定するコード
ラジオボタンをクリックするコードはこちら!
Sub ieSetRadioButton() 'IEオブジェクトを作成 Dim ie As InternetExplorer Set ie = CreateObject("InternetExplorer.Application") 'HTMLコレクションを取得 独自関数化 Call IeGetObj(ie, "https://mmm-program.com/vba-test-radioandcheckbox/") '方法1:性別を2番目の女性を選択。Clickメソッド ※要素番号は0から始めるので、2番目は1となる。 ie.document.getElementsByName("sex")(1).Click '方法2:年代をValueで20代と確認して選択。 For Each age In ie.document.getElementsByName("age") If age.Value = 20 And age.Type = "radio" Then age.Click Exit For End If Next 'チェックしている性別を判定後、取得してセルF8へ代入 For Each sex In ie.document.getElementsByName("sex") If sex.Checked = True Then Range("F8") = sex.Value Exit For End If Next 'チェックしている年代を判定後、取得してセルG8へ代入 For Each age In ie.document.getElementsByName("age") If age.Checked = True Then Range("G8") = age.Value Exit For End If Next 'オブジェクトを閉じる ie.Quit 'メモリからオブジェクトを破棄 Set ie = Nothing End Sub '指定URLのオブジェクトを取得する独自関数 Sub IeGetOb(obj, url, Optional vFlg As Boolean = True) 'IEを表示(見えるようにする) obj.Visible = vFlg '指定したURLをIEで開く obj.Navigate url 'サイトの読み込みが完了するまで待つ Do While obj.Busy = True Or obj.readyState < READYSTATE_COMPLETE DoEvents Loop End Sub
まずは、ラジオボタン要素取得の考え方と注意点を確認しましょう。
Name属性でラジオボタン要素を取得
チェックするにはHTMLからラジオボタン要素を探す必要がありますが、ラジオボタンの場合は比較的簡単です。
ラジオボタンはボタン同士の関連性を持たせるため、基本的にName属性が付与されています。
サンプルサイトのHTMLでもName属性が下記のように付与されています。
<p><input name="sex" type="radio" value="男"> 男 <input name="sex" type="radio" value="女"> 女</p>
Nameが付与されているということは、メソッド「getElementByName」を使用すれば取得できますね。
Type:radioでラジオボタン以外のName要素を除外する
Nameで取得できるのですが注意する点があります。
ページ内で同じNameがラジオボタン以外にも使用されている場合は、getElementBynameだけでは指定したいラジオボタンかどうかを判別できません。
対処法としては、Typeでラジオボタンかを判別することでラジオボタンかどうかを区別することができます。
具体的な対処法は後述している方法2で解説します。
Clickメソッドでチェック
では、コードの主要部分を解説していきます。
解説していないコードで、解らない点があればこれまでのIE操作編を確認しましょう。
2つのチェック方法を紹介します。
- 方法1:順番でチェック ⇒ チェックする箇所(要素番号)が決まっている際に使用。
- 方法2:Valueでチェック ⇒ チェックする箇所が変動する or 同じNameが複数使われている。
方法1:順番でチェック
ページ内でName属性がラジオボタンのみで利用されている場合のチェック方法です。
'方法1:性別を2番目の女性を選択。Clickメソッド ※要素番号は0から始めるので、2番目は1となる。 ie.document.getElementsByName("sex")(1).Click
ページ内でラジオボタン以外に同じNameが利用されていないため要素番号で指定が可能です。
チェックする箇所が決まっている際は、記述が簡単に済むこの方法がおススメです。
方法2:Valueで判別してチェック
ラジオボタン以外で同じNameが使われいる or チェックする項目が変わる場合の方法です。
'方法2:年代をValueで20代と確認して選択。 For Each age In ie.document.getElementsByName("age") If age.Value = 20 And age.Type = "radio" Then age.Click Exit For End If Next
Valueプロパティでチェックしたい項目を探し、かつTypeプロパティがradioであるオブジェクトにチェックを入れています。
処理の流れとしては下記になります。
- getElementByNameでName属性にageが付与されているコレクションを取得。
- 取得したコレクションをFor Eachでループ。
- Valueでチェックしたい項目を探し、かつTypeプロパティがradioかどうかを確認
- 3の条件に一致したコレクションに対し、Clickメソッドでチェックを入れる
- チェック後はExit Forで処理を抜ける(一つにチェックが入れば以降の処理は不要のため)
Checkedメソッドでチェック箇所を判別
下記コードにある通り、Checkedメソッドでチェックされているボタンを確認できます。
If sex.Checked = True Then Range("F8") = sex.Value Exit For End If
紹介したコードではCheckedで確認し、チェックされているラジオボタンのValueをセルに出力しています。
Checkedメソッドでチェックは要注意!
実は、下記のようにClickメソッドをCheckedメソッドに置き換えてもチェックができます。
↓
age.Checked = True
javascriptが動かない(反映しない)
ただ、注意が必要な点があります。
ラジオボタンのチェックと連動してテキストボックスが出現させるといったJavaScriptが存在した場合、Checkedメソッドを使うとJavaScriptが動きません。
なので、チェックと連動して動的に入力フォームが変わる場合はClickメソッドを使いましょう。
まとめ
ラジオボタンのチェックと判別方法の流れは簡単にまとめると、
さて、次回はチェックボックスのチェック方法と判別方法をお伝えしていきますね!
コメント
はじめまして。IEのサポート終了が間近という事で、他のEdgeやChromeでも
代替できるのでしょうか。
はじめまして!今のコードのままでは出来ないですね。
私もChomeをVBAで操作しようと試みたことがあるのですが出来ませんでした。
ただ調べてみると、IE以外のブラウザを操作する際はSeleniumBasicを使うと操作できそうですね。
※インストールが必要になるので会社で使う場合なは社内ルールとかでダメな場合があるかもしれません。