見出し画像

VBAを使って業務効率アップ〜追憶〜

この記事を書こうと思ったわけ

外出自粛要請を受けて自宅で note の記事を読み漁っていた。写真ネタとか鳥ネタとかにもそろそろ飽きてきたなと思い、“VBA” で検索。

なぜ VBA か。それは、VBAのことを note に書いてみようかななんて漠然と考えていたから。VBAを色々いじった経験が、VBA を学習する人々の参考になれば、と思ったのだ。で、他の人がどんなことを書いているかを知りたくて、VBA で検索したのだった。

ざっと検索結果に目を通す。

実際のプログラムに関する話は、目的もなく読む気がしないのでスルー。

RPAというワードも目に止まった。興味を持ったことはあったが、今の俺なら VBA を使うだろう。RPAは必要ない。

かなり下の方までスクロールしたとき、次の記事が目に止まった。

Excel VBA Expert Standard ?
へえ、そんなのがあったんだ。
で、最後まで読んで、❤️をポチッと、、、

ま、この記事が直接のきっかけではないが、このように頑張っている人がいることを思ってこれを書くことにした。

VBAとの付き合い

俺は、とにかく単純作業が嫌いだ。
単純作業はコンピューターにやらせればいいだろう、そう思っていた。

で、VBAを活用しようと考えた。Office は導入済みなので、VBA を使うにあたって追加投資は発生しない。上司の顔色を伺うことなく始められる。最高だ。

VBA を使いたい。
俺は、職場のマクロの先生にショートカットを教えてもらい、VBEのウィンドウを開いた。

最初は、Excel のワークシートのデータを処理することから始めた。
それから、クエリを使って Web サイトからデータを取り込んだり、エクセルファイルをダウンロードしてブックに統合したり、ブック全体を PDF 化したりした。そのときの PDF 化には、Printer 機能を使ったのだったか。そのうち、PDF のデータを読み込む必要が出てきて、AcroExch.app も使った。

俺が最終的にやりたいことは、IEで表示したデータをエクセルに持ってくることだった。しかし、ほとんどのサイトでクエリが使えなかった。一体どうすれば、Webページの操作ができるのか。データを持ってこられるのか。
方法が分からないまま時間が過ぎていった。

そんなとき、プライベートで始めた電子工作の発展形として、Raspberry Pi を買う。そこで Python を知り、Python を勉強するために入門書を買う。

「入門 Python 3」、オライリー・ジャパン

この本は、珍しく、ほとんど全部読んだ。そして、Web Scraping を知る。
「PythonによるWebスクレイピング」という項で。

これだ、これでやりたかったことができる。そう思った。

で、Python で Web Scraping を始める。

会社で IE 叩いて、つまづいたら家で調べる。対策がみつかったら会社でやってみる。その繰り返しが続いた。

しかし、どうやって Python からエクセルにデータを持っていくのか。俺は一旦 csvファイルに保存し、それをExcel で開くことにした。Python スクリプトは Excel VBA から実行できたので、操作の手間が増えることはなかった。

「だけどなあ、メンバーにも使ってもらいたいし。その場合、Python をセットアップしてもらうのが障害になるよなあ。」
ここで、Python を使わない方法に移行することを決断。

Excel だけで完結するなら、マクロ付きのファイルを渡すだけで済む。もうそれしかない。ちょっと周り道したけれど、落ち着くところに落ち着いた感じだ。

Python でやっていたことを、Excel VBA で作り直す。
IEを操作するコードは、最初、先輩が作ったベーシックなものを参考にした。しかし、すぐに限界が来た。それからは自力で作り上げるしかなかった。

苦労したこと

細かいことはもう覚えていないが、IEのエレメントの扱いで随分苦労した。

1、ページの読み込み完了がわからない。
エレメントが存在していなくて空振り。
読み込み待ちが必要という知識を得たものの、ReadyState は役に立たないと判明。じゃあ、どうしたら?
暫定的に待ち時間をふんだんに入れてみた。しかし無駄に時間がかかるのが気に入らない。なにより全然確実でない。最終的には、目的のオブジェクトが Nothing ではなくなるまで待機することで解決。

2、ウィンドウの名前が変わる。
ウィンドウの名前を使って目的のウィンドウを特定していたら、ボタンクリック後にウィンドウの名前を書き換えてしまう人が出てきて、結果、ウィンドウを見失う。甘かったな、俺。

3、エレメントにIDがない。
IDが付いていたら、楽だろうにと思う。
Web Scraping が、エレメント掴みゲームと化す。もはや仕事と呼べるものではない。Webデザイナーとの戦いに負けたらゲームオーバー。実際、いくつか負けた事例はある。くやしいけど、そこは手作業で。

4、フレームが複雑な入れ子になっている。
Frame だとか iFrameだとか、よく知らないけど複雑にしすぎ。
目的のエレメントがフレームの下にある場合、いったんフレームを掴まないないと指定できない。しかし、Webサイトの見通しが悪く、フレームを見落としてエレメントが掴めないエラー発生。

5、ファイルダウンロードダイアログが無理
ファイルをダウンロードしようとしたとき、それまでのテクニックではどうにもならないことが判明。ネットには、UI Automationしかないだろうとある。とりあずコードをパクって解決。
今考えると、あれってアプリケーションのウィンドウとかで、HTMLじゃないんだね。
しかし、ダウンロードが完了したことを確認する方法は、いまだにわからない。というか、チャレンジしてあきらめた。

他にも色々苦労した。でも、大抵の困難は解決することができた。あきらめないこと、しかしあきらめも肝心と心得る。

Excel VBA で実現したこと

ワークシート上のデータ処理を除くと、次のことができた。

・IE 関連
IE を操作し目的のデータを表示する。
Web ページから必要なデータだけを取り込む。
ファイルをダウンロードする。

・PDF関連
ページのデータをエクセルに取り込む。(AcroExch.app 経由)
しおりをエクセルに取り込む。(階層化したしおりに対応)
プロパティーを読み取ったり設定したりする。(UI Automation でメニュー操作)

UI Automation で統一

最後には、UI Automation で統一したら良いとなった。

UI Automation を使い始めたら、UI Automation ならではの難しさがあることに気づいた。

また、ネット上には、VBA から使う方法についてはあまり書かれていない。学習が難しいのではないかと思う。

IEが表示した Web サイトの操作において、HTMLのタグを使うのと UI Automaton を使うのを比較すると、一長一短あるかなと思う。同じことをするのに、タグでの操作が簡単な場合もあれば、UI Automation の方が簡単な場合もあると思う。例えば、ボタンのクリック。HTMLタグの場合は、.click で行けるかと。しかし、UI Automation の場合は、まず、エレメントの InvokePattern をゲットしておいて、それに対して .invoke としなければならない。手順が多く必要となる。

UI Automation の基礎はどこで勉強すれば良いのか。わからない。これを使うべきかもわからない。

ま、でも IE 以外のアプリケーションを操作する場合には、いやちょっと間違えた、IE が表示した Web ページを操作する場合以外では、俺は UI Automation を使う方法しか知らないのだ。

最後に

VBAはほぼ独学である。
自分がやりたいことをやるためのことだけ学んだ。
解決策はインターネットから拾った。
インターネットで情報を提供してくれた親切な人たちに感謝したい。

t.koba





この記事が気に入ったらサポートをしてみませんか?