ユーザーインターフェース

ActiveXコントロール

 コントロール+イベントプロシージャ=Windowsアプリケーション。Windowsプログラミングは、このひと言に集約されるといっても過言ではありません。もちろん、本家のVBもそうですし、またOffice 2000 VBAでもユーザーフォーム上にテキストボックス、コマンドボタンなどのお馴染みのコントロールを配置して、VBさながらのダイアログボックスを作成することができます。VB同様に、Office 2000 VBAも典型的なイベントドリブン(イベント駆動型)の開発言語なのです。
 もっとも、Office 97の時点ですでにVBAはイベントドリブンとなっていますので、気になるのはやはりOffice 2000になってユーザーフォームやActiveXコントロールがどれくらい強化されているのかという点でしょう。何を隠そう、筆者が一番注目していたのもこの点なのですが、残念なことに、まず標準のActiveXコントロールの数は増えていません(図4)。

図4:Office 97およびOffice 2000のActiveXコントロール

 また、さらに残念なことに、Office 2000になってもActiveXコントロールは「ウィンドウ」ではありません。ウィンドウは、Win32 API(Application Programming Interface)プログラミングの話になります(ここでその詳細に触れることは控えます)。要するにウィンドウは、画面上の矩形の領域と考えてください。そして、マウスによるクリックなどのユーザーからの入力をメッセージとして受け取って処理することができるWindowsアプリケーションの基本部品をウィンドウと呼ぶのです。ご存知の方もいらっしゃると思いますが、VBでは5.0から搭載されていたAddressOf演算子がOffice 2000 VBAにも遅ればせながら実装されました。だからこそ、なおさら「ActiveXコントロールはウィンドウではない」という現実には思わず首をかしげたくなります。この点に関しては、本家のVBと差別化を図りたかったのでしょうか。
 ただ、ひとつだけ非常に嬉しいバージョンアップがあります。これまでは、フォームを表示すると「アプリケーションモーダル」の状態を余儀なくされていました。つまり、フォームの表示中はアプリケーションに対する入力は一切受け付けられなかったのです。Office 97 VBAでは、この現象を回避するためにRefEditコントロールなどを使用していましたが、Office 2000 VBAでは、


Sub DisplayForm()
    UserForm1.Show vbModeless
End Sub
とShowメソッドの引数にvbModelessを指定すると、フォームはモードレスで表示されます。また、フォームのShowModalプロパティにFalseを代入しても同じ効果が得られます。
 この機能強化により、たとえばフォームの表示中にExcelの画面をスクロールしたり、セルのデータをコピーしてフォーム上のテキストボックスに貼り付けるなどの柔軟な入力処理が可能となりました(図5)。このモードレスへの対応は嬉しい限りです。

図5:フォームをモードレス表示して、セルのデータをテキストボックスに貼り付ける