タイトル | : Do Until objIE.Busy = Falseが効いていない? |
記事No | : 15033 |
投稿日 | : 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
|