【良回答には1万pt(!)送信します】


VB.NT(VisualBasic2008Express)のSubを書いてください。本当に困っています。同かよろしくお願い申し上げます。

ByVal wb1 As System.Windows.Forms.WebBrowser,
ByVal strUrl As String,
ByVal intWaitSecCompleted As Integer,
ByVal intWaitCountCompleted As Integer,
ByRef intCountCompleted As Integer,

を受け取り、次のような挙動をする。

(1) wb1で、strUrlのURLを表示しようと試み、
(2) intWaitSecCompletedの秒数だけDocumentComletedイベントが発生するのを待つ。
(3) もしintWaitSecCompletedの秒数内にDocumentCompletedイベントが発生したら、intCountCompletedに1を足すとともに、intWaitCountOfCompleteから1を引く。
(4) もし、intWaitCountOfCompleteが0に達していなかったら(2)に戻り、達していたらSubを出る。
(5) intWaitSecCompletedの時間内にDocumentCompletedイベントが発生しなくなったらSubを出る。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/10 04:36:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.2

回答回数1314ベストアンサー獲得回数393

ポイント100pt

だいぶお急ぎだったようですね。


質問で提示された内容と厳密に同じではないですが、こちらで機能的には同じになるよう解釈をして実装例です。

新規プロジェクトで「Winidows フォーム アプリケーション」を選択し、そこに Button(Button1) と

TextBox(TextBox1)と WbeBrowser(WebBrowser1)を配置しただけのものに、下記コードを置けば

動作環境は完了です。


TextBox1に URL を入力してボタン(Button1)をクリックすれば、WebBrowser1 に結果が表示されます。


厳密に、求められるものとは異なると思いますが、まずはたたき台として見てみてください。

これをカスタマイズしていくことで目的のものができそうならば、コメントに修正したい内容を書いていただければ、

できる範囲で対応いたします。


Public Class Form1
    '//-------------------------------------------------------------
    '// DocumentCompleted 用カウンタ
    '//-------------------------------------------------------------
    Public intCountOfComplete As Integer

    '//-------------------------------------------------------------
    '// DocumentCompleted イベント処理
    '//-------------------------------------------------------------
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        intCountOfComplete = intCountOfComplete + 1
    End Sub

    '//-------------------------------------------------------------
    '// クリックするとブラウズを開始
    '//-------------------------------------------------------------
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim intWaitTimeBySecForComplete As Integer = 2
        Dim intWaitCountOfComplete As Integer = 2
        Dim result As String = ""

        ShowInWbAndCountComplete(WebBrowser1, TextBox1.Text, intWaitTimeBySecForComplete, intWaitCountOfComplete, result)
        MsgBox(result)
    End Sub

    'ShowInWbAndCountComplete

    '//-------------------------------------------------------------
    '// ブラウジング処理
    '//-------------------------------------------------------------
    Private Sub ShowInWbAndCountComplete _
        (ByRef WbName As System.Windows.Forms.WebBrowser, _
        ByRef strUrl As String, _
        ByRef intWaitTimeBySecForComplete As Integer, _
        ByRef intWaitCountOfComplete As Integer, _
        ByRef strNormalFinishOrErrorFinish As String)

        '// カウンタを初期化
        intCountOfComplete = 0
        WbName.Navigate(strUrl)

        Dim startTime As DateTime
        startTime = TimeOfDay()

        strNormalFinishOrErrorFinish = "Normal"
        Do While WbName.ReadyState <> WebBrowserReadyState.Complete
            For j As Integer = 1 To (intWaitTimeBySecForComplete * 60)
                '// Complete カウントチェック
                If intCountOfComplete >= intWaitCountOfComplete Then
                    strNormalFinishOrErrorFinish = "All Completed"
                    Exit Do
                End If

                '// タイムアウトチェック
                If DateDiff("s", startTime, TimeOfDay()) >= intWaitTimeBySecForComplete Then
                    strNormalFinishOrErrorFinish = "Time Out"
                    Exit Do
                End If

                '// 
                Application.DoEvents()
                System.Threading.Thread.Sleep(100) '// 100msec : 0.1 sec sleep
            Next
        Loop
    End Sub
End Class
id:jjkkjpvb2008

ありがとうございます。

株式情報サイトによっては、その銘柄が存在するページと存在しないページとでDocumentCompletedイベントの発生回数が違うので、それを利用して、銘柄コードを収集しようとしてます。

また、株式関連情報ページにも、完全に全ての情報が表示されるまで何度もDocumentCompletedを待たないといけないページもありますので、それにも使うつもりです。

1つのSubにまとまればいいんだけどなぁ…。

ただいま検証中ですので、お待ちください…

2010/02/08 21:03:51

その他の回答3件)

id:code_tk No.1

回答回数77ベストアンサー獲得回数11

ポイント100pt

具体的なコードをとのことなので書いてみました

強引に仕様に従ってますので正直微妙です

どのような挙動が正しいのかが分からないのであってるか自信がありません

すいませんが具体的に何がしたいかを明記してもらったほうがいいかもしれません

※日系のページから株価を取得したいとか

ちなみに終了処理とかエラー処理とか全然書いていませんしバグ取りもしていないので使用には注意してください

Imports System
Imports System.ComponentModel
Imports System.Windows.Forms

Public Class Form1
    Dim _intWaitCountOfCompleted As Integer
    Dim _intCountOfCompleted As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As String = ""
        ShowInWbAndCountComplete(WebBrowser1, "http://company.nikkei.co.jp/index.aspx?scode=5401", 20, 10, 0, x)
    End Sub

    Private Sub ShowInWbAndCountComplete( _
        ByRef WbName As System.Windows.Forms.WebBrowser, _
        ByRef strUrl As String, _
        ByRef intWaitTimeBySecForComplete As Integer, _
        ByRef intWaitCountOfComplete As Integer, _
        ByRef intCountOfComplete As Integer, _
        ByRef strNormalFinishOrErrorFinish As String)
        intCountOfComplete = 0
        _intCountOfCompleted = intCountOfComplete
        _intWaitCountOfCompleted = intWaitCountOfComplete

        AddHandler WbName.DocumentCompleted, AddressOf DocumentCompleted

        WbName.Navigate(strUrl)

        Dim start As DateTime = DateTime.Now
        Dim timeout As New TimeSpan(0, 0, intWaitTimeBySecForComplete)

        While intWaitCountOfComplete > 0
            intWaitCountOfComplete = _intWaitCountOfCompleted
            If DateTime.Now - start > timeout Then
                intCountOfComplete = _intCountOfCompleted
                intWaitCountOfComplete = _intWaitCountOfCompleted

                strNormalFinishOrErrorFinish = "Error"
                Exit Sub
            End If

            Application.DoEvents()
        End While

        intCountOfComplete = _intCountOfCompleted
        intWaitCountOfComplete = _intWaitCountOfCompleted
        strNormalFinishOrErrorFinish = "Normal"
        Exit Sub
    End Sub

    Private Sub DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs)
        _intCountOfCompleted = _intCountOfCompleted + 1
        _intWaitCountOfCompleted = _intWaitCountOfCompleted - 1
    End Sub
End Class
id:jjkkjpvb2008

> ※日系のページから株価を取得したいとか

ビンゴ!

頭に「_」がついた変数は何ですかね? 「同じもの」ということですか?

株式情報サイトによっては、その銘柄が存在するページと存在しないページとでDocumentCompletedイベントの発生回数が違うので、それを利用して、銘柄コードを収集しようとしてます。

また、株式関連情報ページにも、完全に全ての情報が表示されるまで何度もDocumentCompletedを待たないといけないページもありますので、それにも使うつもりです。

1つのSubにまとまればいいんだけどなぁ…。

2010/02/08 21:03:55
id:Mook No.2

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント100pt

だいぶお急ぎだったようですね。


質問で提示された内容と厳密に同じではないですが、こちらで機能的には同じになるよう解釈をして実装例です。

新規プロジェクトで「Winidows フォーム アプリケーション」を選択し、そこに Button(Button1) と

TextBox(TextBox1)と WbeBrowser(WebBrowser1)を配置しただけのものに、下記コードを置けば

動作環境は完了です。


TextBox1に URL を入力してボタン(Button1)をクリックすれば、WebBrowser1 に結果が表示されます。


厳密に、求められるものとは異なると思いますが、まずはたたき台として見てみてください。

これをカスタマイズしていくことで目的のものができそうならば、コメントに修正したい内容を書いていただければ、

できる範囲で対応いたします。


Public Class Form1
    '//-------------------------------------------------------------
    '// DocumentCompleted 用カウンタ
    '//-------------------------------------------------------------
    Public intCountOfComplete As Integer

    '//-------------------------------------------------------------
    '// DocumentCompleted イベント処理
    '//-------------------------------------------------------------
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        intCountOfComplete = intCountOfComplete + 1
    End Sub

    '//-------------------------------------------------------------
    '// クリックするとブラウズを開始
    '//-------------------------------------------------------------
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim intWaitTimeBySecForComplete As Integer = 2
        Dim intWaitCountOfComplete As Integer = 2
        Dim result As String = ""

        ShowInWbAndCountComplete(WebBrowser1, TextBox1.Text, intWaitTimeBySecForComplete, intWaitCountOfComplete, result)
        MsgBox(result)
    End Sub

    'ShowInWbAndCountComplete

    '//-------------------------------------------------------------
    '// ブラウジング処理
    '//-------------------------------------------------------------
    Private Sub ShowInWbAndCountComplete _
        (ByRef WbName As System.Windows.Forms.WebBrowser, _
        ByRef strUrl As String, _
        ByRef intWaitTimeBySecForComplete As Integer, _
        ByRef intWaitCountOfComplete As Integer, _
        ByRef strNormalFinishOrErrorFinish As String)

        '// カウンタを初期化
        intCountOfComplete = 0
        WbName.Navigate(strUrl)

        Dim startTime As DateTime
        startTime = TimeOfDay()

        strNormalFinishOrErrorFinish = "Normal"
        Do While WbName.ReadyState <> WebBrowserReadyState.Complete
            For j As Integer = 1 To (intWaitTimeBySecForComplete * 60)
                '// Complete カウントチェック
                If intCountOfComplete >= intWaitCountOfComplete Then
                    strNormalFinishOrErrorFinish = "All Completed"
                    Exit Do
                End If

                '// タイムアウトチェック
                If DateDiff("s", startTime, TimeOfDay()) >= intWaitTimeBySecForComplete Then
                    strNormalFinishOrErrorFinish = "Time Out"
                    Exit Do
                End If

                '// 
                Application.DoEvents()
                System.Threading.Thread.Sleep(100) '// 100msec : 0.1 sec sleep
            Next
        Loop
    End Sub
End Class
id:jjkkjpvb2008

ありがとうございます。

株式情報サイトによっては、その銘柄が存在するページと存在しないページとでDocumentCompletedイベントの発生回数が違うので、それを利用して、銘柄コードを収集しようとしてます。

また、株式関連情報ページにも、完全に全ての情報が表示されるまで何度もDocumentCompletedを待たないといけないページもありますので、それにも使うつもりです。

1つのSubにまとまればいいんだけどなぁ…。

ただいま検証中ですので、お待ちください…

2010/02/08 21:03:51
id:code_tk No.3

回答回数77ベストアンサー獲得回数11

ポイント100pt

DocumentCompletedはイベントですので読み込みが完了した段階でイベントに書いた処理が発生します。

私の処理もAddHandlerでイベント設定してますしMookさんのもそうですよね

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.web...

んでReadyStateはプロパティです。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.web...

どちらで処理する場合も各フレームなどの単位で実行・設定されてしまうので正確に取得するならどのフレームで実行されたかを取得する必要があります

今回の場合はDocumentCompletedイベントが複数回呼び出されるのはAdSense関係が呼び出されるためのようですが…

こういうVBでHTTPアクセス関係好きなので日経にアクセスするソースも書いてみました

あとはHTMLソースを加工すれば株価取得とかできそうですね

例によって適当なのでエラー処理などは随時追加をお願いします

Public Class Form1
    Dim done As Boolean

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim URL(3) As String
        URL(0) = "http://company.nikkei.co.jp/index.aspx?scode=7203"
        URL(1) = "http://company.nikkei.co.jp/index.aspx?scode=8411"
        URL(2) = "http://company.nikkei.co.jp/index.aspx?scode=8306"
        For x As Integer = 0 To 2
            If NavigateAndWait(WebBrowser1, URL(x)) Then
                MsgBox(WebBrowser1.DocumentTitle)
            Else
                MsgBox("Error")
            End If
        Next
    End Sub

    Public Function NavigateAndWait(ByRef WbName As System.Windows.Forms.WebBrowser, ByVal url As String) As Boolean
        ' タイムアウト時間(60秒)
        Dim timeout As New TimeSpan(0, 0, 60)
        Dim start As DateTime = DateTime.Now
        done = False

        WbName.Navigate(url) ' ページの移動
        While done = False
            If DateTime.Now - start > timeout Then
                ' タイムアウト
                Return False
            End If
            Application.DoEvents()
        End While

        Return True
    End Function

    Private Sub DocumentCompleted(ByVal sender As System.Object, _
                                  ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs _
                                  ) Handles WebBrowser1.DocumentCompleted
        'e.urlが読み込みが終了したURL:sender.urlがアクセスしたいURL
        Console.WriteLine(e.Url)
        If e.Url = sender.Url Then
            done = True
        End If
    End Sub
End Class

id:freemann No.4

回答回数335ベストアンサー獲得回数55

ポイント100pt

他の方とやり方が割と違いますがこんな感じではダメでしょうか。


Public Class Form4

Private intCountCompleted As Integer = 0 '他のメソッドでも使用するのでフィールドにしました

Private blnTimeOut As Boolean = False '読み込みがタイムアウトした時にはTrueに設定する

Private intWaitCountOfComplete As Integer = 0


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim _intWaitSecCompleted As Integer = 3 'ダミーとして3秒としました

Dim _intWaitCountOfComplete As Integer = 3 'ダミーで3回としました

Me.ShowSite(Me.WebBrowser1, Me.TextBox1.Text, _intWaitSecCompleted, _intWaitCountOfComplete, Me.intCountCompleted)

End Sub

'指定されたメソッドです

Private Sub ShowSite(ByRef wb1 As WebBrowser, ByVal strUrl As String, ByVal intWaitSecCompleted As Integer, ByRef intWaitCountOfComplete As Integer, ByRef intCountCompleted As Integer)

Me.blnTimeOut = False

Me.Timer1.Interval = intWaitSecCompleted * 1000 'ミリ秒に変換

Me.intWaitCountOfComplete = intWaitCountOfComplete

Me.Timer1.Enabled = True

wb1.Url = New Uri(strUrl)

End Sub

Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'ウェブブラウザが完了した時の呼び出されるメソッドを登録

AddHandler Me.WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf wbDocumentCompleted)

End Sub

Private Sub wbDocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)

If Me.blnTimeOut = False Then

'タイマーがタイムアウトを告げる前に読み込みが完了した場合

Me.intCountCompleted += 1

Me.intWaitCountOfComplete -= 1

If Me.intWaitCountOfComplete = 0 Then


Me.Timer1.Stop()

Me.Timer1.Enabled = False

MessageBox.Show("読み込み完了!")

End If

End If

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

'読み込みを中止する

Me.WebBrowser1.Stop()

'タイムアウトのフラグを設定

Me.blnTimeOut = True

Me.Timer1.Enabled = False

MessageBox.Show("タイムアウトのため中断しました。" + " " + Me.intWaitCountOfComplete.ToString())

End Sub

End Class

  • id:jjkkjpvb2008
    自己コメントです。

    自分で書いたのは下記ですが、最初のDodumentCompletedイベントが発生してから1/1000秒ごとにDocumentCompletedをカウントアップしてしまうのです。

    Wb1.Navigate(strUrl)
    For i As Integer = 1 To intWaitCountComplete
     For j As Integer = 1 To (intWaitSecComplete * 60)
      If Wb1.ReadyState = WebBrowserReadyState.Complete Then
       intCountComplete = intCountComplete + 1
      End If
      Application.DoEvents()
      System.Threading.Thread.Sleep(1)
     Next
    Next
  • id:kn1967
    http://q.hatena.ne.jp/1265422157 の続きですね。

    id:Mook さんのご好意が無駄になるのは見ておれなかったのでコメントします。
    あちらのほうはご自身にて、謝辞もしくは挨拶と、こちらに新設した事を明記して、
    いただければと願います。
  • id:jjkkjpvb2008
    あっ、そうですね。そうします。
  • id:code_tk
    追記します。
    If Wb1.ReadyState = WebBrowserReadyState.Complete Then
    この条件だとReadyStateがComplete状態になったとき常にTrueになるのでDocumentCompletedがカウントアップするっていうのはそれが原因じゃないんですかね?
    検証したわけではないので違ってたらすいません
  • id:Mook
    すでに回答がついたようですが、せっかく書いたので一応回答しておきます。
    最初の回答で解決したらポイント不要です。
  • id:HALSPECIAL
    HALSPECIAL 2010/02/09 00:07:42
    要するにすべてのロードが終わるのを待ってから、何かの処理をしたいということでしょうか。
    でしたら検索するといくつか見つかりますが。
  • id:Mook
    DocumentCompleted の数で結果の判定をするというところに、一抹の不安を覚えるのですが、
    その仕様で問題ないのでしょうか。

    また単純に一回の処理ではなく、最終的には複数のデータに対して一括、もしくは連続して、
    処理をするようなことを目指しているのではないですか?

    であれば、入力データセットと、取得したいデータ形式まで含めて全体を説明したほうがよい
    ような気がします。

    場合によってはEXCELなどを利用したほうが、単純に処理できます。
    http://makotowatana.ld.infoseek.co.jp/vba_internet.html
    http://www.ken3.org/cgi-bin/group/vba_ie.asp
  • id:jjkkjpvb2008
    > Mook さん

    いつも色々ありがとうぞんじます。

    DocumentCompletedの数で次の処理を変える場合と、得られたソースの内容で次の処理を変える場合と、両方想定しています。ですから、書いていただいたコードの中に、ソースを取得する変数を入れる予定です。

    私がどうしてもできなかったのは、「DodumentCompleteイベントが発生したら、intWaitSecCompletedを初期化し、次のDodumentCompletedを待つ」ということです。intWaitSecCompletedの時間idleさせて、DodumentCompletedが発生するのを待つというものをかければ自分でできたのですが、どうしてもわかりませんでした。
  • id:jjkkjpvb2008
    > みなさん

    ここにコードを書きたいのですが、Mookさんのご回答のように、色分けされ、行頭のスペースもちゃんと表示されるように書き込むにはどうすればいいんでしょう?
  • id:Mook
    回答であれば、
    >|vb|
    コード
    ||<
    とすれば、自動で文法に合わせた色付けをしてくれますが、コメントではこの記法を使用できません。
    スペースを全角に置換しておけば、とりあえずインデントはそれらしく見えるようにできます。

    コメントにもスーパーpre記法が使えればいいんですけどね。
  • id:jjkkjpvb2008
    > Mookさん ありがとうございます。

    > みなさん

    下のように書いてみたのですが、うまくいきません。ウェブサイト「株マップ」から、存在する銘柄コードをリストアップしてファイルに書き込もうとしているのですが……。なお、「株マップ」では、銘柄が存在する場合はDocumentCompletedは2回、存在しない場合は1回、発生します。

    (半角スペースをすべて全角スペースにしてあります)

    Public Class Form1

        Dim intTreatingCode As Integer = 5400
        Dim strUrl As String = ""
        Dim strResult As String = ""
        Dim strCodeListToOutput As String = ""
        Dim strSourceOfWb As String = ""
        Dim intCountCompleted

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.Location = New Point(0, 0)
            txtLog.AppendText("- OK: Started to get code list of Japan from Kabumap session.")
            tmrWaitNextSession.Interval = 3000
            tmrWaitNextSession.Enabled = True
        End Sub

        Private Sub tmrStartApplication_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrStartApplication.Tick
            tmrStartApplication.Enabled = False
            txtExist.Text = ""
            txtNotExist.Text = ""
            Do Until intTreatingCode = 5425
                strUrl = "http://jp.kabumap.com/servlets/kabumap/Action?SRC=basic/top/base&codetext=" & intTreatingCode.ToString
                ShowUrlAndCountCompletedAndGetSource(WebBrowser1, strUrl, 15, 2, intCountCompleted, strSourceOfWb)
                Select Case intCountCompleted
                    Case 1
                        txtLog.AppendText(vbCrLf & "- OK: " & intTreatingCode.ToString & " is not exist.")
                        txtNotExist.AppendText(vbCrLf & intTreatingCode.ToString)
                    Case 2
                        txtLog.AppendText(vbCrLf & "- OK: " & intTreatingCode.ToString & " is exists.")
                        txtExist.AppendText(vbCrLf & intTreatingCode.ToString)
                        strCodeListToOutput = strCodeListToOutput & intTreatingCode.ToString & vbCrLf
                End Select
                intTreatingCode = intTreatingCode + 1
            Loop
            OverWriteFile("\\NMSTDT1\data\", "source_code-list_jpn_kabumap.txt", strCodeListToOutput, strResult)
            Select Case strResult
                Case "Failure"
                    txtLog.AppendText(vbCrLf & "- Error: Failured to write code list to '\\NMSTDT1\data\source_code-list_jpn_kabumap.txt'.")
                    txtLog.BackColor = Color.Pink
                    Exit Sub
                Case "Success"
                    txtLog.AppendText(vbCrLf & "- OK: Successed to write code list to '\\NMSTDT1\data\source_code-list_jpn_kabumap.txt'.")
                    txtDone.AppendText(vbCrLf & "- " & Date.Now & " " & TimeOfDay)
                    txtLog.AppendText(vbCrLf & "- OK: Waiting next session.")
                    tmrWaitNextSession.Interval = 3600000
                    tmrWaitNextSession.Enabled = True
            End Select
        End Sub

        Private Sub tmrWaitNextSession_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrWaitNextSession.Tick
            tmrWaitNextSession.Enabled = False
            tmrStartApplication.Interval = 3000
            tmrStartApplication.Enabled = True
        End Sub

        'ShowUrlAndCountCompletedAndGetSource
        Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            intCountCompleted = intCountCompleted + 1
        End Sub
        Private Sub ShowUrlAndCountCompletedAndGetSource( _
        ByVal wbName As System.Windows.Forms.WebBrowser, _
        ByVal strUrl As String, _
        ByVal intWaitTimeBySecForCompleted As Integer, _
        ByVal intWaitCountForCompleted As Integer, _
        ByRef intCountCompleted As Integer, _
        ByRef strSource As String)
            intCountCompleted = 0
            wbName.Navigate(strUrl)
            Dim startTime As DateTime
            startTime = TimeOfDay()
            Do While wbName.ReadyState <> WebBrowserReadyState.Complete
                For i As Integer = 1 To (intWaitTimeBySecForCompleted)
                    '// Complete カウントチェック
                    If intCountCompleted >= intWaitCountForCompleted Then
                        Exit Do
                    End If
                    If DateDiff("s", startTime, TimeOfDay()) >= intWaitTimeBySecForCompleted Then
                        Exit Do
                    End If
                    Application.DoEvents()
                    System.Threading.Thread.Sleep(1000)
                Next
            Loop
            strSource = wbName.DocumentText
        End Sub

        'DelLastVbcrlf

        '指定された文字列またはその文字列が格納されている変数の中最後に出現するvbCrLf(改行)以降を削除する。
        'vbCrLfが無ければ何もしない。

        'strGiven: 末尾のVbCrLf(改行)を削除したい文字列、またはその文字列が格納されている変数。

        Public Sub DelLastVbcrlf(ByRef strGiven As String)
            Dim intVknbyhsokd As Integer = strGiven.LastIndexOf(vbCrLf)
            If intVknbyhsokd >= 0 Then
                strGiven = strGiven.Substring(0, intVknbyhsokd)
            End If
        End Sub

        'OverWriteFile
        Public Sub OverWriteFile( _
        ByRef strDirectoryPath As String, _
        ByRef strFileName As String, _
        ByRef strStringToWrite As String, _
        ByRef strResultOfOverWriteFile As String)
            Try
                Using sw As New System.IO.StreamWriter(strDirectoryPath & strFileName, False)
                    sw.Write(strStringToWrite)
                End Using
                strResultOfOverWriteFile = "Success"
            Catch ex As System.IO.DirectoryNotFoundException 'フォルダが存在しなければFailureを返す
                strResultOfOverWriteFile = "Failure"
            End Try
        End Sub

    End Class
  • id:jjkkjpvb2008
    > みなさま

    結局、みなさまのご回答を参考に、仕様を少し単純に変えて自作しましたので、1万ptの方は無しとします。ただ、嘘つきと思われるのは嫌ですので、次の通り、参考にさせていただいた度合いに応じて、合計1万ptを送信させていただきます。

    code_tk さん 2,000pt
    Mook さん 7,000pt
    freeman さん 1,000pt

    大変ありがとうございました。また何かわからないことがあったら、よろしくお願い申し上げます。
  • id:Mook
    前回の質問もそうですが質問の有効期間は1週間ありますから、もう少し気長に待たれてはどうでしょうか。
    お急ぎだったとは思いますが、時間がとれたらコードを見ようとしていたところでしたので。

    まぁご自身で解決できたのであれば、それに越したことはないのですが。

    上記のコードを見て気になったところがありましたので、下記にコメントしました。
    あまり処理の内容はじっくり見ていませんが、今後コードを書いていく上で気を付けていくとよいかと思います。
    http://d.hatena.ne.jp/Mook/20100210
  • id:jjkkjpvb2008
    > Mook さん

    色々ありがとうございます。今後「vb-net」というIDで質問しますので、今後ともどうぞよろしくお願い申し上げます。
  • id:Mook
    多くのポイントありがとうございました。

    老婆心からなのであまり気にされなくともよいですが、
    支障がないのであれば質問期間も残っていましたので、ポイントは回答に直接された方が良いかと思います。
    過去に同様のケースで「ポイントを実際は送っていないのではないか」というあらぬ疑いをかけられた質問者さんもいましたので。
    (個人的には、ポイント送信は平均ポイントに入らないということもありますが ^^;;)

    今回の回答コードに関して、修正や不具合があるようでしたら、こちらかDiaryへのコメントください。
  • id:vb-net
    > Mook さん

    こんにちは。jjkkvb2008 改め vb-net です。
    > 個人的には、ポイント送信は平均ポイントに入らないとうこともありますが
    なるほどねぇ…ただ、通常の、回答へのポイント送信は100ptまでなんですよね…
  • id:Mook
    >ただ、通常の、回答へのポイント送信は100ptまでなんですよね…
    それで「満点」だったんですねw。

    仕様が変わったんでしょうか?
    だとしたらこれ以上平均受け取りポイントが上がらないので残念ですが。

    と思って確認してみると、今月も100以上ポイントが付いているケースがありますね。
    質問したことがないので(^^;;)、ポイントの付け方を知らないのですが、ヘルプを見ると
    http://hatenaquestion.g.hatena.ne.jp/keyword/%E8%B3%AA%E5%95%8F%E3%81%99%E3%82%8B#question
    「ポイント欄に直接入力」でできるのかもしれません。
  • id:vb-net
    > Mook さん

    あっ、本当だ。今度やってみます。

この質問への反応(ブックマークコメント)

トラックバック

  • プログラミング[VB でWebControl] VBを使った処理については、いずれじっくり記事を書いてみたいが、今回は質問へのコメントのための記事です。 元の質問はこちら。 http://q.hatena.ne.jp/1265614184
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません