質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

3168閲覧

vbaの実行エラー91の解決について セルからの転記がうまくできません

anmethod

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/07/29 08:46

編集2019/07/29 11:52

前提・実現したいこと

vbaで指定URLにアクセスし、指定の入力エリアにセルの内容を転記して検索ボタンを押すようにしています。
同条件で何度も試行しているのですが、以下のエラーメッセージが出たり、うまくいったりと一定の結果になりません。
転記するセルの内容はいじってません。また、数式が入ったものでもありません。
仕事で使っているwebサイトおよびエクセルなのでシート名やURLは伏せています。

発生している問題・エラーメッセージ

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

Dim objIE As InternetExplorer
Dim ieDoc As HTMLDocument
Dim obj As Object
Dim inputText As Object
Dim textButton As Object

Sub IE_Serch()

'Internet Exploreを立ち上げ
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

'URLを指定
objIE.Navigate2 "URL"

'Webサイトの表示待ち
While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
DoEvents
Wend

'HTML型ドキュメントに収録
Set ieDoc = objIE.document

'ボタンを探して押す
For Each obj In ieDoc.getElementsByTagName("a")
If obj.innerText = "ボタン1" Then
obj.Click
Exit For
End If
Next

'Webサイトの表示待ち
While (objIE.Busy = True Or objIE.readyState <> 4)
DoEvents
Wend

'指定入力エリアを探して指定セルの内容を転記
For Each obj In ieDoc.getElementsByTagName("input")
If obj.name = "name" Then
obj.Value = Sheets("sheet1").Range("A6")
End If
Next

'検索ボタンをクリック
Set textButton = ieDoc.getElementsByTagName("button")(1)
textButton.Click

'オブジェクト参照を解除
Set objIE = Nothing
Set ieDoc = Nothing
Set obj = Nothing
Set inputText = Nothing
Set textButton = Nothing

End Sub

vba

試したこと

textButton.Clickで毎度引っかかり、冒頭のエラーが発生しますが、全く同条件で再度動かすと問題なく動いたり、さらにもう一度動かすとまたエラーが出たりします。

初心者ですのでいくつかサイトを参考に作成しましたが、このエラーに対する有効な解決法を見つけられずに詰んでおります。
どうか識者の方々のお知恵を借りられればと思います。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/07/29 11:20

「ieDoc」と「objIE.document」とがコードの中で混在していますが、これは正しいコードですか?
anmethod

2019/07/29 11:50

混在気が付いておりませんでした。 ご指摘ありがとうございます。 修正して実行しましたが状況は同じです。
guest

回答1

0

ベストアンサー

Webサイトの表示待ち(IEブラウザ待機処理)で条件成立の複数回連続確認を試してみてください。
IE11に対して有効な方法です。

VBA

1'IEブラウザ待機処理 2Private Sub IEwait(ByRef ie As InternetExplorer) 3 Dim timeout As Date 4 Dim cnt As Integer: cnt = 0 5 6 timeout = DateAdd("s", 50, Now()) 7 Do 8 'IE11対策でステータス連続50回一致確認 9 If ie.Busy = False And ie.readyState = 4 Then 'READYSTATE_COMPLETE = 4 10 DoEvents: DoEvents 11 cnt = cnt + 1 12 If cnt >= 50 Then 13 Exit Do 14 End If 15 Else 16 cnt = 0 'リセット 17 End If 18 'タイムアウトチェック 19 If timeout < Now() Then Exit Sub 20 DoEvents: DoEvents 21 Loop 22 23 timeout = DateAdd("s", 10, Now()) 24 Do While ie.Document.readyState <> "complete" 25 DoEvents: DoEvents 26 'タイムアウトチェック 27 If timeout < Now() Then Exit Do 28 Loop 29End Sub

投稿2019/07/29 11:43

TanakaHiroaki

総合スコア1063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anmethod

2019/07/29 11:51

素早いご回答ありがとうございます。 初心者なものでご回答いただいたものを理解して実行するのに少々お時間いただくと思いますが、また結果を報告させていただきます。
TanakaHiroaki

2019/07/29 11:55

以下のようにして呼び出します。 'Webサイトの表示待ち Call IEwait(objIE) 'While (objIE.Busy = True Or objIE.readyState <> 4) ' DoEvents 'Wend
anmethod

2019/07/30 00:34

ご丁寧にありがとうございます。 上記の通り実行しましたところ、実行エラーは出なくなりました。 待機が十分でなかったためにsetがうまく動かず、結果エラー91が出ていたということになるのでしょうね。 勉強不足で原因がわからず右往左往しておりました。 大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問