tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Do Until objIE.Busy = Falseが効いていない?
投稿日: 2010/11/09(Tue) 10:19
投稿者ガッツ
VB6+XP+IE7です。

IEを起動してテキストボックスに値を入れて検索ボタンをクリックし、
ソースを取得するというプログラムを作成していますが、
ソースを取得する部分でたまに以下のエラーが出ます。
出ないときもあります。

「実行時エラー '91'
オブジェクト変数またはWithブロック変数が設定されていません。」

Do Until objIE.Busy = Falseの判定が効いてないのでしょうか。
Do 〜 Loop の中にDebug.Printを入れて確認したのですが、
1〜3回程度入っているようです。

本来は以下のページのように
http://www.happy2-island.com/vbs/cafe02/capter00710.shtml
フォームの操作を行いたいのですが、
今回やりたいページ(http://phonebook.excite.co.jp)ではフォームがないので、
以下のソースのようにキーボードを操作する関数を使用しています。

ソース
    'objIEオブジェクトを作成します
    Set objIE = CreateObject("InternetExplorer.Application")
    
    'ウィンドウの大きさを変更します
    objIE.Width = 800
    objIE.Height = 600
    
    '表示位置を変更します
    objIE.Left = 0
    objIE.Top = 0
    
    'インターネットエクスプローラ画面を表示します
    objIE.Visible = True
    
    '指定したURLを表示します
    objIE.Navigate "http://phonebook.excite.co.jp"

    'ページの読み込みが終わるまでココでグルグル回る ←ここはOK
    Do Until objIE.Busy = False
       '空ループだと無駄にCPUを使うので1000ミリ秒のインターバルを置く
       Sleep 500
    Loop '

    'テキストファイルから検索文字を取得し、検索
    Do While Not EOF(FN1)
      '検索文字の取得処理

      '前回入力文字の削除
       Call sSetSendKeys(vbKeyControl, vbKeyA)
       Sleep 250
       Call sSetSendKeys(vbKeyDelete)
       Sleep 250
                    
       'IEの検索BOXに電話番号をセット
       Call sSetSendTxts(strTelNo)
                    
       '検索ボタンクリック
       Call sSetSendKeys(vbKeyReturn)

       'ページの読み込みが終わるまでココでグルグル回る
       '中にDebug.Printを入れて確認したが、何回かこの中に入っているのを確認
       Do Until objIE.Busy = False
           Sleep 500
       Loop

      'HTMLソースを取出す
       strHTML = objIE.Document.body.innerHTML  'ここでたまに上記エラー

      '取得したソースから欲しい情報を取得してファイルに出力処理
    Loop
    Close #FN1


'キーボード操作
'==================================================================
'キーストロークをシミュレートする(P1065)
Public Declare Sub keybd_event Lib "user32.dll" _
   (ByVal bVk As Byte, ByVal bScan As Byte, _
    ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Public Const KEYEVENTF_KEYUP = &H2         'キーアップ
Public Const KEYEVENTF_EXTENDEDKEY = &H1   'スキャンコードは拡張コード
'仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
Public Declare Function MapVirtualKey Lib "user32" _
    Alias "MapVirtualKeyA" (ByVal wCode As Long, _
    ByVal wMapType As Long) As Long
'==================================================================
'システムを立ち上げてからの経過時間を高精度に取得する(P1002)
Public Declare Function timeGetTime Lib "winmm.dll" () As Long


Public Sub sSetSendKeys(bVk1 As Long, _
                Optional bVk2 As Long = 0, Optional bVk3 As Long = 0)
'SendKeys と同様にアクティブウィンドウにキーストロークを送る
'以下のパターンは必要により追加して下さい。
    If bVk2 = 0& And bVk3 = 0& Then
    'キーを1個だけ送る
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
            Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    ElseIf bVk3 = 0& Then
    'キーの複合操作 [Alt] + [E] 等
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
            Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
            Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    ElseIf (bVk1 <> 0&) And (bVk2 <> 0&) And (bVk3 <> 0&) Then
    'SendKeys "%(EA)" と同様の操作
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
        Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
        Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        Call keybd_event(CByte(bVk3), MapVirtualKey(CByte(bVk3), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
        Call keybd_event(CByte(bVk3), MapVirtualKey(CByte(bVk3), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    End If
    StopTime (50)     '連続処理した場合を考慮
End Sub


Public Sub sSetSendTxts(MyString As String)
'SendKeys と同様にデータ(文字列)をアクティブウィンドウに送ります。
    'クリップボードを初期化
    Clipboard.Clear
    StopTime (10)
    '選択した範囲のテキストをコピー
    Clipboard.SetText MyString
    StopTime (10)
    Call sSetSendKeys(vbKeyControl, vbKeyV) '貼り付け
    StopTime (10)
End Sub

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。