Entering Passive Mode

カテゴリ 'VBA, VB Classic' の記事
< 1 2 3 4 5 >

vbNullString と 空文字列 ""

では、続き。

InputBox 関数のマニュアルのミスとは、キャンセルされた場合に返す値である。

実際には、InputBox 関数でキャンセルすると、長さ 0 の文字列 ("") ではなく、vbNullString が返る。 この、vbNullString は、"" とは異なる値である。

InputBox 関数で OK を押した場合、テキストボックスの内容が戻り値となる。 テキストボックスが空の場合は "" が返るので、キャンセルの vbNullString と区別することができる。

ただ、1 つ大きな問題がある。 vbNullString"" をどうやって区別すれば良いのか。

困ったことに、VBA の一般的な方法では、上記を区別するのは困難なので、特別な方法を使う必要がある。

InputBox 関数の戻り値

VB(A) の中でも、不思議な仕様なのが InputBox 関数だ。

この関数は、一行入力のテキストボックスを持つダイアログボックスを表示し、 利用者に適当なテキストの入力を促す。 見た目が質素なので、その用途は微妙だが、 フォームをいちいち作るのが面倒な時に使うこともある。

ダイアログボックスには、OK だけでなくキャンセルボタンもあるので、 利用者はキャンセルを選んで、処理を中止することもできる。 ということは、この関数は入力されたテキストだけでなく、 キャンセルされたかどうかの情報も返さなければならない。

さて、この関数の戻り値は、String 型である。 他の引数には値を呼び出し側に返すものはなく、 エラーを使ってキャンセルを表す感じでもない。 つまり、戻り値のみで対応しないといけないのだ。

どうなっているのか。

紙と Excel と VBA

私にとって、Excel は紙のようなものである。

紙には、制限なく素早く自由に文字が書ける強みがあり、Excel には、自由にデータを移動、コピーできる強みがある。

考え事をするときは白紙と方眼紙とペンが手放せないのだが、紙に好きに書いて色々考え、頭の整理がついた後は、Excel を起動して区分・分類する癖がある。

Excel は表計算ソフトなので、計算用なイメージがあるが、そういった使い方ではなく、単なるメモ用として使っている。

それだけなら、別に Excel でなく、メモ帳や付箋ソフトでも良いんじゃないのと思うだろうが、私は VB プログラマなので、Excel に附属している VBA という環境が魅力なのである。

Excel をはじめとする Office ソフトには、古くから VBA と呼ばれるプログラミング環境がある。VBA は VB 系の中でも異例で、Office と共に 15 年も生き続けている長寿の言語である。

VBA では、アプリケーションの操作を自動化することができる程度にとどまらず、VB 言語を使って、自由にプログラムを書くことができる。

プログラムは Excel のデータと一緒にファイルに保管されるため、持ち運びも非常に楽である。Excel の普及率は結構高いので、人に渡す時もあまり苦労せずに済む。

そのため、小さな業務の効率化のために、Excel は欠かせないツールとなっている。

未だに Visual Basic 6

Windows も 7 が出るとか言ってる時代なのに、 未だに Visual Basic 6 の案件があったりする。 それも、スタンドアロンのアプリケーションで。

Excel や Word などの Office 製品のマクロでは、 まだ Visual Basic for Application (VBA) が現役なので、 Visual Basic Classic が廃れたかというとそうではないのだが。

VB2 から入った私には付き合いの長い言語であり、愛着もある。

業務の関係もあるので、しばらくはぽつぽつ VB の話をしようかな。

仕上げ

さて、仕上げをしよう。

アドインは、「アドイン」一覧に表示されるが、
そのときに表示されるタイトルやコメントは修正できる。

これらは、アドインを作ってからでも、
ファイルのプロパティから修正できるが、
せっかく Excel を使ってるなら、Excel からやろう。

まず、メニュー「ファイル」→「プロパティ」を選ぶ。
ファイルのプロパティの画面が表示されるので、
「ファイルの概要」タブを選び、
タイトルとコメントに入力する。

アドイン用のイベント

アドインの場合、メニューへの追加だけでなく、
メニューからの削除まできっちり行わなければならない。

Workbook (ThisWorkbook) にはアドイン用のイベントがある。AddinInstall と AddinUninstall だ。

アドインが Excel で使用可能になった時点で、
AddinInstall イベントが発生し、アドインを削除した際に、
AddinUninstall イベントが発生する。
Install/Uninstall という名前が示すとおり、
アドインの導入時と導入解除時しか発生しない。

メニューのハンドラ

昨日追加したメニュー項目には、
まだ処理を関連付けていないため、
選んでも何も起こらない。

メニューに処理をさせるには 2 種類の方法がある。
ひとつは、CommandBarButton の OnAction プロパティ、
もうひとつは、CommandBarButton の Click イベントだ。

前者は、簡単に利用できる手法である。
OnAction プロパティに、マクロの名前を指定すれば
メニューが選択されたときに自動的に呼び出される。

メニューの登録

メニュー

Excel のメニューは、Office で共通で利用されている、
CommandBar クラスを中核に据える、
複雑なクラス群で構築されている。

メニューを操作するためには、
これらのクラスに関する知識が必要だ。

では、目標として、ののぐらむの解答用のメニューを、
「ツール」メニューの中に登録することにしよう。

ツールメニューは、幾つかのグループに分類されているので、
アドインであるソルバや、ゴールシークなどが含まれる、
3 つめのグループに登録することを目標とする。

アドイン化

アドインを作るのは非常に簡単だ。
「名前をつけて保存」を選択し、ファイルの種類から、
「Microsoft Office Excel アドイン (*.xla)」を選ぶだけ。

ファイルの種類をアドインにすれば、
自動的に AddIns 用のフォルダに移動する。
この場所に保存しておけば、
自動的にアドイン一覧に登録される。

導入にもテストにも便利だが、
勝手にフォルダに移動するので、
どこに保存したか忘れないように注意。

ブックの分離

さて、アルゴリズムに関してはここまでとしよう。
まだまだやりたいことはあるがきりがない。

Nonogram.xls がだいぶ肥大化してきた。
理由は、Excel のファイル形式の制約もあるが、
何といっても VBA コードやパズルの問題などが
すべて同じブックに格納されているからだ。

そこで、問題を解くための処理を書いたブックと、
問題だけを格納したブックに分離して管理することにした。
サイズ的にもすっきりしたし、
必要な問題だけを開くことができるようになった。

< 1 2 3 4 5 >
このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS