🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

8684閲覧

VBAでIEを操作したい。getElementByIdでIdは合ってるはずが操作できない。

OugaiMori

総合スコア7

VBA

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/12/22 06:28

編集2019/12/22 06:29

前提・実現したいこと

VBA初心者で、いろいろ試してはいるのですが、
なかなか上手くいかず、苦戦しています。

所々、気になる部分もあるかと思いますが、
知恵を貸してくださると幸いです。

実現したいことは「VBAでIEを操作する」です。
①ログインを行う
②シートの文字列を検索し、実行
③検索結果をExcelに記入
④繰り返す
といった感じです。

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

ログインまでは問題なく動いていますが、
検索の過程でつまずいているのが現状です。

その為、まずは検索できることを目標としたいです。

実行時エラー オートメーションエラーです。 エラーを特定できません。

該当のソースコード

VBA

1Sub IE操作() 2 3'定数の定義 4Const URL = "URL" 5Const FIRST_ROW_NUM = 2 6 7 'IEオブジェクト生成 8 Dim objIE As InternetExplorer 9 Set objIE = New InternetExplorer 10 11 'IEを表示 12 objIE.Visible = True 13 objIE.navigate URL 14 15 'IE待機 16 Call waitIE(objIE) 17 18 'HTMLオブジェクト生成 19 Dim htmlDoc As HTMLDocument 20 Set htmlDoc = objIE.document 21 22 'ログイン処理 23 With htmlDoc 24 25 'IDとPassを入力 26 .getElementById("username").Value = "ID" 27 .getElementById("password").Value = "Pass" 28 29 'ログインボタンはIDを持たないため、クラスから指定する 30 For Each Button In objIE.document.getElementsByClassName("button") 31 If Button.Value = "ログイン" Then 32 Button.Click 33 Exit For 34 End If 35 Next 36 End With 37 38 '待機 39 Call waitIE(objIE) 40 41 Set objIE = Nothing 42 Set objIE = CreateObject("internetexplorer.application") 43 44 'HTMLオブジェクト破棄 45 Set htmlDoc = Nothing 46 47 '新しく表示されたページのHTMLオブジェクト取得 48 Set htmlDoc = objIE.document 49 50 '待機 51 Call waitIE(objIE) 52 53 Dim condition As Boolean 54 condition = True 55 Dim i As Integer 56 i = FIRST_ROW_NUM 57 58 Do While condition 59 60 '文字列をExcelから取得 61 Dim src 62 src = Cells(i, 1) 63 64 '検索実行 65 With htmlDoc 66 Dim ser As IHTMLInputTextElement 67 Set ser = htmlDoc.getElementById("SearchInput")(0) 68 ser.Value = src 69 .getElementById("SearchButton").Click 70 End With 71 72 'IE待機 73 Call waitIE(objIE) 74 75 '結果を取得 76 77 '完了をセルに記載する 78 79 Loop 80 81 'IEを閉じる 82 objIE.Quit 83 Set objIE = Nothing 84 85End Sub 86 87Function waitIE(ByRef objIE As Object) 88 89 Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE 90 DoEvents 91 Loop 92 93End Function

試したこと

With htmlDoc .getElementById("SearchInput").Value = "Test" .getElementById("SearchButton").Click End With

当初は、検索を実行させる際、こちらのコードで実行させました。
しかし、IDは合ってるはずなのですが、なぜか入力されません。
この時のエラーメッセージは

オブジェクト変数またはWithブロック変数が指定されていません。

となっていました。

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

Imacorossを使ってIDを調べてみました。

TAG POS=1 TYPE=INPUT:TEXT FORM=ID:SearchForm ATTR=ID:SearchInput CONTENT=Test TAG POS=1 TYPE=INPUT:BUTTON FORM=ID:SearchForm ATTR=ID:SearchButton

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

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

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

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

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

guest

回答2

0

ベストアンサー

下記の3行が不要では。

vba

12 3 '待機 4 Call waitIE(objIE) 5 6 Set objIE = Nothing '←不要 7 Set objIE = CreateObject("internetexplorer.application") '←不要 8 9 'HTMLオブジェクト破棄 10 Set htmlDoc = Nothing '←不要 11 12

ログイン後に'waitIE'で読み込み完了したIEを破棄して、新規に空のIEを開くことになりますので、何も取得できません。


あと、検索実行の部分のコードを下記のように修正してみてください。

vba

1 '検索実行 2 With htmlDoc 3 Dim ser As HTMLInputElement 4 Do 5 Set ser = htmlDoc.getElementById("SearchInput") 6 DoEvents 7 Loop While ser Is Nothing 8 ser.Value = src 9 .getElementById("SearchButton").Click 10 End With

投稿2019/12/22 06:57

編集2019/12/23 10:49
hatena19

総合スコア34073

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

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

OugaiMori

2019/12/22 09:05 編集

ご回答ありがとうございます。 この場合、ログイン後のページのIEを取得する処理が 必要になると言うことでよろしいでしょうか? ```VBA 略 Call WaitIE(objIE) Set objIE = Nothing '新しく取得する処理を追加 . . 略 ```
hatena19

2019/12/22 09:14

'←不要 とコメントをつけたコードを削除すればいいということです。 実際に手動で操作するときのことを考えてください。 IDとパスを入力してログインボタンをクリックした後に、IEを閉じますか。閉じませんよね。 ページ遷移するのをそのまま待ちますよね。 Set objIE = Nothing はIEを閉じるのと同じことです。
OugaiMori

2019/12/22 09:33

返答ありがとうございます。 仰る通り、確かに、閉じません。 新しいページに移動し、改めて取得することで、 動作できると考えていたのですが、考えを改めます。 不要となったコードを消去した結果ですが、 ”オブジェクト変数またはWithブロック変数が指定されていません。” となってしまっています。 長々と申し訳ないですが、この点についてはいかがでしょうか。
hatena19

2019/12/22 22:57

どの行でそのエラーが出ますか。
OugaiMori

2019/12/24 02:00

ご返答が遅れてしまい、申し訳ございません。 エラーが出る行は With htmlDoc Dim ser As IHTMLInputTextElement Set ser = htmlDoc.getElementById("SearchInput")(0) ser.Value = src .getElementById("SearchButton").Click End With です。この場合、エラーメッセージは”オブジェクト変数またはWithブロックが設定されていません。” となります。ただ、少し内容を変更して With htmlDoc .getElementsByTagName("INPUT")(0).Value = "Test" としたところ、実行時エラー'70' ”書き込みできません。” となる場合があり、調べているところです。
hatena19

2019/12/24 02:39

htmlDoc.getElementById("SearchInput")(0) という記述は間違いです。 htmlDoc.getElementById("SearchInput") が正解です。 htmlDoc.getElementById と getElementsByTagName でElementが単数形と複数形の違いに留意してください。 .getElementsByTagName("INPUT")(0)が書き込みできないというのは、それが目的にテキストボックスでないと思われます。最初のINPUTタグの要素という意味になりますので。
OugaiMori

2019/12/24 07:49

ご返答ありがとうございます。 テキストボックスではない要素には入力できないため、エラーとなるということですね。 その場合、どのようにして対処すれば良いのでしょうか? 確かに検索ボックスなのに、書き込みができない理由とはどの様な理由があるのでしょうか?
hatena19

2019/12/24 08:00 編集

htmlDoc.getElementById("SearchInput") で検索ボックスは取得できないですか。IDがあっているなら取得できるはずです。 もし、取得できないなら、動的なサイトで検索ボックスが生成されるのに時間がかかっているのかも知れませんので、私の回答の2番目のコードで取得できるまで繰り返してください。
OugaiMori

2019/12/25 01:13

ご返答ありがとうございます。 仰った通り、生成されていないのに、取得していた様です。 ただし、”書き込みできません。”のエラーメッセージが出ました。 その為、 ser.Value = src → ser.Value = "TEST" としたところ、問題なく実行できました。 調べている最中ですが、アクセス許可の問題があるのではと考えています。
guest

0

'IE11であれば、ブラウザ待機処理に以下を使用してみてください。

VBA

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

投稿2019/12/22 10:25

TanakaHiroaki

総合スコア1063

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

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

OugaiMori

2019/12/22 11:23

ご回答ありがとうございます。 環境を追記しておらず、申し訳ございませんでした。 試してみましたが、こちらの方法でも解決しませんでした。 ですが、IE11での動作の場合、こういった処理が必要になるというのは 知らなかったので、参考になりました。 追記にはなりますが、 Set ser = htmlDoc.getElementById("SearchInput")(0) の部分を with htmlDoc .getElementsByTagName("INPUT") といった形に変更したところ、エラーメッセージは 実行時エラー'70' ”書き込みできません。” になっていました。何故こうなったか少し考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問