では前回の
IE操作【IE起動~読み込み】の続きで、
サンプルページのユーザーフォームの上から
「ハンドルネーム、生年月日、性別、使用した事のあるOS」の操作を解説していきたいと思います。
では
フォームの入力【コード】より下記のコードを抜き出して解説していきます。
'objIEのHTMLの中からinputのタグをobjに代入しながら確認
For Each obj In objIE.Document.GetElementsByTagName("input")
'ハンドルネームの記載
'objに代入されたinputタグのIDがh_nameだった場合
If obj.ID = "h_name" Then
'objに代入されたinputタグにhnameに代入したB2のセルの値を入れる
obj.Value = hname
End If
'生年月日の入力
'objに代入されたinputタグのIDがbirthdayだった場合
If obj.ID = "birthday" Then
'objに代入されたinputタグにbrdに代入したB3のセルの値を入れる
obj.Value = brd
End If
'性別の選択
'objに代入されたinputタグのInnerTextがB5のセルと同じだった場合
If Trim(obj.Value) = Worksheets("情報").Range("B4") Then
'objに代入されたinputタグを選択する
obj.Click
End If
'使用した事のあるOSの選択
'B5のセルが空白じゃなかった場合
If Range("B5") <> "" Then
'objに代入されたinputタグのInnerTextがB5のセルと同じだった場合
If obj.Value = Worksheets("情報").Range("B5") Then
'objに代入されたinputタグにチェックを入れる
obj.Checked = True
End If
End If
'C5のセルが空白じゃなかった場合
If Range("C5") <> "" Then
'objに代入されたinputタグのInnerTextがC5のセルと同じだった場合
If obj.Value = Worksheets("情報").Range("C5") Then
'objに代入されたinputタグにチェックを入れる
obj.Checked = True
End If
End If
'D5のセルが空白じゃなかった場合
If Range("D5") <> "" Then
'objに代入されたinputタグのInnerTextがD5のセルと同じだった場合
If obj.Value = Worksheets("情報").Range("D5") Then
'objに代入されたinputタグにチェックを入れる
obj.Checked = True
End If
End If
Next
まず、HTMLの基礎知識として、
【<input>~</input>】のように<>で囲まれた要素をタグといいます。
このタグには属性をつけることができ、IEの自動操作でよく使う属性としては「
id、name、value」などがあります。
例としてid="handle_name"と書いていた場合、id属性の値はhandle_nameとなり、このhandl_nameを特定し、このタグに操作をVBAで送る事で自動操作をするという事になります。
では一つ目のハンドルネームの記載の部分を実際のHTMLと比較しながら解説したいと思います。
ハンドルネームのHTML
<th>ハンドルネーム</th>
<input id="h_name" type="text">
VBAのコード
'objIEのHTMLの中からinputのタグをobjに代入しながら確認
For Each obj In objIE.Document.GetElementsByTagName("input")
'ハンドルネームの記載
'objに代入されたinputタグのIDがh_nameだった場合
If obj.ID = "h_name" Then
'objに代入されたinputタグにhnameに代入したB2のセルの値を入れる
obj.Value = hname
End If
上記のVBAのコードの上から順番に説明していきます。
【For Each obj In objIE.Document.GetElementsByTagName("input")】
上記コードを日本語で訳すと
「For Eachを使ってobjという変数にobjIEのドキュメント内からinputというタグ名の要素を代入しながら取り出してきてください。」ということになります。
つまり起動したIEのHTML内のinputというタグを全て確認してくれるのです。
次の
【If obj.ID = "h_name" Then】の部分では
「ForEachでobjに代入されたinputタグのID属性がh_nameの時」という処理になりますのでHTMLのinputタグのid属性を見てみてください。
h_nameとなっていますよね?
なのでid属性がh_nameになっているハンドルネームのinputタグに次の処理をします。
ではその次の処理にあたる
【obj.Value = hname】では、
【h_nameというIDのinputタグ=ユーザーフォームのハンドルネームの部分】に対して、hnameの変数に代入したB2のセルの内容を入力してくれます。
このようにHTMLのタグと属性からVBAで操作したい要素を特定し、処理をしていきます。
上記の部分を必ず覚えておいてください。
この基本さえわかれば、後はHTMLを確認しながら
「どうやって特定して、どうやって処理するか」をVBAでコーディングしてあげるだけで、IEの自動操作は出来るようになるのです。
では次の生年月日の部分に入りますね。
生年月日のHTML
<th>生年月日</th>
<input id="birthday" type="password">
VBAのコード
'生年月日の入力
'objに代入されたinputタグのIDがbirthdayだった場合
If obj.ID = "birthday" Then
'objに代入されたinputタグにbrdに代入したB3のセルの値を入れる。
obj.Value = brd
End If
こちらも先程のハンドルネームと同じです。
【If obj.ID = "birthday" Then】でobjに代入された要素のIDがbirthdayの場合、次の処理を実行と記載します。
上記のIfがTrueの時、次の
【obj.Value = brd】でbirthdayというIDのinputタグにbrdに代入したB3のセルの値を入力します。
この生年月日の入力のポイントとしては、先程のハンドルネームの入力の前にしている【For Each】と同じ【For Each】の中での処理になっています。
最初にしているForEachではinputタグ全てをまわっているので、何度も1からinputタグをまわるより、同じForEach内でそれぞれの要素に処理をした方が効率的ですよね?
なので
「同じタグ=1つのForEach内での処理」という事を心がけましょう。
ただし、例えば検索ボタンも同じinputタグだった場合、他のinputの要素への文字の入力より先に検索ボタンを押してしまうと、当然検索のキーワードなどは入ってないのに検索しますのでエラーになりますよね?
そういう時には一度ForEachをNextで閉じた後、新しく作ったForEachで同じタグの検索ボタンを実行することが必要になる場合もあります。
では次に性別の選択を説明します。
性別の選択のHTML
<th>性別</th>
<input name="sex" value="男性" type="radio"> 男性
<input name="sex" value="女性" type="radio"> 女性
VBAのコード
'性別の選択
'objに代入されたinputタグのInnerTextがB4のセルと同じだった場合
If Trim(obj.Value) = Worksheets("情報").Range("B4") Then
'objに代入されたinputタグを選択する
obj.Click
End If
こちらの性別の選択に関しては、ページ上でラジオボックスになっています。
このラジオボックスは単純にクリックしてしまえば選択できますので、
【If Trim(obj.Value) = Worksheets("情報").Range("B4") Then】でobjに代入されたinputタグのvalue属性の値がB4のセルと同じだった場合に処理します。
次の
【obj.Click】でobjに代入されたinputタグをクリックし、選択します。
注意点としては
Trim()を使っているところです。
例えばオブジェクトの特定の際、今回だとinputタグのvalue要素の男性の文字の前後にスペースが入っていた場合、一致しないとマクロが判断してしまいますので、Trim()でobj.Valueを囲んであげる事で文字の前後にあるスペースを削除してくれます。
他にもReplace()を使った方法などもありますが、それはまた別の記事で紹介したいと思います。
では最後に使ったことのあるOSの選択を解説したいと思います。
使用した事のあるOSの選択のHTML
<th>使用したことのあるOS</th>
<input name="os" value="Windows" type="checkbox"> Windows
<input name="os" value="Mac" type="checkbox"> Mac OSX
<input name="os" value="Linux" type="checkbox"> Linux
VBAのコード
'使用した事のあるOSの選択
'B5のセルが空白じゃなかった場合
If Range("B5") <> "" Then
'objに代入されたinputタグのInnerTextがB5のセルと同じだった場合
If obj.Value = Worksheets("情報").Range("B5") Then
'objに代入されたinputタグにチェックを入れる
obj.Checked = True
End If
End If
'C5のセルが空白じゃなかった場合
If Range("C5") <> "" Then
'objに代入されたinputタグのInnerTextがC5のセルと同じだった場合
If obj.Value = Worksheets("情報").Range("C5") Then
'objに代入されたinputタグにチェックを入れる
obj.Checked = True
End If
End If
'D5のセルが空白じゃなかった場合
If Range("D5") <> "" Then
'objに代入されたinputタグのInnerTextがD5のセルと同じだった場合
If obj.Value = Worksheets("情報").Range("D5") Then
'objに代入されたinputタグにチェックを入れる
obj.Checked = True
End If
End If
Next
最後のこちらはチェックボックスになっています。
こちらのチェックボックスは複数選択可能なので、配布しているExcelでも3つの項目を用意し、Excelの5列目に記載しているOSをチェックするようにしています。
では解説です。
【If Range("B5") <> "" Then】ではB5乗せるが空白ではなかった場合、次の処理を実行という記載になっています。
VBAの基本として、代入と等号は【=】、不等号は【<>】という事を覚えておいてください。
次の
【If obj.Value = Worksheets("情報").Range("B5") Then】では「objに代入されているinputタグのvalue要素がB5のセルと一致した時、次の処理を行なう」ということになります。
上記2つのIfがTrueの時、
【obj.Checked = True】で「B5のセルの値と同じvalue要素を持ったinputタグのチェックボックスのチェックを入れる」という処理をします。
このときの注意点としては
【Checked = True】を訳して
「チェックしている状態?⇒はい」というように、チェックボックスをチェックしてあげる必要があります。
残りの2つはC5やD5を上記の解説した部分と同じように処理しているだけです。
最後にNextでinputタグを代入していたForEachを閉じてあげる事を忘れないでくださいね。
かなり長くなりましたが、ここまでは大丈夫でしょうか?
この
「For Eachで全てのタグの中からIfで特定する」ということを覚えておけば基本的には応用するとIEの自動操作が出来るようになりますので、今回の記事ではこの事を覚えて次に進んでください。
次回はメモ欄への記載とExcelのバージョンの選択を解説していこうと思います。