[[20180407122838]] 『webスクレイピング』(HY) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『webスクレイピング』(HY)

web上のデータを取得するマクロについて質問です。

家で使用しているPCでは正しくデータをとってくることができるのですが、
会社のPCでマクロを実行するとマクロがオートメーションエラーになります。

家のPC: Excel2016 os:IE11 windows10
会社のPC:Excel2013 os:IE11 windows10

どのような原因が考えられるでしょうか。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


「オートメーションエラー vba」などでネット検索してみてはいかがですか?

# これだけの情報で原因を特定するのは困難な気がします。
(γ) 2018/04/07(土) 12:48


下記マクロを実行すると、busyメソッドがエラーになってしまします。
原因と改善方法を教えていただける助かります。。

Option Explicit

Sub IE操作()

Dim objTable As HTMLTable
Dim objTable2 As HTMLTable
Dim objTable3 As HTMLTable
Dim x As Integer
Dim y As Integer
Dim p As Integer
Dim q As Integer

'コード1|インターネットに接続してブラウザを開く

    Dim objIE As InternetExplorer
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

'コード2|インターネットの特定のページを開く

objIE.navigate "https://www.boj.or.jp/about/services/tame/tame_rate/kijun/kiju" & Range("a5") & ".htm/"

Call IEWait(objIE)

Call WaitFor(3) '3秒停止

Set objTable = objIE.document.getElementsByTagName("table")(0)

 '1番目のtableタグにあるセルをExcelに移し変える

 '変数yに0を代入、tableの行数まで繰り返す

 For y = 0 To objTable.Rows.Length - 1

 '変数xに1を代入、tableの列数まで繰り返す

 For x = 0 To objTable.Rows(y).Cells.Length - 1

 'Excelのx列、y行の位置にtableタグのx+1列、y+1行のセルの値を入れる

 Worksheets("Rate1").Cells(y + 1, x + 1).Value = objTable.Rows(y).Cells(x).innerText
      Next
 Next

 Set objTable2 = objIE.document.getElementsByTagName("table")(1)

 '2番目のtableタグにあるセルをExcelに移し変える

 '変数pに0を代入、tableの行数まで繰り返す

 For p = 0 To objTable2.Rows.Length - 1

 '変数qに1を代入、tableの列数まで繰り返す

 For q = 0 To objTable2.Rows(p).Cells.Length - 1

 'Excelのp列、q行の位置にtableタグのp+1列、q+1行のセルの値を入れる

 Worksheets("Rate2").Cells(p + 1, q + 1).Value = objTable2.Rows(p).Cells(q).innerText

 '変数aの値をプラス1することで次のセルに進む

      Next
 Next

 Set objTable3 = objIE.document.getElementsByTagName("p")(5)

 Worksheets("Rate3").Cells(1, 1).Value = objTable3.innerText

 'objIEに代入したInternetExplorerを閉じる

 objIE.Quit

 'objIEを空にする

 Set objIE = Nothing

 Worksheets("rate1").Range("1:100").RowHeight = 18.75

End Sub

'''---コード4|IEを待機する関数
Function IEWait(ByRef objIE As Object)

    Do While objIE.Busy = True Or objIE.readyState <> 4
        DoEvents
    Loop
End Function

'コード5|指定した秒だけ停止する関数
Function WaitFor(ByVal second As Integer)

    Dim futureTime As Date
    futureTime = DateAdd("s", second, Now)
    While Now < futureTime
        DoEvents
    Wend
End Function

(HY) 2018/04/11(水) 10:24


navigate した直後に Busy を見ようとしていますが、ページを表示しきっていないのだと思われます。 navigate 後に、DoEventsを数回入れるか、1秒程待ってみてください。(IEWaitとWaitForの順番を逆にしてもよさげ)
(???) 2018/04/11(水) 17:22

結局ダメでした。
上記をためしても、busyメソッド失敗となってしまいます。。。。
(HY) 2018/04/11(水) 18:18

Set objIE= CreateObject("InternetExplorer.Application")
を Set objIE = New InternetExplorerMedium
に変更したところ、うまく行きました。
お騒がせしました。
これはなんなんでしょうかね。。
(HY) 2018/04/11(水) 18:54

これはなんなんでしょうかね。。

下記が関係あるかも。

IE の保護モードの違いによって整合性レベルの切り替えの有無が変わりオートメーションの操作に影響が出る場合がある - デクノスティック
http://dechnostick.hatenablog.com/entry/2015/01/27/032113
(hatena) 2018/04/11(水) 22:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.