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

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

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

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

VBA

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2400閲覧

VBAのDOM操作でinnerHTMLが取得できないWEBシステムがあるのを解決したい。

k.hojo

総合スコア0

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

VBA

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/10/10 23:52

編集2021/10/11 06:31

VBAのDOM操作でinnerHTMLが取得できないWEBシステムがあるのを解決したい。

ExcelVBAで起動中のWebシステムのHTMLを取得してテキストファイルに書き出すということをやっています。
以下のコードでうまく動いていて実績もあるのですが、ある特定のシステムで、下記の「doc.all(0).innerHTML」で取得した文字列が空になってしまいます。
もちろんWebシステムの画面には色々とレンダリングされているので、HTMLが空なはずはないと思っています。
可能性として何が考えられるか、および、どのような調査を進めるべきかについて、ご教授いただきたいです。

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

警告やエラーは出ません。
(「doc.all(0).innerHTML」の結果が空になるだけです。)

該当のソースコード

ExcelのVBA

1Sub HTML取得() 2 Dim ie 3 Set ie = Nothing 4 Dim obj 5 For Each obj In CreateObject("Shell.Application").Windows 6 If obj.readyState = 4 Then 7 If TypeName(obj.Document) = "HTMLDocument" Then 8 Call outputHtml(obj.Document, obj.LocationName) 9 End If 10 End If 11 Next 12 Set ie = Nothing 13 MsgBox "完了。" 14End Sub 15 16Function outputHtml(doc, lname) 17 Open ThisWorkbook.Path & "\" & lname & ".html" For Output As #1 18 Print #1, doc.all(0).innerHTML 19 Close #1 20 For Each frametag In doc.getElementsByTagName("Frame") 21 Dim fc As FramesCollection 22 Set fc = doc.frames 23 Dim obj 24 Set obj = fc(frametag.Name) 25 Call outputHtml(obj.Document, lname & "_" & frametag.Name) 26 Next 27End Function

試したこと

・上記「obj.LocationName」は正しく取得できているので、対象のウインドウを誤っているということはなさそうです。
・リッチクライアントなど、HTML以外の技術を使っているのかとも思いましたが、市販のRPAソフトを使うと正しくWebシステムモードになって、DOMを認識しての記録と実行ができるので、リッチクライアントというわけでも無さそうです。
・VBAのデバッグでウォッチ式を使ってDOMの構造を見ようとしましたが、いまいち見方が分からず、HTMLの要素までたどり着けませんでした。

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

・対象のWEBアプリは、仕事で使っている業務アプリなので、一般的に公開されているものではありません。導入業者から、RPAソフトによる自動操作は自己責任でやってもらっていいと許可を得ているので、DOM操作が規約違反になるなどの問題がないことは確認済みです。
・環境はExcel2016、IE11です。

補足情報(2021/10/11 13:29 追記)

とりあえずの解決策はわかりました。
doc.all(0).innerHTMLではなく、
doc.all(1).innerHTMLにすれば、取得できました。
システムによって、「0」だったり「1」だったりするようですが、
https://developer.mozilla.org/ja/docs/Web/API/Document/all
には、「非推奨 HTML5」とあるので、それも関係しているのかもしれません。
all(0)で見つからなければ、all(1)を見にいけば、どちらのシステムでも対応できそうですが、どうもすっきりしない部分も残ります。
・「0」と「1」のシステムで何が違うのか?(システム側でHTML生成の何か作り方が異なっている?)
・「all()」が非推奨だとすると何を使うのがよいのか?
・システムごとの「0」か「1」を意識しなくてもOKや、きれいなコーディングはあるのか?
もし、詳しい方がいましたら、教えてもらえると助かります。

解決情報(2021/10/11 15:29 追記)

以下を使うことでうまくいきました。どうもありがとうございました。
https://developer.mozilla.org/ja/docs/Web/API/Document/documentElement

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

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

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

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

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

coco_bauer

2021/10/10 23:58

「ある特定のシステム」から取得した、質問の問題が起きるHTMLの内容を質問に追加すれば、回答が得られるかもしれません。 どこか知らないところから取得した、内容の判らないHTMLについて質問しても、回答できる人が居るとは思えません。
k.hojo

2021/10/11 00:16

HTMLを出したいですが、うまく取得することができません。 質問に記載した通りですが、作成したプログラムだと、「doc.all(0).innerHTML」が空になるので、ほかの方法でHTMLを取得しようとしましたが、以下の状況のためうまくいきません。 ブラウザの右クリックは禁止、IEのメニューは非表示の制御がされており、ブラウザの開発者モードを立ち上げようとしても、ショートカットキーも無効化されていて起動することができません。
k.hojo

2021/10/11 06:28

documentElement でいけました!どうもありがとうございました。すっきりしました。
k.hojo

2021/10/11 06:41

ベストアンサーをつけたかったのですが、やり方がよくわかりませんでした。 とりあえず、クローズはしたほうがよいと思ったので、自己解決の欄に記入してクローズさせていただきます。
Lhankor_Mhy

2021/10/11 06:42

ご解決されて何よりです。 お手数ですが、自己解決の処理をお願いします。
Lhankor_Mhy

2021/10/11 06:43

コメント行き違いました。ご対応ありがとうございます。
guest

回答1

0

自己解決

以下を使うことでうまくいきました。どうもありがとうございました。
https://developer.mozilla.org/ja/docs/Web/API/Document/documentElement

投稿2021/10/11 06:41

k.hojo

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問