
エクセル 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件)
- 最新から表示
- 回答順に表示
No.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)
No.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
かも?
ちがう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")
が参照されていないような感じです。
設定かセキュリティーか、何か、なのでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでfunctionを利用しようとし...
-
お助けください!VBAのファイル...
-
UserForm1.Showでエラーになり...
-
VBA データ(特定値)のある最...
-
String""から型'Double'への変...
-
「実行時エラー '3167' レコー...
-
【VBA】ワークブックを開く時に...
-
フランスの生年月日(jj/mm/aaaa)
-
マクロOn Error GoTo ErrLabel...
-
SQLでエラーです。
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
マクロで"#N/A"のエラー行を削...
-
ActiveCell.FormulaR1C1の変数
-
VBA Find でオートメーションエ...
-
ACCESSで値を代入できないとは?
-
VBAコード実行を中止する方法は...
-
Selenium のエラーがでます。
-
VBAで、Excelの選択範囲をWeb形...
-
CStringについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
マクロで"#N/A"のエラー行を削...
-
文字列内で括弧を使うには
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー'-2147467259(8000...
-
実行時エラー 438 の解決策をお...
おすすめ情報