ブラウザコントロールでタグを探っています。TRの中の文字の長さを取得しているのですが、今までPentium M や Pentium IIIのノートでは何も問題ありませんでした。ところが、今回、Core Duoのノートに変更したところ Ifのところで書き込みができませんというエラーがでて止まります。
For のところで一度ブレイクをかけて次の Ifへいったときは問題がありません。Forにはいる前にページ自体が読み込み完了しているかはチェックしていますが、今回の場合、どのようなチェックを入れたらいいものでしょうか?
よろしくお願いします。
For Each myTag In myIE.Document.all.tags("TR")
If (Len(myTag.innertext)) < 10000 then
End If
Next myTag
No.4ベストアンサー
- 回答日時:
> アーリーバインディングしていました。
アーリーでもレイトバインドでも大丈夫だと思いますけど
以下は、読み込み待機のサンプルです。試してみてください。
# ちなみに HTML ソースや innerText 取得のみが目的なら IE を起動
# する必要はありません。
# Microsoft HTML Object Library の createDocumentFromUrl で直接
# HTML DOM を生成できるので。
Private Declare Sub Sleep Lib "kernel32.dll" ( _
ByVal dwMilliseconds As Long)
' IE オブジェクト ReadyState プロパティーの定数(抜粋)
Public Const READYSTATE_COMPLETE As Long = 4
Sub SampleProc()
' myIE ってことはグローバルレベルですよね...?
' でもサンプルなので...ローカルでやります
Dim IE As Object ' InternetExplorer Application
Dim TR As Object ' HTMLTableRow
Dim sUrl As String
Dim bComplete As Boolean
Dim bChangeUrl As Boolean
sUrl = "http://oshiete1.goo.ne.jp/qa2592462.html"
Set IE = CreateObject("InternetExplorer.Application")
' IE 可視化
IE.Visible = True
' 一度空ページに Navigate してから目的のページに飛ぶ
' --> Document 取得でエラーにならない
IE.Navigate "about:blank"
IE.Navigate sUrl
' 2 重のロジックでロード完了を待機
Do
If IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE Then
bComplete = True
End If
If UCase$(IE.Document.URL) <> "ABOUT:BLANK" Then
bChangeUrl = True
End If
' 無駄な CPU パワー消費防止のため適当に Sleep する
Call Sleep(100)
' ※ DoEvents については、私はあった方が良いと思う
DoEvents
Loop Until bComplete And bChangeUrl
If UCase$(IE.Document.URL) Like "RES://*" Then
' タイムアウトやエラー404などで目的の Document が
' 正しく取得できなかった場合の処理
Debug.Print "(ERR) Document の取得に失敗しました"
Else
' 目的の Document が正しく取得できた場合の処理
For Each TR In IE.Document.all.tags("tr")
' innerText をイミディエイトウインドウに表示
Debug.Print TR.innerText
Next
End If
' InternetExplorer への参照を開放
Set IE = Nothing
End Sub
No.3
- 回答日時:
こんにちは。
#1のWendy02です。>『myIE.Document.all.tags("TR") 一旦、オブジェクト変数の中』とご指摘いただいておりますが、具体的にどのようなコードを書けばよろしいのでしょうか?
コード自体は、たぶん、ありきたりのないようで、問題はないとは思っています。
ただ、eIE(IEオブジェクトの変数)を維持するのが、厳しいのかな思ったのです。
単に
Set DocAll = myIE.Document.All
または、
Set DocAllTags = myIE.Document.All.Tags("TR")
ということです。
もしくは、全体に、With ステートメントを入れて、
With myIE
または、
Set DocAllTags = .Document.All.Tags("TR")
または、
'Set DocAll = .Document.All →DocAll.tags("TR") と繋ぐ。
For Each myTag In DocAllTags
If (Len(myTag.innertext)) < 10000 then
'実行
End If
Next myTag
End With
それと、話が前後してしまいますが、
Do While myIE.Document.ReadyState <> "complete"
↓
ここは、
Do Until myIE.ReadyState = 4 '(事前バインディングなら、[READYSTATE_COMPLETE])
としたほうがよいのでは?
No.2
- 回答日時:
こんばんは。
> Core Duoのノートに変更したところ Ifのところで書き込みができません
> というエラーがでて止まります。
結論から言えば、Document オブジェクトが正しく取得できてないのだと
思います。その根拠は、
> For のところで一度ブレイクをかけて次の Ifへいったときは問題が
> ありません。
このコメントで明らかです。原因は、
> Forにはいる前にページ自体が読み込み完了しているかはチェックしています
ここです。このチェック方法に誤りがあるか、または不十分なのでしょう。
他 PC で動作し、Core Duo でエラーとなったのは、単に各 PC のネットワーク
性能、環境、あるいは設定などプログラムとは異なる要素による結果に過ぎない
のでは?
現時点では、これ以上何とも言えないのですが、IE オブジェクト生成~For Each
までのコードを補足してもらえますか?
この回答への補足
こんにちは。ありがとうございます。
まず、#1さんでご指摘がありましたが、myIEはアーリーバインディングしていると思っていたのですがソウではありませんでした。まずは、ここを直してみたいといけないと思います。myIEの生成は、、、
Set myIE = CreateObject("InternetExplorer.application")
です。
読み込み完了チェックは、、、、
Do While myIE.Busy
DoEvents
Loop
Do While myIE.Document.ReadyState <> "complete"
DoEvents
Loop
以上です。
不足の点がありましたら、また追加いたします。
よろしくお願いします。
No.1
- 回答日時:
こんばんは。
最初に、機種固有の問題は、同じ機種を持った人間でないと、分からないような気がします。
全体像は見えていないのではっきりとしませんが、
>Ifのところで書き込みができませんというエラーがでて止まります。
エラーコードは、実行時エラー「70」 なのでしょうか?
もしかしたら、コードの途中で、アクセスして作った、myIEの IEオブジェクトが壊れているか、ラインが切れているもしれません。もし、そうだったら、事前バインディングしたらいかがですか?
CreateObject をしているのではありませんか?
また、途中で、回線に割り込みが入っている場合は、こちらでは、どうしようもありませんね。例えば、ブレイクの代わりに、Wait を入れても、多少、余裕を持たせても、あまり期待できないかもしれません。Wait の代わりに、API のSleep を置くというのもありますが。
どこか、切れそうな危ない部分に、
DoEvents
を入れて、ラインの命綱が、途切れないようにするとか、
それと、
myIE.Document.all.tags("TR") このままだと、丸抱えになりますから、それを、一旦、オブジェクト変数の中に入れてから、それを、Tags("TR") 分だけを別に取り出し、負担を軽減させるとか。
方法は、いろいろ試してみるしかありません。
この回答への補足
こんにちは。ありがとうございます。
ご指摘の通りアーリーバインディングではありませんでした。エラーは70です。
まずは、ここを直してみます。
『myIE.Document.all.tags("TR") 一旦、オブジェクト変数の中』とご指摘いただいておりますが、具体的にどのようなコードを書けばよろしいのでしょうか? ご教授いただけると、幸いです。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Visual Basic(VBA) chromedriverのver-upで動作不安定となった 3 2022/07/07 11:32
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワポで曲がった両矢印の簡単...
-
パワーポイントの表
-
音声マークを一括非表示にしたい。
-
パワーポイント「スライドショ...
-
PowerPointのアニメーションで...
-
PowerPointで、作成されたファ...
-
you tubeにパワポで作った動画...
-
PowerPointVBAでスライドマスタ...
-
USBとは?至急です! 大学でプ...
-
パワーポイントで、全てのスラ...
-
パワーポイント2016でデザイン...
-
PowerPointで、線を点滅した感...
-
パワーポイントをプロンプター...
-
PowerPointについて質問です。 ...
-
PowerPointの箇条書きの既定の...
-
PowerPoint で動画を再生中に表...
-
パワーポイントでの印刷時の枠...
-
パワーポイント2019 図の透...
-
office2019プロダクトキー紛失
-
パワーポイントpowerpointでユ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワポで曲がった両矢印の簡単...
-
音声マークを一括非表示にしたい。
-
パワーポイント「スライドショ...
-
パワーポイントの表
-
PowerPointでスライドマスタの...
-
エクセル・パワーポイントなど...
-
PowerPointVBAでスライドマスタ...
-
PowerPointのアニメーションで...
-
PowerPointで、作成されたファ...
-
エクセルでA3の大きさに資料...
-
ExcelのグラフをPowerPointに貼...
-
パワーポイントで資料を作る時 ...
-
パワーポイントのアニメーショ...
-
【パワーポイントのフォントが...
-
プレゼン時のポインター
-
PowerPoint2010、2021のスライ...
-
パワーポイントで、全てのスラ...
-
パワーポイントで説明しながら...
-
PowerPointのオプションの設定...
-
PowerPointの背景について
おすすめ情報