プログラミングの世界にはコードでコードを操作するという手法がある

最初、世の中にはこういったコードの使い方もある、ということを知って大いに驚きました。それは、

「コードでコードを操作する」

というものです。

 

少し前から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でモジュールを操作する」コードの内容としては、モジュール(標準モジュールやブックモジュールなど)をエクスポート・インポートする操作の自動化のコードが書かれています。

 

本書がこのコードが使われるケースとして想定しているのは、「他の人とのモジュールファイルの共有やバージョン管理」としています。(詳細や具体的なコードは本書を参照していただければと思います。)

コメント