ie-excel

エクセル・マクロでie操作

Excel VBAでieのフレームページを操作する

2018/11/12

一般サイトではほぼ見なくなったフレームページですが、企業が活用するシステムでは現役で活躍しているフレームページもまだまだあるようです。

ですので、今回はieに表示されたフレームページをVBAで操作することについてまとめてみます。

フレームページとは

フレームページとは、通常の画面は1つのhtmlで構成されますが、ページを上下や左右に分割して複数のページから構成されるページのことを言います。

と書いてもなかなかわかりにくいので、HTMLベースで記載すると以下の通りです

親ページ
親ページには子ページをどのよう配置するかを定義します。

子ページ1(01.html)
子ページ2(02.html)
子ページは普通のhtmlとなります。

上記例示では、左右に子ページを並べて表示
左側のページには「01.html」を表示し、右側のページには「02.html」を表示すると定義しています。

このように複数のページから1つのページを構成可能としているのがフレームページとなります。

フレームページのサンプルページ

 

子ページの数を調べる

子ページの数を調べるには、以下の通り

フレームの情報はDocumentの「frames」内に収録されてます。
「Length」は直訳すると「長さ」になりますが、ここでは「数」が収録されます。

このフレーム数を実際にメッセージボックスに子ページの数を表示させようとすると、以下のロジックをコピペしてサイトのURLを修正すれば表示されます。

なお、フレームページが複数のフレームページから構成(フレームページの中にさらにフレームページがあるようなケース)されていても、親から呼ばれる子ページの数しか表示されません。

 

子ページの要素を操作する

子ページは、Documentのframesにメンバーとして収録されています。

そのため子ページの要素を操作するには、それぞれのフレームページを特定する必要があります。

フレーム番号は「0」から始まりますので、子ページが2つあればフレーム番号は「0」と「1」になります。

以下はフレーム番号「0」のタイトルタグを表示する場合の記述です

フレームページ以外は「ieDoc」からタグを操作していましたが、フレームページの子ページを操作するのは「ieDoc.frames(フレーム番号).Document」を操作することとなります。
タグ名やClass、IDでタグを特定したい場合、「getElementsByTagName」などを使用すれば操作が可能となります。

 

Busyが一時的に解除される

通常であれば画面が遷移したことを待つのに、以下の通りシェル自体の「Busy」および「readyState」の状態それぞれを確認にします。

フレームページではないサイトの画面遷移待ち
ところが、フレームページの「Busy」と「ReadyState」は以下の通りとなります。

  • 「Busy」はシェルにしかない
  • シェルの「readyState」に加え、ドキュメントにもredayStateがり各ページ毎に返却
  • 親ページを読み込んだ時点で「Busy」が一時的に「False」になるが、子ページ読み込み始めると「True」になる

したがって、上記のロジックでは親ページの読み込みしか判定できないこと。そして、Busyが一時的に「False」となった時点を捉えてしまうと、子ページの読み込みが終了していないにも関わらず、画面遷移が終了したと判断されてしまいます。

実際にBusyとReadyStateの関係は調べると、あるサイトでは以下の通りとなりました。

時刻 Busy シェルのReadyState 親ページのReadyState 子ページ(1)のReadyState 子ページ(2)のReadyState
11:26:53 344 TRUE 3 interactive loading loading
11:26:53 423 TRUE 3 interactive interactive loading
11:26:53 438 FALSE 4 complete complete loading
11:26:53 484 TRUE 4 complete complete loading
11:26:53 500 TRUE 4 complete complete loading
11:26:53 516 TRUE 4 complete complete interactive
11:26:53 766 FALSE 4 complete complete complete
11:26:53 781 FALSE 4 complete complete complete

フレームページの場合の画面遷移待ち方法

フレームページでは、親ページの「Busy」そして親ページと全子ページの「ReadyState」の状態をすべて確認しなければならないため、あまりきれいではないものの以下のようなロジックであれば、親ページのみならず、子ページの画面がきちんと表示されていることも確認できます。

Busyは途中で解除されることがあるため、まずは子ページのReadyStateをすべて確認。子ページの表示が終了を確認
その上で、親ページの「Busy」と「ReadyState」を確認する方法がフレームページにおける画面遷移の待機方法となります。

フレームページの画面遷移待ち
 

フレームページの各要素を操作する

フレームページの各要素を操作、つまりボタンをクリックしたり、テキストを入力したり、ラジオボタンを選択するには、インストールされたExcelの状態では操作できません。

そのため、「Microsoft HTML Object Library」を使用することが必要となります。

「Microsoft HTML Object Library」を使用するためには、以下を実施ください

  1. ExcelでVBA(コードの表示)を開く
  2. デザインウィンドウの「ツール」→「参照設定」メニューから、[Microsoft HTML Object Library]にチェックをつける

これを実施することで、「FramesCollection」が利用可能となります。

フレームのBodyタグ内のHTMLソースを取得するソース
 

-ExcelでIE操作