■やりたいこと
画像のエラーがの原因と解決方法を知りたい。
■状況
画像の黄色で囲んだ部分でエラーが発生します。
このマクロ及びサイトのみではないですが、たまにClassNameでの取得が無効(今回のようなエラー)になるケースがあります。
サイトごとで制限または何らかの違いがあるのでしょうか?
普段はClassNameでオブジェクト取得ができることの方が多いです。
同じサイト、同じブックで、Name、ID、TagName等での取得は可能です。
ClassNameのみたまにこの現象が発生します。
工夫したら別の方法で取得は可能なのですが、すっきり書きたいので、なんとかClassNameで取得したいのですが、解決方法はあるでしょうか?
■動作環境
OS 名:Microsoft Windows 10 Pro
OS バージョン:10.0.16299 N/A ビルド 16299
OS 製造元:Microsoft Corporation
プロセッサ:Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2400 Mhz
BIOS バージョン:TOSHIBA Version 2.20 , 2012/06/22
物理メモリの合計:3,988 MB
Excel バージョン:14.0.7192.5000(32ビット) Microsoft Office Standard 2010の一部
以上、ご存知の方ご教示いただければ幸いです。
No.5ベストアンサー
- 回答日時:
こんにちは。
割り込ませていただきます。
私自身、最近、偶然に同様のエラーに出会いました。もちろん、コードは、怠らないで、If .length =0 で弾くのは言うまでもないのですが、
>objIE.document.getElementsByClassName("Calendar")(0).innerText
取れるはずなのに、なぜか、エラーになるのです。
そこで、私が行ったことは、例えば、
Set Clndrs =objIE.document.getElementsByClassName("Calendar")
で、一旦、オブジェクトとして確保するのです。
そうすると、コードが通るのです。
そして、
For i=0 To Clndrs.Length
Cells(i + 1,1).Value = Clndrs(i).innerText
Next
たぶん、いきなり、データを取るのは重すぎるのではないかと思うのですが、正しい理由はよく分かりません。
現場を離れてしまい、同じサイトで検証できていないのですが、感覚的にこの説はすんなり入りました。
次回発生時に試してみたいと思います。
ネット情報含め、初めて同じ状況の人と出会えて、よかったです。
ありがとうございました。
No.3
- 回答日時:
No2です。
>同じサイトであれば、どの要素のClassNameでもエラーになります。
再現性があるようなので、何らかの原因があるっぽいですね。
エラーが発生した際の、『document.getElementsByClassName("~~")』の戻り値はどうなっているのでしょうか?
No1にも書きましたが、length=0のNodeListオブジェクトになっている可能性が高いのではないかと想像しますけれど・・・
いずれにしろ、エラー発生時の変数の内容を調べてみることで、何が起こっているかを理解する手助けになるものと思います。
私はVBAからDOMを参照をすることはほとんどありませんが、javascriptで同様のgetElementsByClassNameメソッドを用いても、ご質問のような現象にあったことは一度もありません。
ですので、getElementsByTagNameとgetElementsByClassNameで要素の指定方法の違い以外に差異があるとは感じられないです。
(内部処理的には差があるのかも知れませんが、それはエンジンの都合なので、言語とは関係はないと考えます)
No.2
- 回答日時:
こんにちは
ご提示の内容が一センテンスだけなので、推測するしかないですが・・・
いくつか試してみましたけれど、ご提示の内容のエラーを発生させることができませんでした。
・サイト表示前に処理を実行した場合(documentが取得できない)
Documentメソッドは失敗しました
のエラーになります。
・objIEが取得できていなかったり、DOM要素が取得できない(存在しない)場合などは
オブジェクト変数またはWithブロック変数が設定されていません
のエラーとなるようです。
・innerTextを持たないDOM要素(INPUTやIMGなど)を対象に実行した場合
特にエラーは発生せず、長さ0の文字列として処理されるようです。
ご提示の文から想像するエラーになりそうな内容は、上記程度だと思うのですが・・・
いずれにしろ、エラーの内容は「オブジェクトはあるけれど、指定のメソッド等は有していないよ」という意味なので、取得できているとしても(あるいは取れていない)予定とは異なる内容になっているのだと推測されます。
エラー発生時に、VBAエディタのウォッチ式でそれぞれのオブジェクトを調べれてみれば、どこが予定と違うかはすぐにわかるはずですので、そこで確認なされば一発で原因がわかるものと想像します。
DOM要素が取得できていない可能性が高そうな気はしますが、エラー表示が異なるのでよくわかりません。
この場合の対処には、事前にNodeListのlength属性をチェックすることで、0なら対象要素が存在しないことを判定できます。
今回のご質問では実際の原因は別かも知れませんが、上記のチェックも行っておいた方が良さそうに思います。
蛇足ながら、最近のブラウザならquerySelectorやquerySelectorAllが利用できると思いますので、NodeList(0)を取得したいのなら、querySelectorで直接参照することが可能です。
セレクタ指定が可能ですので、単体クラス名だけのgetElementsByClassNameよりも複雑な要素の指定でも比較的容易に可能になるでしょう。
ご回答ありがとうございます。
ClassNameのみでエラーが起こる原因を知りたいです。
ID, Name, TagNameなどはエラーになりません。
.Lengthなどいろいろなプロパティやメソッドで、ClassNameオブジェクトを使用していますが、ClassNameオブジェクトを含む記述でこのエラーが発生します。
同じサイトであれば、どの要素のClassNameでもエラーになります。同じ要素のID等であればエラーが発生しません。
この現象は過去数サイトで発生しており、ほとんどはこのエラーは発生しません。毎回別アプローチで工夫していますが、すっきりさせたいので今回質問させていただきました。
蛇足ながら~の部分については詳しくありませんので、勉強したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Outlook(アウトルック) outlookの送信エラーについて 1 2022/05/13 12:04
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- Excel(エクセル) マクロの付いたExcelが開けません 3 2023/02/01 10:54
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Excel(エクセル) Excel起動時にエラーダイアログが表示される 3 2022/07/28 19:52
- Visual Basic(VBA) エクセルVBA 3 2022/06/23 20:00
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
ADODB.Streamを使用してUTF-8を...
-
vbaのvlookup関数エラー原因を...
-
マクロについて教えてください...
-
VBS実行時エラー オブジェクト...
-
プロシージャ名の取得
-
OLEDB.NETで接続できない
-
なぜこんな初歩的なVBAのIf文で...
-
VBSで変数の宣言はできないので...
-
実行時エラー48発生時のDLL特定...
-
excel vbaでvlooupの変数がわか...
-
Excelで下記のようにマクロを作...
-
Invalid procedure call or arg...
-
「コンパイルエラー:プロシー...
-
エクセルVBA autofilterでエラー
-
ExcelVBA Range クラスの Page...
-
エラー1004 PDFの保存ができま...
-
VBAマクロ excel2008では使える...
-
エクセルVBA、フリーフォームで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
なぜこんな初歩的なVBAのIf文で...
-
VBAでのエラー
-
マクロについて教えてください...
-
ExcelVBA Range クラスの Page...
-
実行時エラー3001「引数が間違...
-
VBS実行時エラー オブジェクト...
-
VBAがブレークモードになっ...
-
OLEDB.NETで接続できない
-
プロシージャ名の取得
-
EXCEL VBAマクロ中断でデバッグ...
-
VBSで変数の宣言はできないので...
-
ADODB.Streamを使用してUTF-8を...
-
実行時エラー -'-2147417848
-
AccessVBAでExcelを起動し、罫...
-
VB6+SQL サーバー 2000 で 実行...
-
Outlook.ApplicationをCreateOb...
-
Application.ActiveInspectorで...
おすすめ情報