最初、世の中にはこういったコードの使い方もある、ということを知って大いに驚きました。それは、
「コードでコードを操作する」
というものです。
少し前からExcelVBAを使ってシステムを作るという仕事をするようになったのですが、先輩社員から「コードでコードを操作できる」という話を聞くまではそういった概念は全くありませんでした。
ExcelにはVBE(Visual Basic Editor) というものが搭載されています。これはExcelVBAのコードを入力したり編集、デバッグ、ユーザーフォームを作ったりするためのエディターのことです。
自分は長年ExcelVBAを触ってきた訳ではありませんが、このVBE上にそれらしきツールを見たことはありませんでしたし、自分が勉強した範囲では「コードでコードを操作できる」という文字も見たことはなかったので、その言葉を聞くまではコードでコードを操作するという発想も生まれてはきませんでした。
今回はこのことについて、思ったことや気づいたことなど備忘録も兼ねて整理していってみたいと思います。
きっかけ
少し前に偶然にも先輩社員が作っているシステムを見せてもらう機会があり、そのシステムのUI(ユーザーインターフェース)や機能の充実さに驚いた時がありました。
その本格的な見た目や機能から、「これはどういう機能なのか」「この機能を実現させるためにはコードはどのようになっているのか」「このモジュール間の変数の受け渡しはどうやっているのか」など、色々と質問していた時のことです。きっかけは、先輩社員の次の言葉でした。
「ここでユーザーがシステムの設定をいじれるようになっていて・・・」
その時は、一瞬何を言っているのかわからず戸惑ったのですが、すぐにその言葉の意味を理解しました。
例えるなら、ゲームのスタート画面の項目にある「オプション」みたいなものです。あそこでゲームの音量とかグラフィックの明るさ暗さを調節できるみたいなイメージ。
業務用のシステムで考えるなら、全体のフォントの大きさや背景色を選択できるとか、ExcelからAccessのデータを取り込む場合、同期方法をユーザーの手で簡単に設定できるみたいな、そんなイメージです。
そういった機能を先輩社員はシステムに組み込んでいたということです。
このことを知った時は本当に感心しました。というのも、自分がシステムというものを本格的に作り始めてから「ユーザー自身が使いやすくなるようにユーザーにシステムの機能を設定できるようにさせる」という概念が全くなかったからです。
「なるほど、ユーザーが『使いやすいシステム』というのは、ここまで考えて作り込まないといけないんだな」と感心しました。ここで新たな疑問がわいてきました。
「でも、どうやってやってるんだろう」と。
「コードを操作するためのコード」という発想
「ユーザーにシステムの機能を設定できるようにさせる」とは、具体的にどのようにすればそのような機能を実現させることができるのでしょうか。
それは「コードでコードを操作する」というものです。
先輩社員と一度話す機会があり、先程の「ユーザーにシステムの機能を設定できるようにさせる」ためにどのような方法を取っているのか聞いた所、どうやら「コードでコードを操作している」らしいのです。
この時も自分は戸惑ってしまいました。というのも「コードでコードを操作する」という言葉も自分にとっては初めての概念だったので、「本当にそんなことが可能なのか」と思ってしまったからです。
もう少し具体的に聞いてみると「ExcelVBAではできないからVBを使っている」という話を聞き、この時も戸惑いました。なぜならExcel上でVBのコードを動作させるなんて考え事もなかったからです。もっと言うなら、VBA以外にVBの知識もある先輩社員の知識の幅広さにも驚きましたが。
ちなみにVBとはVisual Basicと呼ばれ、Microsoftによって開発された主にWindows用のアプリケーションを開発するためのプログラミング言語になります。
WordやExcel、AccessなどのMicrosoft Officeは、このVisual Basicを元にして作られたプログラミング言語であるVBA(Visual Basic for Applications)によって作られています。
最初は「VB」と「VBA」は違うプログラミング言語だから文法的、ルール的にExcel上では動作しないんじゃないかと思い込んでいました。
でもよくよく考えてみると「VBA」というプログラミング言語は「VB」をベースにして作られたと言われていますし、WinAPIなどもVBE上で動作するので、Excel上でも動作するのはむしろ自然なのかもしれない、とも思いました。
先輩社員からは「ExcelVBAではできないからVBを使っている」とは言われましたが、本当にExcelVBAでExcelVBAを操作することはできないのか、とも思いました。
そこで良いきっかけですし、今後の自分の勉強にもなるだろうと思って、この「ExcelVBAでExcelVBAを操作できるコード」がないか簡単に調べてみました。
『ExcelVBA 実戦のための技術』にあるモジュールのエクスポートとインポートができるコード
これを「ExcelVBAでExcelVBAを操作できるコード」と言ってよいかどうかわかりませんが、その概念に近いものを見つけました。
『入門レベルでは決して足りない実務に必須のスキルとは ExcelVBA 実戦のための技術 』に次のように書かれている箇所があります。
P.437
VBAはExcelの操作を自動化するだけのものではない
VBAを使ってExcelのブックやワークシート、セルなどの処理を自動化することは当然のことですが、VBAを使うと標準モジュールやクラスモジュールの操作、コードの入力なども自動化することができます。
つまり、開発を効率的に行うためにVBAが使えるということなのです。
この部分を初めて読んだ時は「ExcelVBAにはこういったやり方もあるんだな」ぐらいにしか考えていなかったのですが、先輩社員の話を聞いてからは、この部分は実は非常に重要なんじゃないかと思うようになりました。
引用した文章の内容からすると「ExcelVBAでモジュールを操作する」といった感じです。この動作を実現できるようにするためには、Excelのオプションのセキュリティセンターという箇所で指定の設定が必要なようです。
本書に書かれている「ExcelVBAでモジュールを操作する」コードの内容としては、モジュール(標準モジュールやブックモジュールなど)をエクスポート・インポートする操作の自動化のコードが書かれています。
本書がこのコードが使われるケースとして想定しているのは、「他の人とのモジュールファイルの共有やバージョン管理」としています。(詳細や具体的なコードは本書を参照していただければと思います。)
ExcelVBAでコードを操作するためのコード
先に挙げた「ExcelVBAでモジュールを操作する」方法以外にExcelVBAでExcelVBAを操作できるコードがないかインターネットで調べてみたのですが、ありました。
自分がここで説明するよりも素晴らしく優秀な人たちのサイトを参照していただいたほうが早いと思ったので、以下に主な参考サイトを載せました。
- Office TANAKA – VBAでVBEを操作する[CodeModuleのプロパティ]
- モジュール内のコードを操作する(CodeModule のメソッド)-Excelwork.info
- Office TANAKA – VBAでVBEを操作する[応用サンプル]
一通り見た感じでは、
- CodeModuleオブジェクト
- ReplaceLine メソッド
- AddFromStringメソッド
- DeleteLines メソッド
などのオブジェクトやメソッドを使うとコードで指定のモジュール内のコードを操作できるようです。コード以外にもいくつかサンプルも見ることが出来るので非常に勉強になります。やはり何事も調べてみるものですね。
先輩社員の「ユーザーがシステムを設定できるようにする・・・」という言葉もそうなんですが、コードでコードを操作するというやり方を応用すると開発面から非常にすごいことができるのではないか、とも考えました。
今までは自分がコードを入力する時は、手入力か既にあるコードをコピペして作っているシステムに合うように一部修正していく、といったやり方をしていました。
これがコードを使ってコードを入力してシステムを作る、ということができるようになれば、単純に考えれば開発期間を大幅に短縮できます。
というのもExcelでマクロを使ったことがある人ならわかると思うのですが、本当に一瞬で業務が終わってしまうからです。これをコードを入力する時にもできたらそれは色々と楽になるでしょう。
とは言っても、それを可能にするコードを使いこなすにはやはりそれ相応の知識や経験が必要になってくると思います。なぜならシステムにあるコード全体をデジタル的に把握していないとそのコードの操作というのは難しいと思ったからです。
自分が確認した範囲で、CodeModuleオブジェクトやReplaceLine メソッドの使い方を見ると
- どのモジュールの
- どのプロシージャの
- 何行目のどのコード
を操作するのか、さらに
- コードでコードを変更したことによってもたらされる結果
という所まで見ないと上手く使うのは難しそうだと感じました。上記に挙げたような項目をコード全体にわたって把握するにはやはりある程度の経験や知識が必要になるのではないかと思います。
まとめ
今回の件でExcelVBAでもExcelVBAを操作できるということがわかりました。でも、どこまで操作できて、例えばどういった場合に使えるのかという限界点まではまだ把握はしていません。
もしかしたらVBよりもVBAの方が、コードでコードを操作するという点では色々と制限はあるのかもしれません。
もっと勉強していけば「あぁ、これってもっとこういう使い方できるよね」とか、自分が聞いた先輩社員の言葉のように「ユーザーにシステムを設定してもらう」ぐらいの機能も実現できるのかもしれません。
今回の件で思ったのは、できる人のシステムを見せてもらったり、できる人から話を聞く、というのはやはり勉強になるなと思いました。また、いろんな会社で働いてみるものだな、とも思いました。
自分一人の勉強ではやはり限界があるでしょうし、自分一人では「コードでコードを操作する」という概念があるなんてまず気づけなかったと思います。
そもそもこういった知識を持っている人に出会えたのは、自分が派遣社員だったから、というのもあると思います。仮に正社員として1社目、2社目の会社で今でも働いていたらまず「VBA」を使える人には出会えなかった、もしくは仮に出会えたとしてももっと全然遅かったでしょう。
派遣社員だから簡単に様々な会社をまわることができましたし、同時に優秀な人とも出会える可能性が高まった、ということもあると考えています。
こういった機会を生かしてもっと勉強していければと思っています。
コメント