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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

3回答

13947閲覧

エクセルVBAでのスクレイピング時のエラー(実行時エラー '13' 型が一致しません)の対処について

YYYQQQ

総合スコア54

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2017/11/21 15:37

VBAでのスクレイピング時にエラーが起こるパソコンがあります。

エラーが起きないパソコンもあり、対処法がさっぱりわかりません。
どなたかアドバイスお願いいたします。

プログラムが使えているパソコンの環境:
・Windows10 Home 64bit(32bitのパソコンでも確認済み)
・Excel 2016 32ビット
・Internet Explorer 11.0.47

プログラムが使えていないパソコンの環境:
・Windows10 Home 64bit
・Excel 2016 32ビット
・Internet Explorer 11.0.47

以下VBAのソースで、エラーが起こる箇所は
「 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット」というところです。

何卒アドバイスの程よろしくお願いいたします。


Option Explicit
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim sheet_command As Worksheet
Dim book_list As Workbook
Public sheet_list As Worksheet
Dim filePath_list As String
Dim filename_list As String
Dim dirFlag As Boolean

'## WEBページ内容取得準備
Function initWebPageOperation() As InternetExplorer
Dim objIE As New InternetExplorer 'IEオブジェクトを準備

'Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット

' objIE.Visible = True 'IEを表示
objIE.Visible = False 'IEを非表示

Set initWebPageOperation = objIE

End Function

'## URL指定でのWEBページ内容取得
Function getWebPageData(objIE As InternetExplorer, url As String) As HTMLDocument
Dim htmlDoc As New HTMLDocument 'HTMLドキュメントオブジェクトを準備
objIE.navigate url 'IEでURLを開く
'Call waitIE(objIE)
Sleep 1000
Do While objIE.Busy And objIE.readyState = 4
Sleep 100
Loop
Sleep 1000
Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット

Set getWebPageData = htmlDoc Set htmlDoc = Nothing

End Function

'## IE表示待機メソッド
Public Function waitIE(objIE As InternetExplorer)
' Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち
' DoEvents
' Loop
Do While objIE.Busy
DoEvents
Loop
Sleep 3000
End Function

'## WEBページ内容の検索
Function searchTextFromWebPage(htmlDoc As HTMLDocument, searchText As String) As Boolean

searchTextFromWebPage = False If (InStr(htmlDoc.body.innerHTML, searchText) > 0) Then searchTextFromWebPage = True End If

End Function

何回かソースを変えたりしており、以下のソースでも試しましたが、同じところで同じエラーが出ます。

Option Explicit
'## 64ビットの場合
'Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim sheet_command As Worksheet
Dim book_list As Workbook
Public sheet_list As Worksheet
Dim filePath_list As String
Dim filename_list As String
Dim dirFlag As Boolean

'## WEBページ内容取得準備
Function initWebPageOperation() As InternetExplorer
Dim objIE As InternetExplorer 'IEオブジェクトを準備

Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット

' objIE.Visible = True 'IEを表示
objIE.Visible = False 'IEを非表示

Set initWebPageOperation = objIE

End Function

'## URL指定でのWEBページ内容取得
Function getWebPageData(objIE As InternetExplorer, url As String) As HTMLDocument
objIE.navigate url 'IEでURLを開く
Call waitIE(objIE)

Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備 Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット Set getWebPageData = htmlDoc Set htmlDoc = Nothing

End Function

'## IE表示待機メソッド
Public Function waitIE(objIE As InternetExplorer)
' Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち
' DoEvents
' Loop
Do While objIE.Busy
DoEvents
Loop
Sleep 1000
End Function

'## WEBページ内容の検索
Function searchTextFromWebPage(htmlDoc As HTMLDocument, searchText As String) As Boolean

searchTextFromWebPage = False If (InStr(htmlDoc.body.innerHTML, searchText) > 0) Then searchTextFromWebPage = True End If

End Function

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

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

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

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

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

guest

回答3

0

webの待機の処理で、書いてあるような

VBA

1 Do While IE.Busy = True Or IE.ReadyState < READYSTATE_COMPLETE 2 DoEvents 3 Loop

で、NGの場合があります。

その場合、自分の場合は、

VBA

1 Do Until htmlDoc.ReadyState = "complete" 2 DoEvents 3 Loop

原因はよくわかったいませんが、取得するオブジェクトの種類によって使い分けが必要な感じです。

投稿2017/12/24 01:53

kai_keitai

総合スコア344

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

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

0

詳しい訳ではないので、はっきりとは答えられないですが、
ブラウザ側でスクレイピング対策というか、Web攻撃対策というか、
機械的なアクセスを検知すると、アクセスを拒否する場合があるそうです。

それが関係しているかはわかりませんが、
当方では、IEのビジー状態判定が正しく取得できないケースが確認されています。
おっしゃているように、突然、理由も分からず。。。

なので、正しい対処法か分かりませんが、
ビジー状態がOKか、2連続でOKな状態か判定することで、
今のところ対応しています。

投稿2017/11/22 00:42

ExcelVBAer

総合スコア1175

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

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

0

getWebPageData関数内の読み込み待ちの処理が間違っていると思われます。

VBA

1Do While objIE.Busy And objIE.readyState = 4 2 Sleep 100 3Loop

ここの処理では、読み込み中の間(BusyがTrueまたはreadyStateが4以外)ループし続けなければいけませんが、今の処理では「BusyがTrueかつreadyStateが4」になっているため、即ループを抜けていると思います。
次のようにしてみてください。

VBA

1Do While objIE.Busy Or objIE.readyState <> 4 2 Sleep 100 3 'DoEvents ' あった方が良いかもしれない(状況に応じて) 4Loop

こちらのサイトで詳しく書かれているので参考にどうぞ。
https://www.vba-ie.net/ieobject/busy.html
https://www.vba-ie.net/ieobject/readystate.html

投稿2017/11/22 00:22

ttyp03

総合スコア16998

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問