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

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

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

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

Q&A

解決済

2回答

1614閲覧

VBA TypeName()関数実行でエラーになる原因は何でしょうか?

ABBA

総合スコア4

VBA

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

0グッド

1クリップ

投稿2023/01/05 14:09

Excel VBA である通販サイトの価格を知るためVBAでIEを起動し通販ホームページ
から商品番号を入力⇒目的の商品サイト参照までを自動で行うVBAで作っています。
(会社でいつもの商品を発注するとき手入力で商品番号を入力し商品サイトの価格確認作業が面倒な為です)
(商品の価格が頻繁に変動するので必ず価格の確認が必要になります)
商品が複数あると次々にIEが立ち上がるので次の商品サイトを立ち上げたら
一つ前のIEは終了させたいので次のようなコードを書いています。
ある日よりエラーが出るようになりました。
(Document'メソッドは失敗しました 'IWebBrowser2)
すべて、エラー箇所はTypeName()関数実行時です。
マイクロソフトIE終了宣言と何か関係があるのでしょうか?
ご教授のほど宜しくお願いします。
IE_Close1()関数はIsExecutingIE()関数を使って起動中かどうかの判断しています。

Function IE_Close1()
省略
If TypeName(objWin) = "IWebBrowser2" Then ←ここでエラー
'('Document'メソッドは失敗しました 'IWebBrowser2と出ます)
省略
End Function

Function IsExecutingIE() As Boolean
省略
aa = TypeName(objWindow.document) 'test ←ここでエラー
'('Document'メソッドは失敗しました 'IWebBrowser2と出ます)
省略
End Function

// 実際のコードです。
'******************************************************
'IEが起動していたらIE閉じる (IE起動確認条件付)
'******************************************************
Function IE_Close1()

Dim objShell As Object Dim objWin As Object Set objShell = CreateObject("Shell.Application") If IsExecutingIE() Then 'IE起動中 '// IE閉じる For Each objWin In objShell.Windows If TypeName(objWin) = "IWebBrowser2" Then 'IE起動中の場合はIE終了 Set objIE = objWin objIE.Quit 'IE終了 End If Next End If

End Function

'******************************************************
'IE起動中のチェック
'******************************************************

Function IsExecutingIE() As Boolean

Dim objShell As Object Dim objWindow As Object Dim aa As String 'test Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows aa = TypeName(objWindow.document) 'test If TypeName(objWindow.document) = "HTMLDocument" Then 'IE起動中かどうかの判定 IsExecutingIE = True Exit For End If Next

End Function

試したこと

1.テストプログラムで直接IsExecutingIE()をCallしましたがやはり同じエラーになります。
2.文字変数aaを追加したのですがTypeName()が結果を吐き出していないようです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラー処理を入れて回避する方法です。

VBA

1On Error Resume Next 2If TypeName(objWindow.document) <> "HTMLDocument" Then 'IE起動中かどうかの判定 3 'IEでない場合とエラー時は処理なし 4Else 5 On Error GoTo 0 'エラー処理を通常に戻す 6 '以下に実行したい処理を書く 7 IsExecutingIE = True 8 Exit For 9End If 10On Error GoTo 0 'エラー処理を通常に戻す

投稿2023/01/07 08:42

編集2023/01/07 08:44
TanakaHiroaki

総合スコア1065

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

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

ABBA

2023/01/08 07:49

TanakaHiroaki様 ご指導ありがとうございます。 教えて頂いたとおりのコードで修正しましたらエラーは出なくなりました。 やはり1回目のループでTypeName(objWindow.document)がエラーとなっており On Error Resume Nextで回避。 2回目のループで"HTMLDocument"の戻り値を確認できました。 本当にありがとうございました。 '****************************************************** '起動中のIEチェック '****************************************************** Function IsExecutingIE() As Boolean Dim objShell As Object Dim objWindow As Object Dim aa As String 'test Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows On Error Resume Next aa = TypeName(objWindow.document) If TypeName(objWindow.document) <> "HTMLDocument" Then Else '起動中 IsExecutingIE = True On Error GoTo 0 Exit Function End If On Error GoTo 0 'エラー解除後再トライ Next
guest

0

エラーが出たときのブラウザの状態はどうなっていますか?
sleepで待機を入れても変わらないようでしたら、On Errorステートメントでエラー処理を入れてみてはいかがでしょうか?

【VBA入門】Sleep関数(API)やWaitメソッドで処理を止める方法

投稿2023/01/06 04:47

fuku-chann

総合スコア82

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

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

ABBA

2023/01/08 07:53

fuku-chann さま ご指導ありがとうございます。 On Errorステートメント追加したら直りました。 このたびは助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問