Webページ内の同じ属性の複数の要素を一度に配列に格納するVBAコード

スポンサーリンク

InternetExplorer(IE)をVBAで操作するには要素をオブジェクト型の変数に格納する

VBAを用いてIEを操作するにはウェブページから要素(タグ)を指定し、変数に格納する必要があります。

要素(タグ)を指定するには、それぞれの要素(タグ)に設定されているId属性やName属性などの情報を取得するgetElementByIdやgetElementsByName、getElementsByClassName、getElementsByTagNameなどを用います。

Id属性に関しては1つページに同じものは存在しないので問題ないのですが、Name属性、Class属性、Tag属性などは1ページに複数の要素が存在し、ページごとにいくつ存在するのかも決まっていません。

操作対象にすべてId属性が割り振られていれば問題ないのですが、Id属性がきちんと割り振られている要素は少なく、必然的に複数ある他の属性の中から特定のものを指定しなければならず、要素(タグ)の情報を取得し変数に格納する際のハードルの1つになっています。

この問題を解消するために、今回は同じ属性の要素を1度に配列に格納し、その要素数を取得するVBAコードを考えましたのでご紹介します。

同じName属性のものを一括で取得する

例として操作したいウェブページに下記のようにラジオボタンが用意されていたとします。ソースを確認していただければわかりますが、Name属性はいずれも「radio」としています。






このラジオボタンの1つめをクリックする際は下記のようなVBAコードとなります。

Sub 最初のラジオボタンクリック()

Dim colSh As Object
Dim win As Object
Dim objIE As Object
Dim txtInput As Object

Set colSh = CreateObject(“Shell.Application”)
For Each win In colSh.Windows
If TypeName(win.document) = “HTMLDocument” Then
If InStr(win.document.Title, “VBA(マクロ)で仕事を楽しく効率化”) > 0 Then
Set objIE = win
Exit For
End If
End If
Next

If objIE Is Nothing Then
MsgBox “入力するページが見つかりません”
Else

Set txtInput = objIE.document.getElementsbyName(“radio”)(0) ’0から始まる番号で同じName属性を持つタグを識別する
txtInput.Click

End If

End Sub

getElementsbyName(“radio”)の後の数字が何番目のタグかを認識させるものですが、注意しないといけないのはこの数字はインデックス番号と呼び、配列と同じく「0」から開始されます。
よって1番目のタグを取得する際は「0」を入力します。

今回のラジオボタンではわかりやすいですが、実際のウェブページにおいて、同じName属性の何番目かを確認するのは少し面倒ですし、同じ属性のものがいくつ存在するかを調べるのも難しいです。

そこで同じ属性のタグを一括で取得すると効率が良くなります。

スポンサーリンク

同じ属性のタグを一括で取得する方法

同じ属性のタグを一括で取得すれば、何番目のタグを取得したいのかもすぐにわかりますし、同じタグが全体でいくつ存在するのかも簡単に調べることができます。

手順は上記の一つのタグを取得する場合とほとんど同じですがインデックス番号を指定しないのが違いです。

Sub 六個のラジオボタンを順にクリック()

Dim colSh As Object
Dim win As Object
Dim objIE As Object
Dim txtInput As Object
Dim i as Long

Set colSh = CreateObject(“Shell.Application”)
For Each win In colSh.Windows
If TypeName(win.document) = “HTMLDocument” Then
If InStr(win.document.Title, “VBA(マクロ)で仕事を楽しく効率化”) > 0 Then
Set objIE = win
Exit For
End If
End If
Next

If objIE Is Nothing Then
MsgBox “入力するページが見つかりません”
Else

Set txtInput = objIE.document.getElementsbyName(“radio”)
For i = 0 To 5
txtInput(i).Click ’i+1番目のタグクリック
Sleep 1000 ’順番にチェックがつくのを見えるように待機時間
Next i

End If

End Sub

要素数を取得する方法

あまりスマートな方法ではないですが、下記の通り繰り返し処理を用ることで配列に格納した要素の数を取得することができます。
配列がNothingになる要素数を確認する方法になります。

UBound関数は私が試した限り使えませんでした。
また便利な方法を思いついたらご紹介します。

Sub 全てのラジオボタンを順にクリック()

Dim colSh As Object
Dim win As Object
Dim objIE As Object
Dim txtInput As Object
Dim i As Long
Dim 要素数 As Long

Set colSh = CreateObject(“Shell.Application”)
For Each win In colSh.Windows
If TypeName(win.document) = “HTMLDocument” Then
If InStr(win.document.Title, “VBA(マクロ)で仕事を楽しく効率化”) > 0 Then
Set objIE = win
Exit For
End If
End If
Next

If objIE Is Nothing Then
MsgBox “入力するページが見つかりません”
Else

Set txtInput = objIE.document.getElementsbyName(“radio”)

i = 0
Do Until txtInput(i) Is Nothing ’txtInput(i)に何も格納されていないところまでiを増加させる
i = i + 1
Loop

要素数 = i

For i = 0 To 要素数 – 1
txtInput(i).Click ’i+1番目のタグクリック
Sleep 1000 ’順番にチェックがつくのを見えるように待機時間

Next i

End If

End Sub

おすすめ書籍 (広告)

コメント