質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

11498閲覧

HTMLElementCollection 実行時エラー 型が一致しません 原因

YusukeOkane

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/04/08 22:23

###前提・実現したいこと
EXCEL VBAで特定WEBページからデータを収集するシステムを作ってます。
HTMLから要素を抜き出す機能を実装中に以下エラーが発生しました。

###発生している問題・エラーメッセージ
実行時エラー’13’
型が一致しませn

###該当のソースコード
Option Explicit

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private objIE As InternetExplorer

Sub main()
Set objIE = New InternetExplorer
Dim url

url = "https://www.amazon.co.jp/gp/bestsellers/books/3257503051/" objIE.Visible = True objIE.Navigate2 (url) '読み込み完了待ち While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Sleep 100 Wend Sleep 100 Dim objDoc As HTMLElementCollection Set objDoc = objIE.document Dim element As IHTMLElement Dim row '書き込むセルの行数 row = 1 For Each element In objDoc.getElementsByClassName("a-fixed-left-grid-inner") 'シートに取得したタイトルの書き込み Worksheets(1).Cells(row, 1) = row Worksheets(1).Cells(row, 2) = element.Children(1).Children(1).innerText row = row + 1 Next element objIE.Quit Set objIE = Nothing

End Sub

###試したこと
プログラム自体は、以下URLの最下段「サポート情報欄」に掲載されているもの(2-1_対応版.txt)を使用。
http://www.sbcr.jp/products/4797389029.html

プログラム素人のため、この先、どう進めてよいのか分かりません。

###補足情報(言語/FW/ツール等のバージョンなど)
Winodows10 バージョン1607

Excel2010(Microsoft Office Home and Business2010)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Dim objDoc As HTMLElementCollection
Set objDoc = objIE.document

ここをコメントアウトして、それ以降のコードの objDoc を objIE.document に置き換えて実行してみてください

For Each element In objDoc.getElementsByClassName("a-fixed-left-grid-inner")

置換 ↓

For Each element In objIE.document.getElementsByClassName("a-fixed-left-grid-inner")

投稿2017/04/11 02:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YusukeOkane

2017/04/13 15:14

適格なアドバイスありがとうございました。 無事、情報を収集する事ができました。 ところで、今回ご教示いただいたコメントアウトや置換については、 どのような環境の場合に実施するのでしょうか? 環境によっては、そのまま起動する場合もあるかと思うので知りたいです。 よろしくお願いします。
guest

0

エラー箇所は"Dim objDoc As HTMLElementCollection",もしくは"Dim objDoc As HTMLDocument"との理解でよろしいでしょうか?
追記:
失礼、レスを付けようとして間違って回答欄を使ってしまいました。
あと、お使いのwindows10は何ビット環境でしょうか?

投稿2017/04/09 07:00

編集2017/04/09 07:11
larkpia

総合スコア138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YusukeOkane

2017/04/09 14:05

たびたびのご回答ありがとうございます。 情報が不足しており、申し訳ございません。 エラー個所は、以下となります。 Set objDoc = objIE.document Windows10は、64ビットオペレーティングシステムとなっておりました。 以上、よろしくお願いします。
larkpia

2017/04/09 14:32

objIE.document の型は Debug.Print TypeName(objIE.document) としたときに何が表示されるでしょうか? また、   Private objIE As InternetExplorer Set objIE = New InternetExplorer を Dim objIE As Object Set objIE = CreateObject("InternetExplorer.Application") と変えたらどうでしょうか?
YusukeOkane

2017/04/10 17:30

お忙しい中、度々のご回答ありがとうございます。 頂いたアドバイスに従って試してみましたが、 プログラム素人のため、上手く意味をくみ取れていない可能性がございます。 以下回答をご確認いただければ幸いです。 ★objIE.document の型は Debug.Print TypeName(objIE.document) としたときに何が表示されるでしょうか? →以下プログラムを実行する認識で良いでしょうか?  特にエラー等は発生していないようですが、実行しても何も表示されません。  実行後、どこを見て確認すればよいのでしょうか? Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'Private objIE As InternetExplorer Dim objIE As Object Sub main() 'Set objIE = New InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") Dim url url = "https://www.amazon.co.jp/gp/bestsellers/books/3257503051/" objIE.Visible = True objIE.Navigate2 (url) '読み込み完了待ち While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Sleep 100 Wend Sleep 100 '************************************************************ Debug.Print TypeName(objIE.document) objIE.Quit Set objIE = Nothing End Sub '************************************************************ ★ Private objIE As InternetExplorer  Set objIE = New InternetExplorerを  Dim objIE As Object  Set objIE = CreateObject("InternetExplorer.Application")  と変えたらどうでしょうか? 以下プログラムを実行しましたが、 やはり、以下エラーメッセージが出力されます。 ■エラー個所 Set objDoc = objIE.document ■エラーメッセージ 実行時エラー’13’ 型が一致しません。また、お時間のある時にご返信いただければ幸いです。 Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'Private objIE As InternetExplorer Dim objIE As Object Sub main() 'Set objIE = New InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") Dim url url = "https://www.amazon.co.jp/gp/bestsellers/books/3257503051/" objIE.Visible = True objIE.Navigate2 (url) '読み込み完了待ち While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Sleep 100 Wend Sleep 100 Dim objDoc As HTMLElementCollection '64bit環境 'Dim objDoc As HTMLDocument '32bit環境 Set objDoc = objIE.document Dim element As IHTMLElement Dim row '書き込むセルの行数 row = 1 For Each element In objDoc.getElementsByClassName("a-fixed-left-grid-inner") 'シートに取得したタイトルの書き込み Worksheets(1).Cells(row, 1) = row Worksheets(1).Cells(row, 2) = element.Children(1).Children(1).innerText row = row + 1 Next element objIE.Quit Set objIE = Nothing End Sub
larkpia

2017/04/11 00:59

デバッグとはプログラムの動作確認や、指定した位置での値の確認に使えるものです。 VBAのウィンドウの[表示]→[イミディエイトウィンドウ]でウィンドウの下部に、イミディエイトウィンドウが表示され、プログラムを実行することでDebag.Print() で指定した値が表示されます。上のプログラムではエラーが先に発生し、プログラムが動かない可能性がありますので、何も表示されないときは下記のプログラムを試してみてください。 Sub test2() Dim url url = "https://www.amazon.co.jp/gp/bestsellers/books/3257503051/" Private objIE As InternetExplorer Set objIE = New InternetExplorer objIE.Visible = True objIE.Navigate2 (url) '読み込み完了待ち Dim i i = 0 While objIE.readyState <> 4 Or objIE.Busy = True i = i + 1 DoEvents Sleep 100 If i Mod 10 = 0 Then Debug.Print "まだ" End If Wend Sleep 100 Debug.Print TypeName(objIE.document) objIE.Quit Set objIE = Nothing End Sub
guest

0

当方、windows7 64bit、excel2010 64bitの環境ですが、コピペのままで動きました。
"objIE"の型を調べてみたところ(下記参照)、HTMLDocument型だったため、"Dim objDoc As HTMLElementCollection"を"Dim objDoc As HTMLDocument"に変えてみてはどうでしょうか?

VBA

Sub test2() Dim url url = "https://www.amazon.co.jp/gp/bestsellers/books/3257503051/" Dim objIE As InternetExplorer Set objIE = New InternetExplorer objIE.Visible = True objIE.Navigate2 (url) '読み込み完了待ち Dim i i = 0 While objIE.readyState <> 4 Or objIE.Busy = True i = i + 1 DoEvents Sleep 100 If i Mod 10 = 0 Then Debug.Print "まだ" End If Wend Sleep 100 Debug.Print TypeName(objIE.document) objIE.Quit Set objIE = Nothing End Sub

イミディエイトウィンドウ

HTMLDocument

投稿2017/04/09 01:38

larkpia

総合スコア138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YusukeOkane

2017/04/09 05:51

larkpiaさn 早々のご回答ありがとうございました。 教えていただいた通り、プログラムを書き換えて実行しましたが、 同一個所で同一のエラーメッセージが表示されました。 ■プログラム Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private objIE As InternetExplorer Sub main() Set objIE = New InternetExplorer Dim url url = "https://www.amazon.co.jp/gp/bestsellers/books/3257503051/" objIE.Visible = True objIE.Navigate2 (url) '読み込み完了待ち While objIE.readyState <> READYSTATE_COMPLETE Or objIE.Busy = True DoEvents Sleep 100 Wend Sleep 100 'Dim objDoc As HTMLElementCollection 64bit環境 Dim objDoc As HTMLDocument '32bit環境 Set objDoc = objIE.document Dim element As IHTMLElement Dim row '書き込むセルの行数 row = 1 For Each element In objDoc.getElementsByClassName("a-fixed-left-grid-inner") 'シートに取得したタイトルの書き込み Worksheets(1).Cells(row, 1) = row Worksheets(1).Cells(row, 2) = element.Children(1).Children(1).innerText row = row + 1 Next element objIE.Quit Set objIE = Nothing End Sub ■エラーメッセージ 実行時エラー’13’ 型が一致しません。また、お時間のある時にご返信いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問