DocumentCompleteを使うには?

解決


DOKA  2004-09-14 02:41:35  No: 85540

はじめまして。DOKAと申します。
ホームページを連続でローカルに保存するプログラムを作っているのですが、DocumentCompleteの使い方が理解できません。このDocumentCompleteを呼び出すにはどの様にすればよいのでしょうか?これはホームページ読みこみ完了時にどこかから自動的に呼ばれるものなのでしょうか?今はDocumentCompleteの代わりにMsgBoxを使って手動で読み込み完了まで待つようにするところまで書けました。あとはこれをDocumentCompleteで自動的に完了を待てるように書きたいのです。どうかご教授お願いいたします。

私が書いたものを載せておきます。ご指南ください。

Option Explicit
Dim FLG As Integer

Private Sub Command1_Click()
    Dim stockURL(2) As String
    Dim i, ii As Integer
    Dim strTemp1 As String
    
    stockURL(0) = "http://quote.yahoo.co.jp/q?d=t&s=4689.T"  'ヤフー
    stockURL(1) = "http://quote.yahoo.co.jp/q?d=t&s=6758.T" 'ソニー
    stockURL(2) = "http://quote.yahoo.co.jp/q?d=t&s=9437.T" 'ドコモ
    
    For i = 0 To 2
        FLG = 0

        WebBrowser1.Navigate stockURL(i)

        '***HTML取得完了まで待つ*********************
        MsgBox "時間稼ぎ", vbInformation  'このMsgBoxの代わりに

        'While FLG = 0 'DocumentCompleteでFLG = 1になるようにしたい
        'Wend
        
        '********************************************

        strTemp1 = WebBrowser1.Document.body.outerhtml
        
        Open "c:\temp" + CStr(i) + ".html" For Output As #1
            Print #1, strTemp1
        Close #1
        
    Next
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    FLG = 1
End Sub


魔界の仮面弁士  2004-09-14 02:55:10  No: 85541

> DocumentCompleteを呼び出すにはどの様にすればよいのでしょうか?
DocumentCompleteはイベントですので、自分から呼び出す物ではありません。

たとえば、「ボタンが押された時」という処理を、
  Private Sub Command1_Click()
    FLG = 1
  End If
のようにして、FLGが変更されるまでループで待機する……なんて事は
普通はしませんよね。DocumentComplete であっても、それは同じですよ。

イベントが発生した時に、後続の処理———今回は、データをファイルに保存して、
それが終わったら、次のページを表示するようにする———が行われるように
すればOKかと。

>    Dim i, ii As Integer
これだと、変数 ii の方は Integer型 になりますが、
i の方は「規定のデータ型」(通常はVariant)になってしまいます。
この場合は、
  Dim i As Integer
  Dim ii As Integer
もしくは、
  Dim i As Integer, ii As Integer
のように記述してみてください。


DOKA  2004-09-14 12:27:00  No: 85542

魔界の仮面弁士さん、ご教授本当にありがとうございます。
さっそく先のコードでデータ保存をDocumentCompleteの中に移してみようと改コードを続けた結果、思い通りの動作をさせることができました。とても不恰好なコードですが添付しておきます。

1.上記のコードをデバッグで追ってみるとCommand1_Click()がEnd Subまで行かないとWebBrowser1_DocumentCompleteが呼ばれないことが分かった。なのでCommand1_Click()内でループして各URLの内容を読み込ませることを断念。(1つ目、2つ目のHTMLの内容は中途半端で終わってしまう)
2.次にWebBrowser1_DocumentComplete内でWebBrowser1.Navigateをループさせようとするがコンパイラに型が一致しないと怒られ断念。
3.それならば新たにFunction nextURL()を作ってその中でWebBrowser1.Navigateをループさせることにする。流れの構想はCommand1_Click()→WebBrowser1_DocumentComplete()→nextURL()→WebBrowser1_DocumentComplete()→nextURL()→WebBrowser1_DocumentComplete()  そのためにWebBrowser1.Document.body.outerhtmlだけをWebBrowser1_DocumentComplete()内に置くがこれも怒られ断念。デバッグしてみるとexeの読み込み時にWebBrowserが呼ばれている様子。なのでCommand1_Click()をForm_Load()にしてみた。その結果が次のコード。これで動くようになった。

Option Explicit

Dim stockURL(2) As String
Dim i As Integer
Dim strTemp1 As String
Dim a

Private Sub Form_Load()
    
    stockURL(0) = "http://quote.yahoo.co.jp/q?d=t&s=4689.T" 'ヤフー
    stockURL(1) = "http://quote.yahoo.co.jp/q?d=t&s=6758.T" 'ソニー
    stockURL(2) = "http://quote.yahoo.co.jp/q?d=t&s=9437.T" 'ドコモ

    WebBrowser1.Navigate stockURL(i)
    
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)

    strTemp1 = WebBrowser1.Document.body.outerhtml
    
    Open "c:\temp" + CStr(i) + ".html" For Output As #1
        Print #1, strTemp1
    Close #1
    
    i = i + 1
    a = nextURL()
    
End Sub

Private Function nextURL()
    If (i <= 2) Then  '配列の要素数を調べる方法が分からないので数字の2を直接代入
        WebBrowser1.Navigate stockURL(i)
    End If
    
End Function

期待通りの結果がもらえるのですが、とてもうまくないコードな感じです。どなたかキレイにしてくださいましたら幸いです。


ねろ  2004-09-15 02:32:56  No: 85543

レスが付かないようなので、たたき台で。。。。

Option Explicit
Dim stockURL() As String

Private Sub Command1_Click()
    WebBrowser1.Navigate stockURL(0, 0)
End Sub

Private Sub Form_Load()
    Dim Fileno
    Fileno = FreeFile
    Open App.Path & "\" & "opning.html" For Output As #Fileno
    Print #Fileno, "<font size=" & Chr(34) & "6" & Chr(34) & ">ボタン押してね(^^)</font>"
    Close #Fileno
    setUrl  'URLをセット
    DoEvents
    WebBrowser1.Navigate2 App.Path + "\" + "opning.html"
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    Dim n, Fileno
    For n = 0 To UBound(stockURL)
        If URL = stockURL(n, 0) Then
            Fileno = FreeFile
            Open App.Path & "\" & stockURL(n, 1) & ".html" For Output As #Fileno
            Print #Fileno, WebBrowser1.Document.body.outerhtml
            Close #Fileno
            If n < UBound(stockURL) Then
                WebBrowser1.Navigate stockURL(n + 1, 0) '一つ前でおしまい
            End If
            Exit For
        End If
    Next
End Sub

Private Sub setUrl()
    Dim n
    Const UrlH = "http://quote.yahoo.co.jp/q?d=t&s="
    '****URLの追加変更はここでする************
    ReDim stockURL(2, 1)
    stockURL(0, 0) = "4689": stockURL(0, 1) = "Yahoo"
    stockURL(1, 0) = "6758": stockURL(1, 1) = "Sony"
    stockURL(2, 0) = "9437": stockURL(2, 1) = "Docomo"
    '*****************************************
    For n = 0 To UBound(stockURL)
        stockURL(n, 0) = UrlH & stockURL(n, 0) & ".T"
    Next
End Sub

私ならこんなことを。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加