電子書籍の厳選無料作品が豊富!

今まで、何でもなかったのですが、fc2ブログの PRの枠内の内容が変わったせいか、
ページがハングします。
で、
.Busy = True  <> "complete"
この部分で、プログラムが止まります。
時間で このルーチンを逃げたいのですが、一番簡単な方法は無いでしょうか?できれば 2分くらいで・・・・

で、
Do While .Busy = True
DoEvents
For i = 1 To 40
Call Sleep(50)
DoEvents
Debug.Print .Busy
   If i > 40 Then
   Exit Sub
  End If
Next
Loop
これでテストしたんですが
.Busy が False でも DO-LOOP を ぬけてくれないのです。
どこで 間違ったでしょうか

Set netobjIE = CreateObject("internetExplorer.application")
url = "http://admin.blog.fc2.com/control.php?mode=edito …
With netobjIE
.navigate url
.Visible = True
Do While .Busy = True
DoEvents
Loop

Do While .document.readyState <> "complete"
DoEvents
Loop

Dim in_str As String
Dim doc As HTMLDocument
Set doc = netobjIE.document
Dim sel As IHTMLInputElement
in_str = "ログイン FC2 - 無料ホームページ"
'Debug.Print InStr(IE.document.Title, in_str)
If InStr(netobjIE.document.Title, in_str) > 0 Then 'ログインページなら

A 回答 (4件)

#3の回答者です。



>FC2のPRフレームが、特定のスポンサーの時、HPを読み込め無くてハング状態になるようです。

それは気が付かなかったですね。
最近、また、AdBlock Plusを付けるようになったので、まったく気にならないのです。AdBlock自体が問題を発生させるのは知っていますが、やむを得ないのです。解決策とは言えませんが、一つの方法であることは間違いないと思います。

IEのみでも、同じ効力を発生させることができるのですが、一旦、それをすると、戻せないのです。快適とは言っても見れないものもあります。それに懲りて、AdBlock を利用しているのですが、もうちょっと気の利いたのがあればとは思っています。

おっしゃっていた状況は、想像はつくのですが、ExcelのVBAは、そういう点で弱いです。たぶん、JavaScript と Active X コントロールをVBAの稼働している限りは、有効・無効が可能だと思います。

http://www.ken3.org/vba/backno/vba117.html

objIE.Silent = True
このコマンドが利いてくれれば面白いのですが。

三流君の...
》セキュリティの設定でJavaScriptなどをOFFにしてから巡回作業。
》そんな簡単なプロパティが無い。
》※あったら、マズイんだけど。。。

これは、やる気次第ですね。たぶんですが。

-------------------
なお、#3のコードのIEの宣言の
Dim NetObjeIE As Object
  ↓
Dim NetObjIE As Object
の間違いでした。
    • good
    • 0
この回答へのお礼

お手数おかけしました。

状況理解できました。

お礼日時:2017/02/03 23:07

こんにちは。



今、コードを見てみましたが、ハングしているようにも思えませんが、ただ、コードの目的が良く理解できないのです。たぶん、これは、クローリング(データ取得)ではありませんね。

>url = "http://admin.blog.fc2.com/control.php?mode=edito …

FC2 のHTML のソースの中に、以下のような言葉が混じっています。
※ <クラスはオートメーションまたは予測したインターフェースをサポートしていません。

ということで、オートメーションでのアクセスは不可ということかな?ではなさそうですね。あまり細かく見ていないのですが、そのままではできないということになりそうです。

言い換えれば、
CreateObject("internetExplorer.application")
で、オートメーション・オブジェクトを作った時に、通常IE の持っていた登録情報などは使えたのかなっていうことです。フリーログインにした状態で、IE をShell から立ち上げても、私の方は、弾かれたので、以下のようなコードを考えてみました。

なお、
>Dim doc As HTMLDocument
今のコードの中で、これを使う部分がありますか? objIEを継続・維持している限りは、いらないような気がします。

'//
Const MADD As String = "メールアドレス"
Const MPASS As String = "パスワード"
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Sub TestIEObject()
 Dim NetObjeIE As Object
 Dim URL As String
 Dim doc As HTMLDocument
 
 Set netobjIE = CreateObject("internetExplorer.application")
 URL = "http://admin.blog.fc2.com/control.php?mode=edito …
 With netobjIE
  .navigate URL
  .Visible = True
  Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  End With
  Sleep 50 '気休め 'TimeValue 関数よりも軽いので、Sleep のほうがベター
  With netobjIE
   Dim myID
   .document.getElementById("id").Value = MADD
   .document.getElementById("pass").Value =MPASS
   If .document.getElementsByTagName("INPUT")(2).Value = "ログイン" Then
    .document.getElementsByTagName("INPUT")(2).Click
    Else
    MsgBox "ログインのボタンの状態が変わりました。", vbExclamation
    Exit Sub
   End If
  Do While .Busy Or .ReadyState <> 4: DoEvents: Loop  '画面の切り替わりを待つ
'** この後は分かりません。
  'in_str = "ログイン FC2 - 無料ホームページ"
  ''Debug.Print InStr(IE.document.Title, in_str)
  'If InStr(netobjIE.document.Title, in_str) > 0 Then 'ログインページなら
  ' Stop
  'End If
  End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
どうも、FC2のPRフレームが、特定のスポンサーの時、HPを読み込め無くてハング状態になるようです。(応答なし)
別のスポンサーの時は無問題。

こちらの JAVAかadobeのただソフトのバージョンかもう少し、詰めてみます。

コードはスマートで参考になります。

お礼日時:2017/02/03 17:46

ANo1です



失礼しました
50×40は 2秒でしたね。(^_^;)
訂正しておきます。
    • good
    • 0

こんにちは



時間設定を設けたいのであれば、それをループから抜け出す条件に加えておくのが簡明だと思います。


>これでテストしたんですが
ご呈示のコードを見てみると、
>.BusyがFalseでもDO-LOOPをぬけてくれないのです
ということはないと思います。
ただし、抜けるタイミングが意図したものとは違うようになっているのではないでしょうか。

まず、Forループの中の分岐で i>40 なら抜けるというおつもりのようですが、ループ内では1≦i≦40に制御されていますから、i>40になることはありません。
従って、この条件分岐は機能しないことになります。

また、このループの中では他には分岐する処理がないので、Forループは必ず最後まで回るということになります。
ループ内にSleep(50)がありますので、このForループは2分以上(50×40回)はかかりますから、仮にその間に.Busyの値がFalseに変わったとしても、そのままループは継続されます。
その後、Do Wileで改めて.Busyが評価され、外側のループを抜けることになると思いますので、タイミングが悪いと反応が起こるまでに2分程度かかる可能性があります。
さらには、.Busy=Trueが続いた場合は、当然ながら無限ループになります。


最初に述べたように時間制限をそのままDo Wileの条件に加えたものを、簡略化して記述してみると以下のような感じになると思います。

timeOut = Now + TimeValue("00:02:00") '←2分後を設定

Do While .Busy = True And Now < timeOut
 DoEvents
Loop

If .Busy = True Then
' タイムアウト時の処理
End If
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!