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

■やりたいこと
画像のエラーがの原因と解決方法を知りたい。


■状況
画像の黄色で囲んだ部分でエラーが発生します。
このマクロ及びサイトのみではないですが、たまに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の一部


以上、ご存知の方ご教示いただければ幸いです。

「VBA IEの操作 ClassNameで」の質問画像

A 回答 (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

たぶん、いきなり、データを取るのは重すぎるのではないかと思うのですが、正しい理由はよく分かりません。
    • good
    • 1
この回答へのお礼

現場を離れてしまい、同じサイトで検証できていないのですが、感覚的にこの説はすんなり入りました。
次回発生時に試してみたいと思います。
ネット情報含め、初めて同じ状況の人と出会えて、よかったです。
ありがとうございました。

お礼日時:2019/05/09 09:38

> 常に発生するサイトと発生しないサイトとサイトごとで起こっています。



> ClassNameのみでエラーが起こる原因を知りたいです。

特定のサイトで発生しているのでしたら、そのサイトのURLを提示されては如何でしょうか。
あるいは再現するHTMLソースを提示するとか。。

回答する側も再現確認を行えて、原因究明をしやすくなると思いますよ。
    • good
    • 1
この回答へのお礼

あれから、現場をはなれてしまい、そこにアクセスできませんでした。
ご回答ありがとうございました。

お礼日時:2019/05/09 09:35

No2です。



>同じサイトであれば、どの要素のClassNameでもエラーになります。
再現性があるようなので、何らかの原因があるっぽいですね。

エラーが発生した際の、『document.getElementsByClassName("~~")』の戻り値はどうなっているのでしょうか?
No1にも書きましたが、length=0のNodeListオブジェクトになっている可能性が高いのではないかと想像しますけれど・・・
いずれにしろ、エラー発生時の変数の内容を調べてみることで、何が起こっているかを理解する手助けになるものと思います。

私はVBAからDOMを参照をすることはほとんどありませんが、javascriptで同様のgetElementsByClassNameメソッドを用いても、ご質問のような現象にあったことは一度もありません。
ですので、getElementsByTagNameとgetElementsByClassNameで要素の指定方法の違い以外に差異があるとは感じられないです。
(内部処理的には差があるのかも知れませんが、それはエンジンの都合なので、言語とは関係はないと考えます)
    • good
    • 0
この回答へのお礼

あれから現場を離れてしまい、確認できませんでした。
次回発生したときの参考にさせていただきます。
ありがとうございました。

お礼日時:2019/05/09 09:36

こんにちは



ご提示の内容が一センテンスだけなので、推測するしかないですが・・・

いくつか試してみましたけれど、ご提示の内容のエラーを発生させることができませんでした。
・サイト表示前に処理を実行した場合(documentが取得できない)
 Documentメソッドは失敗しました
 のエラーになります。

・objIEが取得できていなかったり、DOM要素が取得できない(存在しない)場合などは
 オブジェクト変数またはWithブロック変数が設定されていません
 のエラーとなるようです。

・innerTextを持たないDOM要素(INPUTやIMGなど)を対象に実行した場合
 特にエラーは発生せず、長さ0の文字列として処理されるようです。

ご提示の文から想像するエラーになりそうな内容は、上記程度だと思うのですが・・・
いずれにしろ、エラーの内容は「オブジェクトはあるけれど、指定のメソッド等は有していないよ」という意味なので、取得できているとしても(あるいは取れていない)予定とは異なる内容になっているのだと推測されます。
エラー発生時に、VBAエディタのウォッチ式でそれぞれのオブジェクトを調べれてみれば、どこが予定と違うかはすぐにわかるはずですので、そこで確認なされば一発で原因がわかるものと想像します。

DOM要素が取得できていない可能性が高そうな気はしますが、エラー表示が異なるのでよくわかりません。
この場合の対処には、事前にNodeListのlength属性をチェックすることで、0なら対象要素が存在しないことを判定できます。
今回のご質問では実際の原因は別かも知れませんが、上記のチェックも行っておいた方が良さそうに思います。


蛇足ながら、最近のブラウザならquerySelectorやquerySelectorAllが利用できると思いますので、NodeList(0)を取得したいのなら、querySelectorで直接参照することが可能です。
セレクタ指定が可能ですので、単体クラス名だけのgetElementsByClassNameよりも複雑な要素の指定でも比較的容易に可能になるでしょう。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ClassNameのみでエラーが起こる原因を知りたいです。
ID, Name, TagNameなどはエラーになりません。

.Lengthなどいろいろなプロパティやメソッドで、ClassNameオブジェクトを使用していますが、ClassNameオブジェクトを含む記述でこのエラーが発生します。
同じサイトであれば、どの要素のClassNameでもエラーになります。同じ要素のID等であればエラーが発生しません。
この現象は過去数サイトで発生しており、ほとんどはこのエラーは発生しません。毎回別アプローチで工夫していますが、すっきりさせたいので今回質問させていただきました。

蛇足ながら~の部分については詳しくありませんので、勉強したいと思います。

お礼日時:2019/04/24 11:02

ページ情報をすべて読み込み終わる前に走行しているだけでは。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ClassNameのみそれが理由でエラーになるでしょうか。
ID, Name, TagNameなどはエラーになりません。
常に発生するサイトと発生しないサイトとサイトごとで起こっています。
普通は発生しないが圧倒的に多く、今まで5サイト未満で発生しています。

お礼日時:2019/04/24 10:56

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


このQ&Aを見た人がよく見るQ&A