Excel VBAでオブジェクト指向プログラミング(HTMLドキュメント編)

2024-01-05

■HTMLDocumentオブジェクトとは

HTMLDocumentオブジェクトはMicrosoftから提供されている、HTML関連オブジェクトの中で最上位に位置するオブジェクト(クラス)であり、HTML文書に関する機能が集約されています。
HTMLDocumentオブジェクトの下位オブジェクト(サブクラス)は下表の通りですが、後述するサンプル・プログラムで使用しているHTMLDocumentオブジェクト、IHTMLDocument2オブジェクト、IHTMLElementオブジェクトについて概要を説明します。
⇒詳細はMicrosoftのサイト(HtmlDocument クラス)を参照して下さい。

HTMLDocumentオブジェクトの階層構造

HTMLDocumentオブジェクトの下位オブジェクト(サブクラス)は下表の通りです。

HTMLDocumentオブジェクト
IDOMEventオブジェクト
IDOMNodeIteratorオブジェクト
IDOMProcessingInstructionオブジェクト
IDOMTreeWalkerオブジェクト
IHTMLDocument2オブジェクト
IHTMLDOMAttributeオブジェクト
IHTMLDOMChildrenCollectionオブジェクト
IHTMLDOMNodeオブジェクト
IHTMLDOMNode3オブジェクト
IHTMLDOMRangeオブジェクト
IHTMLElementオブジェクト
IHTMLElement2オブジェクト
IHTMLElementCollectionオブジェクト
IHTMLEventObjオブジェクト
IHTMLRenderStyleオブジェクト
IHTMLSelectionオブジェクト
IHTMLStyleSheetオブジェクト

■HTMLDocumentオブジェクトの詳細

HTML文書の文書全体を読み込む際には最初にHTMLDocumentオブジェクトをインスタンス化し、CreateDocumentFromUrlメソッドでIHTMLDocument2オブジェクトを取得しますが、個々の要素を取り扱う場合にはIHTMLElementオブジェクトを使用します。

HTMLDocumentオブジェクトを使用するための手順

HTMLDocumentオブジェクトを使用するための事前準備は、以下の3ステップです。
⇒オブジェクトを使用するための事前準備とオブジェクトブラウザによる調査方法については、Excel VBAでオブジェクト指向プログラミング(事前準備編)を参照して下さい。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでMicrosoft HTML Object Libraryのチェックボックスにチェックを入れ、[OK]ボタンを押下。

②オブジェクト変数の定義
プログラムの宣言部でオブジェクト変数を定義。

  1. Dim htmldoc As Object

③インスタンスの生成
プログラムの処理部でインスタンスを生成。

  1. Set htmldoc = New HTMLDocument
  2. 'ここにオブジェクトを使用した処理を記述
  3. Set htmldoc = Nothing

(参考)「Set htmldoc = New HTMLDocument」の部分を「Set htmldoc = CreateObject(“htmlfile")」と記述すれば、ステップ①(ライブラリの参照設定)は不要です。

CreateDocumentFromUrlメソッド

HTMLDocumentオブジェクトのCreateDocumentFromUrlメソッドを実行すると、HTML文書をIHTMLDocument2オブジェクトとして取得できます。

  1. Set doc = htmldoc.createDocumentFromUrl(bstrURL As String, bstrOptions As String) As IHTMLDocument2

引数として指定できる項目は下表の通りです。

引数 説明
bstrURL URL
(HTML文書を取得したいURLをString型で指定)
bstrOptions メディアタイプ(Printまたはnull)
(vbNullStringを指定)

■IHTMLDocument2オブジェクトの詳細

IHTMLDocument2オブジェクトには多くのメソッドとプロパティがありますが、後述するサンプル・プログラムで使用しているものを中心に主なものを下表に掲載します。

IHTMLDocument2オブジェクトのメソッド

IHTMLDocument2オブジェクトで提供されているメソッドおよび定義内容は、下表の通りです。

clearメソッド
Sub clear()
closeメソッド
Sub close()
createElementメソッド
Function createElement(eTag As String) As IHTMLElement
createStyleSheetメソッド
Function createStyleSheet([bstrHref As String], [lIndex As Long = -1]) As IHTMLStyleSheet
elementFromPointメソッド
Function elementFromPoint(x As Long, y As Long) As IHTMLElement
execCommandメソッド
Function execCommand(cmdID As String, [showUI As Boolean = False], [value]) As Boolean
execCommandShowHelpメソッド
Function execCommandShowHelp(cmdID As String) As Boolean
openメソッド
Function open([url As String = “text/html"], [name], [features], [replace]) As Object
openメソッド
Function open([url As String = “text/html"], [name], [features], [replace]) As Object
queryCommandEnabledメソッド
Function queryCommandEnabled(cmdID As String) As Boolean
queryCommandIndetermメソッド
Function queryCommandIndeterm(cmdID As String) As Boolean
queryCommandStateメソッド
Function queryCommandState(cmdID As String) As Boolean
queryCommandSupportedメソッド
Function queryCommandSupported(cmdID As String) As Boolean
queryCommandTextメソッド
Function queryCommandText(cmdID As String) As String
queryCommandValueメソッド
Function queryCommandValue(cmdID As String)
toStringメソッド
Function toString() As String
writeメソッド
Sub write(ParamArray psarray() As Variant)
writelnメソッド
Sub writeln(ParamArray psarray() As Variant)

IHTMLDocument2オブジェクトのプロパティ

IHTMLDocument2オブジェクトで提供されているプロパティのうち、次項で説明するIHTMLElementオブジェクトに関連するプロパティおよび定義内容は、下表の通りです。

activeElementプロパティ(読み取り専用)
Property activeElement As IHTMLElement
allプロパティ(読み取り専用)
Property all As IHTMLElementCollection
anchorsプロパティ(読み取り専用)
Property anchors As IHTMLElementCollection
appletsプロパティ(読み取り専用)
Property applets As IHTMLElementCollection
bodyプロパティ(読み取り専用)
Property body As IHTMLElement
embedsプロパティ(読み取り専用)
Property embeds As IHTMLElementCollection
formsプロパティ(読み取り専用)
Property forms As IHTMLElementCollection
imagesプロパティ(読み取り専用)
Property images As IHTMLElementCollection
linksプロパティ(読み取り専用)
Property links As IHTMLElementCollection
scriptsプロパティ(読み取り専用)
Property scripts As IHTMLElementCollection

■IHTMLElementオブジェクトの詳細

IHTMLElementオブジェクトで提供されているメソッドおよびプロパティは以下の通りです。

IHTMLElementオブジェクトのメソッド

IHTMLElementオブジェクトで提供されているメソッドおよび定義内容は、下表の通りです。

clickメソッド
Sub click()
containsメソッド
Function contains(pChild As IHTMLElement) As Boolean
getAttributeメソッド
Function getAttribute(strAttributeName As String, [lFlags As Long])
insertAdjacentHTMLメソッド
Sub insertAdjacentHTML(where As String, html As String)
insertAdjacentTextメソッド
Sub insertAdjacentText(where As String, text As String)
removeAttributeメソッド
Function removeAttribute(strAttributeName As String, [lFlags As Long = 1]) As Boolean
scrollIntoViewメソッド
Sub scrollIntoView([varargStart])
setAttributeメソッド
Sub setAttribute(strAttributeName As String, AttributeValue, [lFlags As Long = 1])
toStringメソッド
Function toString() As String

IHTMLElementオブジェクトのプロパティ

IHTMLElementオブジェクトで提供されているプロパティおよび定義内容は、下表の通りです。

allプロパティ(読み取り専用)
Property all As Object
childrenプロパティ(読み取り専用)
Property children As Object
classNameプロパティ
Property className As String
documentプロパティ(読み取り専用)
Property document As Object
filtersプロパティ(読み取り専用)
Property filters As IHTMLFiltersCollection
idプロパティ
Property id As String
innerHTMLプロパティ
Property innerHTML As String
innerTextプロパティ
Property innerText As String
isTextEditプロパティ(読み取り専用)
Property isTextEdit As Boolean
langプロパティ
Property lang As String
languageプロパティ
Property language As String
offsetHeightプロパティ(読み取り専用)
Property offsetHeight As Long
offsetLeftプロパティ(読み取り専用)
Property offsetLeft As Long
offsetParentプロパティ(読み取り専用)
Property offsetParent As IHTMLElement
offsetTopプロパティ(読み取り専用)
Property offsetTop As Long
offsetWidthプロパティ(読み取り専用)
Property offsetWidth As Long
onafterupdateプロパティ
Property onafterupdate As Variant
onbeforeupdateプロパティ
Property onbeforeupdate As Variant
onclickプロパティ
Property onclick As Variant
ondataavailableプロパティ
Property ondataavailable As Variant
ondatasetchangedプロパティ
Property ondatasetchanged As Variant
ondatasetcompleteプロパティ
Property ondatasetcomplete As Variant
ondblclickプロパティ
Property ondblclick As Variant
ondragstartプロパティ
Property ondragstart As Variant
onerrorupdateプロパティ
Property onerrorupdate As Variant
onfilterchangeプロパティ
Property onfilterchange As Variant
onhelpプロパティ
Property onhelp As Variant
onkeydownプロパティ
Property onkeydown As Variant
onkeypressプロパティ
Property onkeypress As Variant
onkeyupプロパティ
Property onkeyup As Variant
onmousedownプロパティ
Property onmousedown As Variant
onmousemoveプロパティ
Property onmousemove As Variant
onmouseoutプロパティ
Property onmouseout As Variant
onmouseoverプロパティ
Property onmouseover As Variant
onmouseupプロパティ
Property onmouseup As Variant
onrowenterプロパティ
Property onrowenter As Variant
onrowexitプロパティ
Property onrowexit As Variant
onselectstartプロパティ
Property onselectstart As Variant
outerHTMLプロパティ
Property outerHTML As String
outerTextプロパティ
Property outerText As String
parentElementプロパティ(読み取り専用)
Property parentElement As IHTMLElement
parentTextEditプロパティ(読み取り専用)
Property parentTextEdit As IHTMLElement
recordNumberプロパティ(読み取り専用)
Property recordNumber As Variant
sourceIndexプロパティ(読み取り専用)
Property sourceIndex As Long
styleプロパティ(読み取り専用)
Property style As IHTMLStyle
tagNameプロパティ(読み取り専用)
Property tagName As String
titleプロパティ
Property title As String

■HTMLソースをExcelシートに表示する処理

HTMLDocumentオブジェクトを使用して、URL指定でHTML文書を読み込み、HTMLソースを表示するExcelツールです。

処理の概要

処理の流れは以下の通りです。
①HTMLDocumentオブジェクトを作成後、URL指定でHTML文書を読み込み
②HTML文書を行単位で配列に格納し、配列の各要素をExcelシートにセット
③使用済のオブジェクトを破棄

サンプル・プログラム

行番号10でHTMLDocumentオブジェクトを作成し、行番号11~15でHTML文書を取得しています。
行番号11ではHTMLDocumentオブジェクトのcreateDocumentFromUrlメソッドによりHTML文書全体の取得を要求し、行番号12~14で処理の完了を待った後、行番号15でbody部分のソースをString型の変数に代入しています。
行番号16でHTML文書を行単位に分割して配列に格納し、行番号19~22で配列の各要素をExcelシートにセットしています。

(注)HTMLDocumentオブジェクト用のオブジェクト変数を定義する際、行番号1で「Dim sht, htmldoc, doc As Object」と定義したところ、正しく動作しないケースがあったため、行番号2で「Dim htmldoc As MSHTML.HTMLDocument」、行番号3で「Dim doc As MSHTML.IHTMLDocument2」と厳格な定義を行っています。

  1. Dim sht As Object
  2. Dim htmldoc As MSHTML.HTMLDocument
  3. Dim doc As MSHTML.IHTMLDocument2
  4. Dim tbl As Variant
  5. Dim strTEXT As String
  6. Dim i, cnt As Integer
  7. Private Sub Sample1()
  8.     Set sht = ActiveSheet
  9.     Set htmldoc = New HTMLDocument
  10.     Set doc = htmldoc.createDocumentFromUrl(“https://xxx", vbNullString)
  11.     Do While doc.readyState <> “complete"
  12.         DoEvents
  13.     Loop
  14.     strTEXT = doc.body.innerHTML
  15.     tbl = Split(strTEXT, vbLf)
  16.     cnt = 0
  17.     For i = 0 To UBound(tbl)
  18.         cnt = cnt + 1
  19.         sht.Cells(cnt, 1) = tbl(i)
  20.     Next i
  21.     Set doc = Nothing
  22.     Set htmldoc = Nothing
  23. End Sub

■HTMLテキストをExcelシートに表示する処理

HTMLDocumentオブジェクトを使用して、URL指定でHTML文書を読み込み、HTMLテキストを表示するExcelツールです。

処理の概要

処理の流れは以下の通りです。
①HTMLDocumentオブジェクトを作成後、URL指定でHTMLテキストを読み込み
②HTMLテキストを行単位で配列に格納し、配列の各要素をExcelシートにセット
③使用済のオブジェクトを破棄

サンプル・プログラム

行番号10でHTMLDocumentオブジェクトを作成し、行番号11~15でHTML文書を取得しています。
行番号11ではHTMLDocumentオブジェクトのcreateDocumentFromUrlメソッドによりHTML文書全体の取得を要求し、行番号12~14で処理の完了を待った後、行番号15でbody部分のテキストをString型の変数に代入しています。
行番号16でHTML文書を行単位に分割して配列に格納し、行番号19~22で配列の各要素をExcelシートにセットしています。
(前項のサンプル・プログラムとの相違点は、行番号15だけです)

  1. Dim sht As Object
  2. Dim htmldoc As MSHTML.HTMLDocument
  3. Dim doc As MSHTML.IHTMLDocument2
  4. Dim tbl As Variant
  5. Dim strTEXT As String
  6. Dim i, cnt As Integer
  7. Private Sub Sample2()
  8.     Set sht = ActiveSheet
  9.     Set htmldoc = New HTMLDocument
  10.     Set doc = htmldoc.createDocumentFromUrl(“https://xxx", vbNullString)
  11.     Do While doc.readyState <> “complete"
  12.         DoEvents
  13.     Loop
  14.     strTEXT = doc.body.innerText
  15.     tbl = Split(strTEXT, vbLf)
  16.     cnt = 0
  17.     For i = 0 To UBound(tbl)
  18.         cnt = cnt + 1
  19.         sht.Cells(cnt, 1) = tbl(i)
  20.     Next i
  21.     Set doc = Nothing
  22.     Set htmldoc = Nothing
  23. End Sub

■HTMLソースから画像ファイルのURLを抽出し、Excelシートにハイパーリンクを設定する処理

HTMLDocumentオブジェクトを使用して、URL指定でHTML文書を読み込み、取得したHTMLソースから画像ファイルのURLを抽出し、Excelシートにハイパーリンクを設定するExcelツールです。

処理の概要

処理の流れは以下の通りです。
①HTMLDocumentオブジェクトを作成後、URL指定でHTMLテキストを読み込み
②HTMLソースを検索して画像ファイルのURLを抽出し、Excelシートにハイパーリンクを設定
③使用済のオブジェクトを破棄

サンプル・プログラム

行番号10でHTMLDocumentオブジェクトを作成し、行番号11~15でHTML文書を取得しています。
行番号11ではHTMLDocumentオブジェクトのcreateDocumentFromUrlメソッドによりHTML文書全体の取得を要求し、行番号12~14で処理の完了を待った後、行番号15でbody部分のソースをString型の変数に代入しています。
行番号16でHTML文書を行単位に分割して配列に格納し、行番号18~32で画像ファイルのURLを検索し、ExcelシートのA1セルにハイパーリンクを設定しています。
このサンプル・プログラムでは、<img ~ src="https://xxx.jpg" ~>という形式の文字列を検索しているため、行番号19~20で「<img 」、行番号23で「src=」、行番号24~25で「.jpg」を検索し、行番号26~27でExcelシートのA1セルにハイパーリンクを設定しています。

  1. Dim sht As Object
  2. Dim htmldoc As MSHTML.HTMLDocument
  3. Dim doc As MSHTML.IHTMLDocument2
  4. Dim tbl1, tbl2 As Variant
  5. Dim strTEXT As String
  6. Dim i, j, pos As Integer
  7. Private Sub Sampl3()
  8.     Set sht = ActiveSheet
  9.     Set htmldoc = New HTMLDocument
  10.     Set doc = htmldoc.createDocumentFromUrl(“https://xxx", vbNullString)
  11.     Do While doc.readyState <> “complete"
  12.         DoEvents
  13.     Loop
  14.     strTEXT = doc.body.innerHTML
  15.     tbl1 = Split(strTEXT, vbLf)
  16.     For i = 0 To UBound(tbl1)
  17.         pos = InStr(tbl1(i), “<img “)
  18.         If pos > 0 Then
  19.             tbl2 = Split(tbl1(i), " “)
  20.             For j = 0 To UBound(tbl2)
  21.                 If Left(tbl2(j), 4) = “src=" Then
  22.                     pos = InStr(tbl2(j), “.jpg")
  23.                     If pos > 0 Then
  24.                         sht.Range(“A1") = Mid(tbl2(j), 6, Len(tbl2(j)) – 6)
  25.                         sht.Hyperlinks.Add Anchor:=sht.Range(“A1"), Address:=sht.Range(“A1").Value
  26.                     End If
  27.                 End If
  28.             Next j
  29.         End If
  30.     Next i
  31.     Set doc = Nothing
  32.     Set htmldoc = Nothing
  33. End Sub

XMLHTTPオブジェクトを使用したHTML文書の取得方法

XMLHTTPオブジェクトは、MicrosoftのXMLドキュメント・オブジェクト・モデル(DOM)に含まれているオブジェクトで、以下のメソッドおよびプロパティが提供されています。
⇒詳細はMicrosoftのサイト(XMLドキュメント・オブジェクト・モデル(DOM))を参照して下さい。

XMLHTTPオブジェクトのメソッド

XMLHTTPオブジェクトで提供されているメソッドおよび定義内容は、下表の通りです。

abortメソッド
Sub abort()
getAllResponseHeadersメソッド
Function getAllResponseHeaders() As String
getResponseHeaderメソッド
Function getResponseHeader(bstrHeader As String) As String
openメソッド
Sub open(bstrMethod As String, bstrUrl As String, [varAsync], [bstrUser], [bstrPassword])
sendメソッド
Sub send([varBody])
setRequestHeaderメソッド
Sub setRequestHeader(bstrHeader As String, bstrValue As String)

XMLHTTPオブジェクトのプロパティ

XMLHTTPオブジェクトで提供されているプロパティおよび定義内容は、下表の通りです。

onreadystatechangeプロパティ
Property onreadystatechange As Object
readyStateプロパティ(読み取り専用)
Property readyState As Long
responseBodyプロパティ(読み取り専用)
Property responseBody As Variant
responseStreamプロパティ(読み取り専用)
Property responseStream As Variant
responseTextプロパティ(読み取り専用)
Property responseText As String
responseXMLプロパティ(読み取り専用)
Property responseXML As Object
statusプロパティ(読み取り専用)
Property status As Long
statusTextプロパティ(読み取り専用)
Property statusText As String

XMLHTTPオブジェクトを使用して、HTMLソースをExcelシートに表示する処理

ここではXMLHTTPオブジェクトを使用して、HTMLソースをExcelシートに表示するためのサンプルプログラムをご紹介します。

①ライブラリの参照設定
Visual Basic Editor(VBE)のファイルメニューから[ツール]-[参照設定]を選択し、参照設定ダイアログでMicrosoft XML. v6.0 Libraryのチェックボックスにチェックを入れ、[OK]ボタンを押下。

(参考)サンプル・プログラムの行番号8「Set xmlhttp = New XMLHTTP60」の部分を
「Set xmlhttp = CreateObject(“MSXML2.XMLHTTP")]と記述すれば、ライブラリの参照設定は不要です。

②サンプル・プログラム
行番号8でXMLHTTPオブジェクトを作成し、行番号9~14でHTML文書を取得しています。
行番号9でOpenメソッド、行番号10でSendメソッドを実行後、行番号11~13で処理の完了を待った(※)後、行番号14でbody部分のソースをString型の変数に代入しています。
行番号15でHTML文書を行単位に分割して配列に格納し、行番号18~21で配列の各要素をExcelシートにセットしています。

(※)readyStateプロパティの戻り値は、「0:UNINITIALIZED、1:LOADING、2:LOADED、3:INTERACTIVE、4:COMPLETED」と定義されています。

  1. Dim sht, xmlhttp As Object
  2. Dim tbl As Variant
  3. Dim strTEXT As String
  4. Dim i, cnt As Integer
  5. Private Sub Sample4()
  6.     Set sht = ActiveSheet
  7.     Set xmlhttp = New XMLHTTP60
  8.     xmlhttp.Open “GET", “https://xxx"
  9.     xmlhttp.Send
  10.     Do While xmlhttp.readyState <> 4
  11.         DoEvents
  12.     Loop
  13.     strTEXT = xmlhttp.responseText
  14.     tbl = Split(strTEXT, vbLf)
  15.     cnt = 0
  16.     For i = 0 To UBound(tbl)
  17.         cnt = cnt + 1
  18.         sht.Cells(cnt, 1) = tbl(i)
  19.     Next i
  20.     Set xmlhttp = Nothing
  21. End Sub

XMLHTTPオブジェクトとHTMLDocumentオブジェクトを使用して、HTMLテキストをExcelシートに表示する処理

XMLHTTPオブジェクトを使用して、URL指定でHTML文書を読み込み、取得したHTMLソースをHTMLDocumentオブジェクトに書き込んで、HTMLテキストを取得するExcelツールです。

処理の概要

処理の流れは以下の通りです。
①XMLHTTPオブジェクトを作成し、URL指定でHTMLソースを読み込み
②HTMLDocumentオブジェクトを作成し、HTMLソースを書き込んだ後、HTMLテキストを読み込み
③HTMLテキストを行単位で配列に格納し、配列の各要素をExcelシートにセット
④使用済のオブジェクトを破棄

(補足)XMLHTTPオブジェクトを使用した方がHTMLソースの取得に要する時間が短いのですが、XMLHTTPオブジェクトにはHTMLテキストを返す機能がないため、HTMLDocumentオブジェクトに書き込んでHTMLテキストを取得しています。

サンプル・プログラム

行番号8でXMLHTTPオブジェクトを作成し、行番号9~14でHTML文書を取得しています。
行番号9でOpenメソッド、行番号10でSendメソッドを実行後、行番号11~13で処理の完了を待った後、行番号14でbody部分のソースをString型の変数に代入しています。
行番号16でHTMLDocumentオブジェクトを作成し、行番号17でHTMLソースを書き込み、行番号18でbody部分のテキストをString型の変数に代入しています。
行番号19でHTML文書を行単位に分割して配列に格納し、行番号22~25で配列の各要素をExcelシートにセットしています。

(注)HTMLDocumentオブジェクト用のオブジェクト変数を定義する際、前掲のサンプル・プログラムと同様に「Dim htmldoc As MSHTML.HTMLDocument」と定義したところ、Writeメソッドの箇所でエラーになったため、行番号1で「Dim sht, xmlhttp, htmldoc As Object」とアバウトな定義をしています。

  1. Dim sht, xmlhttp, htmldoc As Object
  2. Dim tbl As Variant
  3. Dim strTEXT As String
  4. Dim i, cnt As Integer
  5. Private Sub Sample5()
  6.     Set sht = ActiveSheet
  7.     Set xmlhttp = New XMLHTTP60
  8.     xmlhttp.Open “GET", “https://xxx"
  9.     xmlhttp.Send
  10.     Do While xmlhttp.readyState <> 4
  11.         DoEvents
  12.     Loop
  13.     strTEXT = xmlhttp.responseText
  14.     Set htmldoc = New HTMLDocument
  15.     htmldoc.Write strTEXT
  16.     strTEXT = htmldoc.getElementsByTagName(“body")(0).innerText
  17.     tbl = Split(strTEXT, vbLf)
  18.     cnt = 0
  19.     For i = 0 To UBound(tbl)
  20.         cnt = cnt + 1
  21.         sht.Cells(cnt, 1) = tbl(i)
  22.     Next i
  23.     Set htmldoc = Nothing
  24.     Set xmlhttp = Nothing
  25. End Sub

国本温子(著),緑川吉行(著),できるシリーズ編集部(著)
出版社:インプレス
発売日:2022/3/23
単行本(ソフトカバー):A5判/912ページ

大村あつし(著),古川順平(著)
出版社:技術評論社
発売日:2021/1/9
単行本(ソフトカバー):A5判/800ページ

高橋宣成(著)
出版社:技術評論社
発売日:2019/11/25
単行本(ソフトカバー):B5変形判/576ページ