アプリ版:「スタンプのみでお礼する」機能のリリースについて

EXCEL VBAでIEにアクセスするプログラムが特定のPCで実行エラーになりました。
インプレスジャパンの雑誌「Excel VBA でIEを思いのままに操作できるプログラム術」で公開している以下のプログラムも11行目「IE.document.getElementById("Text1").Value = "ABC"」のところで実行時エラー438となります。
Sub useForm()
Dim IE As InternetExplorer
Dim form As HTMLFormElement
Dim Doc As HTMLDocument
Dim strText As String
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate "http://book.impress.co.jp/appended/3384/4-11.html"
Do While IE.Busy Or IE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
IE.document.getElementById("Text1").Value = "ABC"  '←エラーとなる箇所
IE.document.getElementById("Select1").Value = "example.ne.jp"
Set form = IE.document.forms("Form1")
form.submit
IE.Quit
End Sub

11行目実行時点で、ローカルウィンドウでIEオブジェクトのdocumentプロパティの内容を参照すると、何もセットされていない(変数なし)状態なので、そのためエラーになっているものと思われます。
他のPCでは問題なく実行可能なので、EXCELの設定又はIEの設定の問題なのではないかと疑っていますが、EXCELは再インストールしましたが改善しませんでした。
プログラムが動作しないPCの環境はWindows10(64ビット)、EXCEL(office365の最新版)をインストールしています。
よろしくお願いいたします。

A 回答 (3件)

こんにちは、


form.submit とコードにあったので躊躇しましたが、、、

>他のPCでは問題なく実行可能なので、EXCELの設定又はIEの設定の問題なのではないかと疑っています
確かにnavigate先のソースには、<input id="Text1" name="Text1" type="text" value="">が存在しますので
通常、実行時エラー438が発生する可能性は低いと思います。
ソース量から考えても、Do While IE.Busy Or IE.readyState < READYSTATE_COMPLETE...で十分な気がします。

仮にLoopの後にStopを入れ、IEのソースを見た時に<input id="Text1" name="Text1" type="text" value="">が
無いと言う事ではないと思いますね

Officeの問題は、EXCELは再インストールしましたとのことなので外すとした場合。
特定PCの不具合と考えた場合、IEのバージョン、設定などかも知れませんが、他の要因として、バックグランドソフトの可能性もあります。
セキュリティ系や入力補助(支援)ツール(アドイン)など、、
原因を切り分けて検証しているとの事なので、セーフモードで起動(または、タスクで切っていくなど)して確認するなどしてみてはいかがでしょう。

的違いかもしれませんが、参考まで
    • good
    • 0
この回答へのお礼

お礼が遅くなり、申し訳ございませんでした。
特定の機種でマクロが動かいないことからすると、アドインは疑っています。
セーフモード等を試してみます。

お礼日時:2020/08/31 08:26

No1です



>問題のプログラムは1行ずつ実行し、問題の箇所の手前で十分時間を置いても、
>問題は解消しませんでした。
エラー時にウォッチウインドウを利用すると、IEオブジェクトのメンバーを確認することができると思います。
多分、documentエレメントは存在しないと思われますが、他にどこまでのオブジェクトが取れているかなどを確認してみることで、ヒントが得られるかも知れません。
    • good
    • 0
この回答へのお礼

何度も解決に向けたヒントをいただき、ありがとうございました。
他のオブジェクト等も調べたいと思います。

お礼日時:2020/08/31 08:25

こんにちは



ご提示のコード自体には問題がないように見受けられます。
>他のPCでは問題なく実行可能なので、~~
とのことですので、その環境特有の問題だと考えられます。

ですので、以下は役に立つかどうかまったくわからない内容になってしまいますが・・・

「実行時エラー438」はオブジェクトに存在しないプロパティやメソッドを使用しようとしたということですので、直接の原因は、オブジェクトが取得できていないということのように想像されます。

>11行目実行時点で、ローカルウィンドウでIEオブジェクトのdocumentプロパティの
>内容を参照すると、何もセットされていない(変数なし)状態~~
どのことですので、IE.documentが取得できていないので、(getElementByIdメソッドがないため)エラーになっているということでしょう。

ブラウザ上には目的のページが表示がされているものと推測しますので、試しにループを抜けたところで、stopあるいはmsgboxなどで、処理を一時停止して(=時間をおいて)から継続してもうまくいかないでしょうか?


かって、IE操作のコードで、表示後にdocumentどころかIEオブジェクトが無効になってしまう事態に遭遇したことがあります。
その時は、固有環境の問題ではなく、サーバ側で新たなウィンドウを立上げて元のIEオブジェクトは破棄してしまっているのが原因でしたが…
しかたがないので、VBSに切り替えて、IEへのハンドルを探すところから新たに始めました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ご指摘のとおり、ブラウザ上には目的の画面が表示されます。問題のプログラムは1行ずつ実行し、問題の箇所の手前で十分時間を置いても、問題は解消しませんでした。
本当の問題は、業務用の別のプログラムがあるのですが、原因を単純化する作業のなかで、提示させていただいたごく簡単なプログラムでも同様なエラーが発生するとのところまでたどり着いたわけです。
私も異なる観点から、調べてみたいと思います。

お礼日時:2020/08/27 13:47

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