エクセルマクロVBA「Web連携」DOM(Document Object Model)を使った解析_概要

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

この動画では、WinHttp Services 5.1を使って取ってきたWebのコンテンツをDOM(Document Object Model)を使って解析する方法について解説しています。

DOMについて理解し、DOMを活用する方法を学ぶことで、HTMLコンテンツ内の必要な箇所に簡単なコードでアクセスし、すぐにデータを取得することが可能です。

この教材についての過去の質問・感想

11355 : 小川慶一の回答 (2019-04-15 09:53:14)

受講生 さん:

アクセス拒否されているのかもしれませんね。
僕も、Amazonのページ解析するスクリプトの動作確認していて拒絶されることはあります。

長期的に継続することあまりありませんが。

>ちなみにwinHTTP 5.1を使わずに、ieを使ってヤフオクを実行してみたら正常に動きました。

経由するプログラムが違うから別物と思われているのでしょう。
例えて言えば、Firefoxからのアクセスは拒絶されたが、IEでの接続は(たとえ同じipアドレスからのアクセスであっても)サーバ側に別物とみなされていて問題なくコンテンツを取得できるとか、そんなところかと。



> 小川慶一さん:
> 小川先生のかいたマクロでもヤフオクのURLだと、xh.sendのところでエラーが出ます。
> しかし、ヤフオク以外のURLにすると(この質問ページ)xh.sendは正常に通ります。ちなみにwinHTTP 5.1を使わずに、ieを使ってヤフオクを実行してみたら正常に動きました。
> 先生のパソコンはヤフオクにアクセスしても正常に動くみたいなので、自分の家のパソコンだけ、winHTTP5.1でヤフオクのアクセスができないみたいです。
> 一度、会社のパソコンで実験してみます。
> 当分家のパソコンでは、ieを使って使用します。
> ありがとうございました。
>
>
> > ざきさんさん:
> >
> > 追記です。
> > 僕が昨日お送りしたマクロも動作しました。
> >
> > いただいたマクロでURLを指定する部分を以下に書き換えてもやはり動作しました。
> > url = "https://page.auctions.yahoo.co.jp/jp/auction/e349730483";
> >
> > よろしくお願いいたします。
> >
> >
> >
> > > 小川慶一さん:
> > > サンプルありがとうございました。
> > > 家に帰って色々カスタマイズしようとしたら、xh.sendのところで「サーバーに接続できませんでした」というエラーメッセージが出るようになりました。
> > > 違うURLでxh.sendすると正常に動きます。
> > > なぜでしょうか??ヤフオクが僕を拒否してるのでしょうか?
> > > 添付ファイルにて詳細を送ります。
> > >
> > >
> > > > ざきさんさん:
> > > >
> > > > 楽しまれていますね (^^*
> > > >
> > > > 「シンプルに」ということでしたら、これだけ規則性の高いコンテンツなら、以下のサンプルの形までスッキリできるかと思います。
> > >


11352 : 受講生さんのコメント (2019-04-14 01:29:44)

小川慶一さん:
小川先生のかいたマクロでもヤフオクのURLだと、xh.sendのところでエラーが出ます。
しかし、ヤフオク以外のURLにすると(この質問ページ)xh.sendは正常に通ります。ちなみにwinHTTP 5.1を使わずに、ieを使ってヤフオクを実行してみたら正常に動きました。
先生のパソコンはヤフオクにアクセスしても正常に動くみたいなので、自分の家のパソコンだけ、winHTTP5.1でヤフオクのアクセスができないみたいです。
一度、会社のパソコンで実験してみます。
当分家のパソコンでは、ieを使って使用します。
ありがとうございました。


> ざきさんさん:
>
> 追記です。
> 僕が昨日お送りしたマクロも動作しました。
>
> いただいたマクロでURLを指定する部分を以下に書き換えてもやはり動作しました。
> url = "https://page.auctions.yahoo.co.jp/jp/auction/e349730483";
>
> よろしくお願いいたします。
>
>
>
> > 小川慶一さん:
> > サンプルありがとうございました。
> > 家に帰って色々カスタマイズしようとしたら、xh.sendのところで「サーバーに接続できませんでした」というエラーメッセージが出るようになりました。
> > 違うURLでxh.sendすると正常に動きます。
> > なぜでしょうか??ヤフオクが僕を拒否してるのでしょうか?
> > 添付ファイルにて詳細を送ります。
> >
> >
> > > ざきさんさん:
> > >
> > > 楽しまれていますね (^^*
> > >
> > > 「シンプルに」ということでしたら、これだけ規則性の高いコンテンツなら、以下のサンプルの形までスッキリできるかと思います。
> >


11350 : 小川慶一の回答 (2019-04-13 15:04:30)

ざきさんさん:

追記です。
僕が昨日お送りしたマクロも動作しました。

いただいたマクロでURLを指定する部分を以下に書き換えてもやはり動作しました。
url = "https://page.auctions.yahoo.co.jp/jp/auction/e349730483";

よろしくお願いいたします。



> 小川慶一さん:
> サンプルありがとうございました。
> 家に帰って色々カスタマイズしようとしたら、xh.sendのところで「サーバーに接続できませんでした」というエラーメッセージが出るようになりました。
> 違うURLでxh.sendすると正常に動きます。
> なぜでしょうか??ヤフオクが僕を拒否してるのでしょうか?
> 添付ファイルにて詳細を送ります。
>
>
> > ざきさんさん:
> >
> > 楽しまれていますね (^^*
> >
> > 「シンプルに」ということでしたら、これだけ規則性の高いコンテンツなら、以下のサンプルの形までスッキリできるかと思います。
>


11349 : 小川慶一の回答 (2019-04-13 15:02:19)

ざきさんさん:

> 違うURLでxh.sendすると正常に動きます。
> なぜでしょうか??ヤフオクが僕を拒否してるのでしょうか?
> 添付ファイルにて詳細を送ります。

ちょっと分からないです。
そのエラーメッセージが出るケースはいろいろ考えられますし。

とりあえず報告すると、今いただいたファイルで編集なしでマクロを実行してみたところ、無事に動きました。

僕が示した内容のままでテストするとどうでしょうか。やはり動かないでしょうか。




> 小川慶一さん:
> サンプルありがとうございました。
> 家に帰って色々カスタマイズしようとしたら、xh.sendのところで「サーバーに接続できませんでした」というエラーメッセージが出るようになりました。
> 違うURLでxh.sendすると正常に動きます。
> なぜでしょうか??ヤフオクが僕を拒否してるのでしょうか?
> 添付ファイルにて詳細を送ります。
>
>
> > ざきさんさん:
> >
> > 楽しまれていますね (^^*
> >
> > 「シンプルに」ということでしたら、これだけ規則性の高いコンテンツなら、以下のサンプルの形までスッキリできるかと思います。
>


11348 : ざきさんさんのコメント (2019-04-12 20:07:22)

小川慶一さん:
サンプルありがとうございました。
家に帰って色々カスタマイズしようとしたら、xh.sendのところで「サーバーに接続できませんでした」というエラーメッセージが出るようになりました。
違うURLでxh.sendすると正常に動きます。
なぜでしょうか??ヤフオクが僕を拒否してるのでしょうか?
添付ファイルにて詳細を送ります。


> ざきさんさん:
>
> 楽しまれていますね (^^*
>
> 「シンプルに」ということでしたら、これだけ規則性の高いコンテンツなら、以下のサンプルの形までスッキリできるかと思います。


11345 : 小川慶一の回答 (2019-04-12 17:10:49)

ざきさんさん:

楽しまれていますね (^^*

「シンプルに」ということでしたら、これだけ規則性の高いコンテンツなら、以下のサンプルの形までスッキリできるかと思います。

Sub test_ogawa()
    Dim url As String
    url = "https://page.auctions.yahoo.co.jp/jp/auction/e349730483"
 
    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send

    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If

    Dim oHTml As New MSHTML.HTMLDocument
    oHTml.body.innerHTML = xh.ResponseText

    Dim div As MSHTML.HTMLDivElement
    For Each div In oHTml.getElementsByClassName("ProductImage__inner")
        Debug.Print div.getElementsByTagName("img")(0).src '←これはまあ普通
'        Debug.Print div.ChildNodes(0).src '←こちらのほうがさらにシンプル
    Next
End Sub



> 下記の続きです。
> 無理矢理な感じ満載ですが、回答待ってる間に一応できました。
> どうでしょうか??もっとスマートな書き方ありますかね?
>
 Sub test()
>     Dim url As String
>     url = "https://page.auctions.yahoo.co.jp/jp/auction/e349730483"
> 
>     Dim xh As New WinHttp.WinHttpRequest
>     xh.Open "GET", url, False
>     xh.send
>     
>     Dim sCode As String
>     sCode = xh.Status
>     If sCode <> 200 Then
>         MsgBox "リクエストに失敗しました" & vbNewLine & sCode
>     End If
>     
>     'htmlをDOMとして取得する。そのための変数を宣言。
>     Dim oHTml As New MSHTML.HTMLDocument
>     oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得
>     
>     Dim st, moto As String
>     Dim pElem As MSHTML.HTMLParaElement
>    
>     For Each pElem In oHTml.getElementsByClassName("ProductImage__inner")
>         st = pElem.innerHTML
>         Debug.Print Mid(st, InStr(st, "https"), InStr(Mid(st, InStr(st, "https")), " wi") - 2)
>     Next
> End Sub

>
>


11344 : ざきさんさんのコメント (2019-04-12 16:52:01)

下記の続きです。
無理矢理な感じ満載ですが、回答待ってる間に一応できました。
どうでしょうか??もっとスマートな書き方ありますかね?

 Sub test()
    Dim url As String
    url = "https://page.auctions.yahoo.co.jp/jp/auction/e349730483"

    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send
    
    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If
    
    'htmlをDOMとして取得する。そのための変数を宣言。
    Dim oHTml As New MSHTML.HTMLDocument
    oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得
    
    Dim st, moto As String
    Dim pElem As MSHTML.HTMLParaElement
   
    For Each pElem In oHTml.getElementsByClassName("ProductImage__inner")
        st = pElem.innerHTML
        Debug.Print Mid(st, InStr(st, "https"), InStr(Mid(st, InStr(st, "https")), " wi") - 2)
    Next
End Sub



11341 : ざきさんさんのコメント (2019-04-12 13:36:45)

質問です。
クラス名で取得してその中にある画像のURLを取得したいです。
なぜこの書き方で取得できないのかわかりません・・・。
助けてください。
zipファイルでも添付します。

Sub GetRequestSimple1()
    Dim url As String
    url = "https://page.auctions.yahoo.co.jp/jp/auction/q263905236?notice=mdrs"

    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send
    
    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If
    
    'htmlをDOMとして取得する。そのための変数を宣言。
    Dim oHTml As New MSHTML.HTMLDocument
    oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得
    
'//--- ここで躓いてます・・・。 -----//
    Debug.Print oHTml.getElementsByClassName("ProductImage__inner")(0).outerHTML
    
End Sub 


5755 : 小川慶一の回答 (2016-02-10 09:53:29)

伊久間博之 さん:

結局、ガシガシ解析するとしたら、基礎編、発展編1で学んだ知識も総動員ですね。
そして、伊久間は地味にスキルが定着している方なので「状況に応じてつかいわけられる」と言えるのが強みですね☆



>小川慶一 さん:
>
>なるほど。そうなんですね。
>ガシガシ解析するか、Internet Controlsを使って解析するか、状況に応じて使い分けてみることにします。
>ありがとうございます。m(_ _)m


5743 : 伊久間博之さんのコメント (2016-02-09 23:37:52)

小川慶一 さん:

なるほど。そうなんですね。
ガシガシ解析するか、Internet Controlsを使って解析するか、状況に応じて使い分けてみることにします。
ありがとうございます。m(_ _)m

>伊久間博之 さん:
>
>htmlヘッダーの中身を MSHTML.HTMLDocument で取得する方法は僕も知らないのですよ。
>いろいろ調べているのですが、なぜか見つけられないです。
>
>ということで、文字列として取得して Instr 関数等を使ってガシガシ解析するのはどうでしょうか。
>
>

Sub GetRequestSimple_Header()
>    Dim url As String
>    url = "http://www.jreast.co.jp/"
>
>    Dim xh As New WinHttp.WinHttpRequest
>    xh.Open "GET", url, False
>    xh.send
>    
>    Dim sCode As String
>    sCode = xh.Status
>    If sCode <> 200 Then
>        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
>    End If
>    
>    Dim s As String
>    s = xh.ResponseText
>    Debug.Print Left(s, 500) 'あくまでデモとして出力。実際にはもっとしっかり解析します。
>    
>End Sub

>
>Instr関数を使って <meta を探し、 Instrrev関数を使って </head 探せば、その間に答欲しい文字列がいそうですね。
>


5733 : 小川慶一の回答 (2016-02-08 23:33:51)

伊久間博之 さん:

htmlヘッダーの中身を MSHTML.HTMLDocument で取得する方法は僕も知らないのですよ。
いろいろ調べているのですが、なぜか見つけられないです。

ということで、文字列として取得して Instr 関数等を使ってガシガシ解析するのはどうでしょうか。

Sub GetRequestSimple_Header()
    Dim url As String
    url = "http://www.jreast.co.jp/"

    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send
    
    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If
    
    Dim s As String
    s = xh.ResponseText
    Debug.Print Left(s, 500) 'あくまでデモとして出力。実際にはもっとしっかり解析します。
    
End Sub


Instr関数を使って <meta を探し、 Instrrev関数を使って </head 探せば、その間に答欲しい文字列がいそうですね。


5723 : 伊久間博之さんのコメント (2016-02-07 17:03:44)

こんにちは。いつもお世話になっております。

WinHttp Services 5.1を使ってとってきたDOMを使った解析についてわからないことがありますので質問させてください。
metaタグのコレクションが取得できません。


JR東日本から(http://www.jreast.co.jp/)から
metaタグを抜き出そうとして以下のコードを書きました。

Sub GetRequestSimple2()
    Dim url As String
    url = "http://www.jreast.co.jp/"

    Dim xh As New WinHttp.WinHttpRequest
    xh.Open "GET", url, False
    xh.send
    
    Dim sCode As String
    sCode = xh.Status
    If sCode <> 200 Then
        MsgBox "リクエストに失敗しました" & vbNewLine & sCode
    End If
    
    'htmlをDOMとして取得する。そのための変数を宣言。
    Dim oHTml As New MSHTML.HTMLDocument
    oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得
    
    Debug.Print xh.GetAllResponseHeaders
    Debug.Print oHTml.body.innerHTML 'xh.ResponseText
    Range("B1").Value = xh.GetAllResponseHeaders
    Range("B2").Value = oHTml.body.innerHTML ' xh.ResponseText
    
    Dim oM As MSHTML.HTMLHeadElement
    For Each oM In oHTml.getElementsByTagName("meta")
        Debug.Print oM.outerHTML
        Debug.Print oM.innerHTML
        Debug.Print oM.innerText
    Next
End Sub


が、取得できません。
Range("B2").Value をみると<body>以下が出力されていますので
[code] oHTml.body.innerHTML = xh.ResponseText[\code]
の body を head にすればいいのではないかと予想して
[code] oHTml.head.innerHTML = xh.ResponseText[\code]
としてみましたが、実行時エラー600になってしまいます。

調べてみるとInternet Controlsによる取得方法はいくつかあり、その方法を試したところmetaタグを取得することができました。

しかし、WinHTTP Services 5.1による取得方法を見つけられず、質問させて頂きました。

どのようにすればmetaタグ、headないの要素を取得することができるのでしょうか?


3983 : 小川慶一の回答 (2015-03-18 16:06:08)

匿名 さん:

お返事、遅れました。

なるほどです。 .Click メソッドですか。
IEコンポネントらしいやり方ですね。プログラム的にやろうと思うと、こういう発想逃しますね(汗

僕も参考になりました!ひきつづきよろしくお願いいたします。



>小川慶一 さん
>
>こんにちは。
>いろいろ試してみましたが、下記コードであれば問題なく動きそうです。
>

 
>Sub test5_rev3()
>    Dim objIE As New InternetExplorer
>    objIE.Visible = True
>    Dim Fms As Object
>    Dim url As String
>    
>    '「GetElementByID」は単数形。
>    url = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
>    Debug.Print url
>    objIE.navigate url
>      
>    'ページの表示完了待ち
>    Debug.Print "bgn1:" & objIE.readyState
>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>        Debug.Print "do1 :" & objIE.readyState
>        DoEvents
>    Loop
>    Debug.Print "fin1:" & objIE.readyState
>      
>    For Each Fms In objIE.Document.getElementsByTagName("a")
>        If Fms.innertext = "ニュース" Then
>            Fms.Click
>            Exit For
>        End If
>    Next
>            
>    Set objIE = Nothing
>    Set Fms = Nothing
>    MsgBox "完了しました。"
>      
>End Sub
>

>
>>小川慶一 さん:
>>
>>こんばんは。
>>「以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。」について回答します。
>>→こちらで実行しても、二つとも下記リンク先と同じように表示されました。
>>
>>「てか、ここに来る前にエラーが出て止まるんでしたっけ。」についてですが、
>>以前「navigateがうまく機能していないような雰囲気ですね」というコメントをいただいたので、
>>「ひょっとしたらこの部分が原因かも!」と考えてその部分に入力したという経緯です。
>>後ほどデータ修正しておきます。
>>
>>>匿名 さん:
>>>
>>>動かしてみました。
>>>2つ目のDo Loopのところで先に進まなくなりますね。
>>>
>>>以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。
>>>https://www.dropbox.com/sh/yjysnebaf51chfg/AADI_C3KrzbQFRTkQjmWk1QBa?dl=0
>>>
>>>..てか、ここに来る前にエラーが出て止まるんでしたっけ。
>>>でしたら、 application.wait は、 DoLoopの前かな?エラーが出るところの前に入れてください。
>>>
>>
>


3970 : 受講生さんのコメント (2015-03-15 15:33:58)

小川慶一 さん

こんにちは。
いろいろ試してみましたが、下記コードであれば問題なく動きそうです。

 
Sub test5_rev3()
    Dim objIE As New InternetExplorer
    objIE.Visible = True
    Dim Fms As Object
    Dim url As String
    
    '「GetElementByID」は単数形。
    url = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url
    objIE.navigate url
      
    'ページの表示完了待ち
    Debug.Print "bgn1:" & objIE.readyState
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        Debug.Print "do1 :" & objIE.readyState
        DoEvents
    Loop
    Debug.Print "fin1:" & objIE.readyState
      
    For Each Fms In objIE.Document.getElementsByTagName("a")
        If Fms.innertext = "ニュース" Then
            Fms.Click
            Exit For
        End If
    Next
            
    Set objIE = Nothing
    Set Fms = Nothing
    MsgBox "完了しました。"
      
End Sub


>小川慶一 さん:
>
>こんばんは。
>「以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。」について回答します。
>→こちらで実行しても、二つとも下記リンク先と同じように表示されました。
>
>「てか、ここに来る前にエラーが出て止まるんでしたっけ。」についてですが、
>以前「navigateがうまく機能していないような雰囲気ですね」というコメントをいただいたので、
>「ひょっとしたらこの部分が原因かも!」と考えてその部分に入力したという経緯です。
>後ほどデータ修正しておきます。
>
>>匿名 さん:
>>
>>動かしてみました。
>>2つ目のDo Loopのところで先に進まなくなりますね。
>>
>>以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。
>>https://www.dropbox.com/sh/yjysnebaf51chfg/AADI_C3KrzbQFRTkQjmWk1QBa?dl=0
>>
>>..てか、ここに来る前にエラーが出て止まるんでしたっけ。
>>でしたら、 application.wait は、 DoLoopの前かな?エラーが出るところの前に入れてください。
>>
>


3967 : 受講生さんのコメント (2015-03-14 22:26:26)

小川慶一 さん:

こんばんは。
「以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。」について回答します。
→こちらで実行しても、二つとも下記リンク先と同じように表示されました。

「てか、ここに来る前にエラーが出て止まるんでしたっけ。」についてですが、
以前「navigateがうまく機能していないような雰囲気ですね」というコメントをいただいたので、
「ひょっとしたらこの部分が原因かも!」と考えてその部分に入力したという経緯です。
後ほどデータ修正しておきます。

>匿名 さん:
>
>動かしてみました。
>2つ目のDo Loopのところで先に進まなくなりますね。
>
>以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。
>https://www.dropbox.com/sh/yjysnebaf51chfg/AADI_C3KrzbQFRTkQjmWk1QBa?dl=0
>
>..てか、ここに来る前にエラーが出て止まるんでしたっけ。
>でしたら、 application.wait は、 DoLoopの前かな?エラーが出るところの前に入れてください。
>


3964 : 小川慶一の回答 (2015-03-14 21:16:41)

匿名 さん:

動かしてみました。
2つ目のDo Loopのところで先に進まなくなりますね。

以下のフォルダに置いた2つの写真にあるような値のままです。そちらで実行したときはいかがですか。
https://www.dropbox.com/sh/yjysnebaf51chfg/AADI_C3KrzbQFRTkQjmWk1QBa?dl=0

..てか、ここに来る前にエラーが出て止まるんでしたっけ。
でしたら、 application.wait は、 DoLoopの前かな?エラーが出るところの前に入れてください。


3962 : 受講生さんのコメント (2015-03-14 16:46:26)

小川慶一 さん:

こんにちは。
「application.wait メソッドとかでエラーの出る直前で一定時間(3秒とか)とめること」をやってみましたが、
結果は前回と同様でした。
なかなか、うまくいかないですね・・・。
ご参考までにコードを下記に記載します。

 
Sub test5_rev2()
    Dim objIE As New InternetExplorer
    objIE.Visible = True
    Dim fms As Object
    Dim url1 As String
    Dim url2 As String
    Dim newHour As Date
    Dim newMinute As Date
    Dim newSecond As Date
    Dim waitTime As Date
    
    url1 = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url1
    objIE.navigate url1
      
    'ページの表示完了待ち
    Debug.Print "bgn1:" & objIE.readyState
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        Debug.Print "do1 :" & objIE.readyState
        DoEvents
    Loop
    Debug.Print "fin1:" & objIE.readyState
      
    Set fms = objIE.Document
    '「GetElementByID」は単数形。
    url2 = fms.GetElementByid("nsearch").href & "?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url2
    
        newHour = Hour(Now())
        newMinute = Minute(Now())
        newSecond = Second(Now()) + 3
        waitTime = TimeSerial(newHour, newMinute, newSecond)
        Application.Wait waitTime
    
    objIE.navigate url2
  
    'ページの表示完了待ち
    Debug.Print "bgn2:" & objIE.readyState
    
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        Debug.Print "do2 :" & objIE.readyState
        
        newHour = Hour(Now())
        newMinute = Minute(Now())
        newSecond = Second(Now()) + 3
        waitTime = TimeSerial(newHour, newMinute, newSecond)
        Application.Wait waitTime
        
        DoEvents
    Loop
    Debug.Print "fin2:" & objIE.readyState
      
    Set objIE = Nothing
    Set fms = Nothing
    MsgBox "完了しました。"
      
End Sub

 

>匿名 さん:
>
>それは、何でしょうね。そうするとすぐには分からない。
>
>application.wait メソッドとかでエラーの出る直前で一定時間(3秒とか)とめることにして、それから実行するとかだとどうでしょう?
>


3954 : 小川慶一の回答 (2015-03-12 22:53:55)

匿名 さん:

それは、何でしょうね。そうするとすぐには分からない。

application.wait メソッドとかでエラーの出る直前で一定時間(3秒とか)とめることにして、それから実行するとかだとどうでしょう?

>小川慶一 さん:
>
>こんばんは。
>
>申し訳ございません、言葉が少々足りておりませんでした。
>問題なく完了したのは、「ステップイン」で実行した場合のみです。
>「F5」キーで実行した場合は小川さんと同様の結果となっております。
>
>
>>匿名 さん:
>>
>>なんと。これは動くんですか。なんででしょうね。ぜんぜん分かりませんw
>>
>>いずれにせよ、IE使わないで済むならそのほうがよいです。
>>
>>引き続きよろしくお願いいたします。
>>
>


3952 : 受講生さんのコメント (2015-03-11 20:44:41)

小川慶一 さん:

こんばんは。

申し訳ございません、言葉が少々足りておりませんでした。
問題なく完了したのは、「ステップイン」で実行した場合のみです。
「F5」キーで実行した場合は小川さんと同様の結果となっております。


>匿名 さん:
>
>なんと。これは動くんですか。なんででしょうね。ぜんぜん分かりませんw
>
>いずれにせよ、IE使わないで済むならそのほうがよいです。
>
>引き続きよろしくお願いいたします。
>


3949 : 小川慶一の回答 (2015-03-10 08:45:11)

匿名 さん:

なんと。これは動くんですか。なんででしょうね。ぜんぜん分かりませんw

いずれにせよ、IE使わないで済むならそのほうがよいです。

引き続きよろしくお願いいたします。


3947 : 受講生さんのコメント (2015-03-10 06:47:15)

小川慶一 さん:

おはようございます。

教えていただいたコードで試したところ、最後まで動きました。
詳細なコードはまだ確認できていないので、後日確認してみます。
ありがとうございました。
今後実務で使用したいと考えておりますので、次回以降は「Microsoft WinHTTP Services」を
使用してみようと思います。



>匿名 さん:
>
>おはようございます。
>
>以下のコードで試してところ、まったく同じ問題は生じませんでしたが、
>do2 :1
>と出力され続けました。navigateがうまく機能していないような雰囲気ですね。
>
>IE制御してやる方法自体、正直あまりおすすめではありません。
>もし実務での必要があるということでしたら、ほかのライブラリ使ったほうがいいかも。 Microsoft WinHTTP Services は試されましたか?
>
>

Sub test5()
>    Dim objIE As New InternetExplorer
>    objIE.Visible = True
>    Dim fms As Object
>    Dim url1 As String
>    Dim url2 As String
>    url1 = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
>    Debug.Print url1
>    objIE.navigate url1
>     
>    'ページの表示完了待ち
>    Debug.Print "bgn1:" & objIE.readyState
>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>        Debug.Print "do1 :" & objIE.readyState
>        DoEvents
>    Loop
>    Debug.Print "fin1:" & objIE.readyState
>     
>    Set fms = objIE.Document
>    '「GetElementByID」は単数形。
>    url2 = fms.GetElementByid("nsearch").href & "?time=" & Format(Now, "yymmddhhnnss")
>    Debug.Print url2
>    objIE.navigate url2
> 
> 
>    'ページの表示完了待ち
>    Debug.Print "bgn2:" & objIE.readyState
>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>        Debug.Print "do2 :" & objIE.readyState
>        DoEvents
>    Loop
>    Debug.Print "fin2:" & objIE.readyState
>     
>    Set objIE = Nothing
>    Set fms = Nothing
>    MsgBox "完了しました。"
>     
>End Sub

>
>
>
>>小川 慶一さん
>>
>>こんばんは。
>>
>>マクロで「リンク先」のURLを取得して、更にリンク先のページを開こうとしましたが、
>>下記エラーが表示されます。
>>恐れ入りますが、どの部分のコードに誤りがあるか教えていただけますか。
>>よろしくお願いします。
>>
>>事象は下記の通りです。
>>●1回目にマクロ実行
>>事象:下記文言が表示され、マクロが停止します。
>>・実行時エラー「-2147023170」 「オートメーション エラーです。リモート プロシージャ コールに失敗しました」
>>
>>●上記マクロを停止して再実行(2回目以降)
>>事象1:下記実行時エラーが表示され、マクロが停止します。
>>・実行時エラー「-2147467259」 「Register As Browser'メソッドは失敗しました ’IWebBrowser2'オブジェクト」
>>事象2:下記コードの「DoEvents」の部分で停滞します。
>>
>>
>>
 
>>Sub test5()
>>    Dim objIE As New InternetExplorer
>>    objIE.Visible = True
>>    Dim fms As Object
>>    Dim url1 As String
>>    Dim url2 As String
>>    url1 = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
>>    Debug.Print url1
>>    objIE.navigate url1
>>    
>>    'ページの表示完了待ち
>>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>>        DoEvents
>>    Loop
>>    
>>    Set fms = objIE.Document
>>    '「GetElementByID」は単数形。
>>    url2 = fms.GetElementByid("nsearch").href & "?time=" & Format(Now, "yymmddhhnnss")
>>    Debug.Print url2
>>    objIE.navigate url2
>>
>>
>>    'ページの表示完了待ち
>>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>>        'ここで、止まったままになります。
>>        DoEvents
>>    Loop
>>    
>>    Set objIE = Nothing
>>    Set fms = Nothing
>>    MsgBox "完了しました。"
>>    
>>End Sub
>>

>


3944 : 小川慶一の回答 (2015-03-09 07:31:04)

匿名 さん:

おはようございます。

以下のコードで試してところ、まったく同じ問題は生じませんでしたが、
do2 :1
と出力され続けました。navigateがうまく機能していないような雰囲気ですね。

IE制御してやる方法自体、正直あまりおすすめではありません。
もし実務での必要があるということでしたら、ほかのライブラリ使ったほうがいいかも。 Microsoft WinHTTP Services は試されましたか?

Sub test5()
    Dim objIE As New InternetExplorer
    objIE.Visible = True
    Dim fms As Object
    Dim url1 As String
    Dim url2 As String
    url1 = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url1
    objIE.navigate url1
     
    'ページの表示完了待ち
    Debug.Print "bgn1:" & objIE.readyState
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        Debug.Print "do1 :" & objIE.readyState
        DoEvents
    Loop
    Debug.Print "fin1:" & objIE.readyState
     
    Set fms = objIE.Document
    '「GetElementByID」は単数形。
    url2 = fms.GetElementByid("nsearch").href & "?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url2
    objIE.navigate url2
 
 
    'ページの表示完了待ち
    Debug.Print "bgn2:" & objIE.readyState
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        Debug.Print "do2 :" & objIE.readyState
        DoEvents
    Loop
    Debug.Print "fin2:" & objIE.readyState
     
    Set objIE = Nothing
    Set fms = Nothing
    MsgBox "完了しました。"
     
End Sub




>小川 慶一さん
>
>こんばんは。
>
>マクロで「リンク先」のURLを取得して、更にリンク先のページを開こうとしましたが、
>下記エラーが表示されます。
>恐れ入りますが、どの部分のコードに誤りがあるか教えていただけますか。
>よろしくお願いします。
>
>事象は下記の通りです。
>●1回目にマクロ実行
>事象:下記文言が表示され、マクロが停止します。
>・実行時エラー「-2147023170」 「オートメーション エラーです。リモート プロシージャ コールに失敗しました」
>
>●上記マクロを停止して再実行(2回目以降)
>事象1:下記実行時エラーが表示され、マクロが停止します。
>・実行時エラー「-2147467259」 「Register As Browser'メソッドは失敗しました ’IWebBrowser2'オブジェクト」
>事象2:下記コードの「DoEvents」の部分で停滞します。
>
>
>
 
>Sub test5()
>    Dim objIE As New InternetExplorer
>    objIE.Visible = True
>    Dim fms As Object
>    Dim url1 As String
>    Dim url2 As String
>    url1 = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
>    Debug.Print url1
>    objIE.navigate url1
>    
>    'ページの表示完了待ち
>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>        DoEvents
>    Loop
>    
>    Set fms = objIE.Document
>    '「GetElementByID」は単数形。
>    url2 = fms.GetElementByid("nsearch").href & "?time=" & Format(Now, "yymmddhhnnss")
>    Debug.Print url2
>    objIE.navigate url2
>
>
>    'ページの表示完了待ち
>    Do While objIE.readyState <> 4 Or objIE.Busy = True
>        'ここで、止まったままになります。
>        DoEvents
>    Loop
>    
>    Set objIE = Nothing
>    Set fms = Nothing
>    MsgBox "完了しました。"
>    
>End Sub
>


3940 : 受講生さんのコメント (2015-03-08 18:33:57)

小川 慶一さん

こんばんは。

マクロで「リンク先」のURLを取得して、更にリンク先のページを開こうとしましたが、
下記エラーが表示されます。
恐れ入りますが、どの部分のコードに誤りがあるか教えていただけますか。
よろしくお願いします。

事象は下記の通りです。
●1回目にマクロ実行
事象:下記文言が表示され、マクロが停止します。
・実行時エラー「-2147023170」 「オートメーション エラーです。リモート プロシージャ コールに失敗しました」

●上記マクロを停止して再実行(2回目以降)
事象1:下記実行時エラーが表示され、マクロが停止します。
・実行時エラー「-2147467259」 「Register As Browser'メソッドは失敗しました ’IWebBrowser2'オブジェクト」
事象2:下記コードの「DoEvents」の部分で停滞します。


 
Sub test5()
    Dim objIE As New InternetExplorer
    objIE.Visible = True
    Dim fms As Object
    Dim url1 As String
    Dim url2 As String
    url1 = "http://www.yahoo.co.jp/?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url1
    objIE.navigate url1
    
    'ページの表示完了待ち
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        DoEvents
    Loop
    
    Set fms = objIE.Document
    '「GetElementByID」は単数形。
    url2 = fms.GetElementByid("nsearch").href & "?time=" & Format(Now, "yymmddhhnnss")
    Debug.Print url2
    objIE.navigate url2


    'ページの表示完了待ち
    Do While objIE.readyState <> 4 Or objIE.Busy = True
        'ここで、止まったままになります。
        DoEvents
    Loop
    
    Set objIE = Nothing
    Set fms = Nothing
    MsgBox "完了しました。"
    
End Sub


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 エクセルマクロVBA「Web連携」講座の概要
    【動画1】 エクセルマクロVBA「Web連携」講座の概要 未習得
  2. 【動画2】 エクセルマクロVBA「Web連携」サーバとクライアント
    【動画2】 エクセルマクロVBA「Web連携」サーバとクライアント 未習得
  3. 【動画3】 エクセルマクロVBA「Web連携」ApacheとCGI
    【動画3】 エクセルマクロVBA「Web連携」ApacheとCGI 未習得
  4. 【動画4】 エクセルマクロVBA「Web連携」セッションとポート
    【動画4】 エクセルマクロVBA「Web連携」セッションとポート 未習得
  5. 【動画5】 エクセルマクロVBA「Web連携」クライアントとは
    【動画5】 エクセルマクロVBA「Web連携」クライアントとは 未習得
  6. 【動画6】 エクセルマクロVBA「Web連携」リクエストとレスポンスとは
    【動画6】 エクセルマクロVBA「Web連携」リクエストとレスポンスとは 未習得
  7. 【動画7】 エクセルマクロVBA「Web連携」GETリクエスト
    【動画7】 エクセルマクロVBA「Web連携」GETリクエスト 未習得
  8. 【動画8】 エクセルマクロVBA「Web連携」POSTリクエスト
    【動画8】 エクセルマクロVBA「Web連携」POSTリクエスト 未習得
  9. 【動画9】 エクセルマクロVBA「Web連携」Cookieを使ったリクエスト
    【動画9】 エクセルマクロVBA「Web連携」Cookieを使ったリクエスト 未習得
  10. 【動画10】 エクセルマクロVBA「Web連携」HTMLコンテンツの取得と解析_概要
    【動画10】 エクセルマクロVBA「Web連携」HTMLコンテンツの取得と解析_概要 未習得
  11. 【動画11】 エクセルマクロVBA「Web連携」Microsoft WinHTTP Services 5.1_GETリクエスト
    【動画11】 エクセルマクロVBA「Web連携」Microsoft WinHTTP Services 5.1_GETリクエスト 未習得
  12. 【動画12】 エクセルマクロVBA「Web連携」Microsoft WinHTTP Services 5.1_POSTリクエスト
    【動画12】 エクセルマクロVBA「Web連携」Microsoft WinHTTP Services 5.1_POSTリクエスト 未習得
  13. 【動画13】 エクセルマクロVBA「Web連携」Microsoft WinHTTP Services 5.1_Cookie
    【動画13】 エクセルマクロVBA「Web連携」Microsoft WinHTTP Services 5.1_Cookie 未習得
  14. 【動画14】 エクセルマクロVBA「Web連携」DOM(Document Object Model)を使った解析_概要
    【動画14】 エクセルマクロVBA「Web連携」DOM(Document Object Model)を使った解析_概要 未習得
  15. 【動画15】 エクセルマクロVBA「Web連携」DOMを使った解析_基礎
    【動画15】 エクセルマクロVBA「Web連携」DOMを使った解析_基礎 未習得
  16. 【動画16】 エクセルマクロVBA「Web連携」DOMを使ったサンプル
    【動画16】 エクセルマクロVBA「Web連携」DOMを使ったサンプル 未習得
  17. 【動画17】 エクセルマクロVBA「Web連携」DOM活用のテクニック
    【動画17】 エクセルマクロVBA「Web連携」DOM活用のテクニック 未習得
  18. 【動画18】 エクセルマクロVBA「Web連携」DOMの活用例_メルマガのタイトルを取得
    【動画18】 エクセルマクロVBA「Web連携」DOMの活用例_メルマガのタイトルを取得 未習得
  19. 【動画19】 エクセルマクロVBA「Web連携」DOMの活用例_複数のメルマガ解除を自動化
    【動画19】 エクセルマクロVBA「Web連携」DOMの活用例_複数のメルマガ解除を自動化 未習得
  20. 【動画20】 エクセルマクロVBA「Web連携」Microsoft XMLを活用したコンテンツ取得
    【動画20】 エクセルマクロVBA「Web連携」Microsoft XMLを活用したコンテンツ取得 未習得
  21. 【動画21】 エクセルマクロVBA「Web連携」Microsoft XML_活用例
    【動画21】 エクセルマクロVBA「Web連携」Microsoft XML_活用例 未習得
  22. 【動画22】 エクセルマクロVBA「Web連携」Microsoft XMLとDOMの活用例
    【動画22】 エクセルマクロVBA「Web連携」Microsoft XMLとDOMの活用例 未習得
  23. 【動画23】 エクセルマクロVBA「Web連携」Microsoft Internet ControlsならではのWebコンテンツの取得
    【動画23】 エクセルマクロVBA「Web連携」Microsoft Internet ControlsならではのWebコンテンツの取得 未習得
  24. 【動画24】 エクセルマクロVBA「Web連携」Microsoft Internet Controls_Webコンテンツの取得
    【動画24】 エクセルマクロVBA「Web連携」Microsoft Internet Controls_Webコンテンツの取得 未習得
  25. 【動画25】 エクセルマクロVBA「Web連携」DOMを使ってXMLを解析
    【動画25】 エクセルマクロVBA「Web連携」DOMを使ってXMLを解析 未習得
  26. 【動画26】 エクセルマクロVBA「Web連携」Web連携のよくある問題
    【動画26】 エクセルマクロVBA「Web連携」Web連携のよくある問題 未習得
  27. 【動画27】 エクセルマクロVBA「Web連携」総括
    【動画27】 エクセルマクロVBA「Web連携」総括 未習得
  28. 【動画28】 AJAX通信の解析1: 背景、対応、流れの簡単な説明
    【動画28】 AJAX通信の解析1: 背景、対応、流れの簡単な説明 未習得
  29. 【動画29】 AJAX通信の解析2: 流れと事例の詳細
    【動画29】 AJAX通信の解析2: 流れと事例の詳細 未習得
  30. 【動画30】 クッキーを取得する方法
    【動画30】 クッキーを取得する方法 未習得
  31. 【動画31】 セッションの解析と実装-イントロダクション
    【動画31】 セッションの解析と実装-イントロダクション 未習得
  32. 【動画32】 「セッション」とは?その目的と、ウェブページでの事例
    【動画32】 「セッション」とは?その目的と、ウェブページでの事例 未習得
  33. 【動画33】 セッション解析と実装の落とし穴
    【動画33】  セッション解析と実装の落とし穴 未習得
  34. 【動画34】 セッション解析と実装のサンプルデータ解説
    【動画34】 セッション解析と実装のサンプルデータ解説 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ