FC2ブログ

EXCELのVBAでIEをコントロール(序章)

すでにおおむね出来上がっていたのですが
ポップアップウインドウ、ダイヤログウインドウの処理がうまくいかなくてストップしていたが
今回ようやく解決の糸口が見えたので記事にしておく

〇EXCELのVBAでIEをコントロールのそもそも
σ(゚∀゚ )ワタシ、昭和の時代に汎用機のSEをやってまして
その時代にはPCなんぞ一般的ではなく
あったとしてもMS-DOSなものでした

そんな我が家に初めてやってきたパソコンは
Macintosh IIciというオールドマック
そして表計算はExcelが定番

その時代のMacの世界は
多くのフリーソフトが出回っていて
パソコン通信を通じて無料で入手可能な時代

それでも、お金を払ってでも買いたくなるほどの機能が、その時代のExcelにはありました

うろ覚えではありますが
現在のExcelにもマクロの記録というのがありますが
当時のExcelにもこの機能がありました

記録モードで操作をするとマクロシートに命令内容が書き込まれます
現在のマクロの記録はVBAが記録されますが
当時のものはマクロシートという、まるでワークシートのような各セルに
命令内容が書かれていくもの

ひと通りの操作を終了させたのちに
条件分岐などの体裁を整えれば
非情に汎用性の高い「プログラム」がいとも簡単に作成できる優れものでした


〇職場の業務システムの手の届かないところ
σ(゚∀゚ )ワタシの勤務先の業務システムはWebベースで作成されています
たとえば、日報の作成には、日付などの条件を入力して抽出ボタンを押し
内容を確認して印刷ボタンを押して出力された書類を上司に報告します

ある部門では、外部から提供されたCSVファイルをExcelで事前処理して印刷したものを
内容を確認したら、印刷した紙から、ひたすらWebベースの業務システムに手打ちして入力するような業務もあり
すでにデジタルデータがあるのに、アナログな処理を求められる非効率さが課題となっていました

システムのベンダーに改善要求を出しても、高額な開発料を要求され
長らく非効率さに涙を呑んでいたそうです
そこに私が着任し、「なんだそんなことか」と3日で作ったExcelは
汎用性はないものの、手入力専用のオペレーター(臨時さん)一人分の仕事がプログラムに置き換わりました
(臨時さん、職を奪ってごめんな)

これをどこからか聞きつけたわが社の各部門から
俺んとこもタノムってきやがった(笑)

一応言っとくけど、σ(゚∀゚ )オレ1500人規模の事業所の部長クラスなんすけど
わけあって、左遷されて、完全な暇人だったので
もう少し汎用性のあるものを作ろうと

そんなところから出てきたのが、冒頭にあったマクロシートである


〇マクロシートの構想
Basicをやったことのある人間なら行番号の便利さはわかると思う
現在のオブジェクト指向プログラミング、構造化プログラミングではおよそお目にかからないものだが
コンパイラ(インタープリタ)の負担が少ない

そんなわけで自作マクロシートの構造は
行番号
命令語
オプション1から6ぐらいとした

例えばこんな感じ
タイトル 行番号 命令語 Option1 Option2 Option3....コメント
例 番号 IEClick 検索指定 検索キー 添え字 IEの指定ID項目をクリック
実例 10 IEClick ID MyButton 略 10行目の命令はWebページのMyButtonというIDを持つ項目をクリック

こうしてセルに記入された命令郡を、VBAで解析しながらWebを操る

もちろんExcelからIEの項目に値をセットするのも自動だ
IESet 検索指定 検索キー 添え字 セットプロパティ 元シート名 元セルアドレス IEの指定ID項目に値をセット
先の例でいえば、エクセルの特定のシートの特定のセルから、Webの特定IDを持つテキスト項目に値をセット
という感じだ

参考画像
IECntlCMD.jpg
開発途中のものだが、命令の一覧


〇ポップアップがだめなんですよ
元々の業務システムは「人間を相手にする」ことが前提なので
例えばページの変遷において、確認メッセージを表示することがある
そんな場合はたいていがJavaのalert(表示する内容)なわけで

こいつに応答するには
ネットの検索すると、WindowハンドルAPIを使って

hwnd = FindWindow("#32770", "Web ページからのメッセージ")
てな具合で
PostMessage hwnd, WM_COMMAND, vbOK, 0
で対処するとある

確かにalertのメッセージならこれで動くのだが
職場の業務システムではこれができなかった

そして先日見つけたのがこれ
アラートのポップアップだと思ってハンドルを探してたが、こんなのがあったのか

引用開始
今さらながらJavaScriptのwindow.showModalDialogについて調べてみた。
http://d.hatena.ne.jp/replication/20100117/1263694945
引用終わり

簡単に言うと
IE独自のModalDialog関連キーワード ウインドウ名とクラス
1.親画面サンプル - Internet Explorer IEFrame
2.親画面サンプル - Internet Explorer Alternate Modal Top Most
3.子画面サンプル -- Web ページ ダイアログ Internet Explorer_TridentDlgFrame
1が親、2は親をマスクする透明ウインドウ、3がメッセージウインドウ本体
な関係で

最前面に表示される3は独立したウインドウ
2は1の前に常にお邪魔するブロッカー
ユーザーは1を操作しているつもりでも、つねに同じ位置にいる透明な2によってブロックされ
3が消えない限りブロックし続けるもの

この件についてさらに探っていくと、実はこの機能はIEしか実装されていない
狐火などほかのブラウザーではセキュリティー上の問題があるため実装しないとされているらしい

たしかにそうだ
Alternate Modal Top Mostの画面が万一ハックされればキーボードロガーどころではない
Webページへのすべての操作がハックされることになる

IEってすっごくこわい
自宅では絶対使いたくない!

という話は(つ´∀`)つオイトイテ
職場ではローカルイントラなので、この状況は続くだろう
であれば、Alternate Modal Top Mostには対応しなければならないね

基本的には、3のウインドウは単なるWebページがラップされただけのものなので
ウインドウハンドルからDocumentを取得さえできれば
通常のWebページをDomで操作するのとかわりない

ということで、先ほど実験したら、みごとに解決できた!
今後動作確認を経て、最新版のVBAソースもアップしてみたい


〇おまけ
VBAでIEを自動運転するという視点で開発したものだが
実はExcelの自動操作だけにおいても有効であることがわかった
現在の記録マクロはVBAに記録される

なので、VBAの知識がなければ汎用性のあるものにはコンバートできない
これが、(限りはあるが)昔のマクロシート並なユーザーインターフェースを持てば
結構な汎用性のあるものが簡単に構築できることになる

こいつは、案外使えるかもしれない
( ̄ー ̄)/~~ジャ
関連記事
スポンサーサイト



コメントの投稿

非公開コメント

おもちゃ箱
Count from 2010/01/14

にほんブログ村 バイクブログ ドゥカティへ


カレンダー
09 | 2019/10 | 11
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
最新記事
最新コメント
カテゴリ
月別アーカイブ
リンク
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

全記事表示リンク

全ての記事を表示する