プロが教える店舗&オフィスのセキュリティ対策術

エクセル VBA でIE制御プログラムを作成していますが、エラーが発生します。

どなたか、ご存知の方がいらっしゃいましたら、ご教授のほど、よろしくお願いいたします。

エクセルのセルに入っている文字列と同じ文字列があったら、リンクをクリックさせたいのですが、エラーが発生してしまいます。泣

違うパソコンでは、正常に動く、プログラムなのですが、今使っているパソコンだとエラーが発生してしまいます。

設定か何かを変更すればよいのでしょうか?

作業が先に進まず、非常に困っています。

どなたか、知恵をお貸しください。よろしくお願いいたします。

'----------------------------------------------------------------------------------
For Each Obj In objIE.document.getElementsByTagName("a")
'表示されているサイトのアンカータグ一つずつを変数objにセット                              '各アンカータグ単位に以下の処理を実施
If Obj.innerText = "自動車" Then
'アンカータグの表示内容が「自動車」の場合に以下の処理を実施
Obj.Click
'上記に該当するタグをクリック
Exit For
'クリック後、処理を抜ける
End If
Next

'-------------------------------------------------------------------------------------

'ページの表示完了を待ちます。1
While objIE.readyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
DoEvents

Wend


Application.Wait (Now + TimeValue("0:00:5"))




'-------------------------------------------------------------------------------------

For Each Obj In objIE.document.getElementsByTagName("a") ←ここで91エラーが発生します。
'表示されているサイトのアンカータグ一つずつを変数objにセット
'各アンカータグ単位に以下の処理を実施
If Obj.innerText = Worksheets("Sheet1").Range("A2") Then
'アンカータグの表示内容が「」の場合に以下の処理を実施
Obj.Click
'上記に該当するタグをクリック
Exit For
'クリック後、処理を抜ける
End If
Next




’------------------------------------------------


よろしくお願いします(/_;)

A 回答 (2件)

こんにちは。



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

直接のエラーの原因は、
Obj のinnerTextプロパティがないか、Objそのものが、オブジェクトではないものを拾得していたりするからだと思います。違うパソコンで動くというのは、そのPCでは、手動でその場所に出入りして、その場所を、クリックをしているからではないでしょうか。言い換えれば、Cookieや他の設定の内容に違いが出てたりする可能性があります。

>設定かセキュリティーか、何か、なのでしょうか?
そういえば、IEのままで、ループで鈍足でVBAを回していると、途中で、セキュリティのメッセージが出てきますね。

そのままでしたら、

For Each Obj In objIE.document.getElementsByTagName("a")
On Error Resume Next
 strTxt = Obj.innterText
On Error Goto 0
If strTxt <>"" Then
 If Worksheets("Sheet1").Range("A2") like "*" & strTxt & "*" Then '逆の方が収まりが良い
 Obj.Click
 End If
End If

としたら、ある程度の解決はするかもしれません。(確実とは限りません)

>Worksheets("Sheet1").Range("A2")
>が参照されていないような感じです。
に関しては、
むしろ、Obj.innerText が、とれているかどうかでしょうね。
一端、ブレークポイントを設けて、ローカルウィンドウで、エラーが出た場合に、Objの中身を見たほうがよいかもしれませんね。(If Err()<>0 Then Stop)

'----------------------
それは別として、せっかく、getelements 方式なのに、Tagの"<a ~>"では、数が多すぎますね。どんなものを拾っているのか、エラー処理もしないままに、そのまま拾うのには無理があります。

以下は、必ずしも解決に導くものではありませんし、そのサイトの情報も分かりませんので、例を上げながら、一般的な技法をご紹介します。

http://oshiete.goo.ne.jp/qa/8991808.html
例えば、このご質問のサイトのボタン

   [(A)回答する]

は、getElementsByTagName("a")でヒットしますが、このサイトで、tagの"a"は、236個

それを、class="a_btn" としますと、

getElementsByClassName("a_btn")
なら、class の"a_btn" は、1個しかありません。(他のサイトでは2個の場合もある)

探し方は、たぶん、InternetExplorerでしょうから、最近のバージョン(11)なら、開発者ツール(F12)のデバッグ・ツールがついていますので、予め、デバック・ツールを開いておいてから、

 ボタンの[文字以外の周辺場所]で右クリック、
 (文字にするとText部分にヒットしてしまいます)

 [要素の検査]
で、デバッグ・ツールの画面が出るはずですから、その直上に、Class のボタン(btn)があるはずです。
<div class="a_btn" abp="230">

このように、見つけたら、後は、
Set a_btn = getElementsByClassName("a_btn")
If a_btn.length >0 Then
  a_btn(0).Click ''添字はと0は限らない。添字は0から始まる
End If

と、絞ってヒットしてみたらどうでしょうか?成功率は、少しは上がるかもしれません。

もちろん、ご質問の情報だけでは、ボタンとも書いていませんし、Cookieの影響などもありますから、そのままで、真の解決はしないかもしれません。

なお、以下は、Win32 API関数のSleep の方が負担が少ないです。
>Application.Wait (Now + TimeValue("0:00:5"))

モジュール先頭に以下を置きます。
Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

そして、コマンドとしてこう書きます。
Sleep 1000 '(1/1000 ms)
    • good
    • 1

やりたいことがいまいち分かりませんが


For Each Obj In objIE.document.Forms(0).All
If Obj.innerText = Worksheets("Sheet1").Range("A2") .Value Then
Obj.Click
End If
Next

サイトによっては
If Obj.Title = Worksheets("Sheet1").Range("A2") .Value Then
かも?
    • good
    • 0
この回答へのお礼

ちがうPC では正常に動くのですが、違うPCで実行させたいのですが、エラーが出てきます;

For Each Obj In objIE.document.getElementsByTagName("a")

If Obj.innerText = Worksheets("Sheet1").Range("A2") Then
'アンカータグの表示内容が「」の場合に以下の処理を実施
Obj.Click
'上記に該当するタグをクリック
Exit For
'クリック後、処理を抜ける
End If
Next

'ページの表示完了を待ちます。
While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
DoEvents
Wend


の  


Worksheets("Sheet1").Range("A2")


が参照されていないような感じです。



設定かセキュリティーか、何か、なのでしょうか?


よろしくお願いいたします。

お礼日時:2015/06/01 11:20

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