はじめまして。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
> 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
のように記述してみてください。
魔界の仮面弁士さん、ご教授本当にありがとうございます。
さっそく先のコードでデータ保存を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
期待通りの結果がもらえるのですが、とてもうまくないコードな感じです。どなたかキレイにしてくださいましたら幸いです。
レスが付かないようなので、たたき台で。。。。
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
私ならこんなことを。
ツイート | ![]() |