最近の記事
- 9/1 - 将棋始めました
- 5/16 - サーバー引っ越し
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
Entering Passive Mode
では、続き。
InputBox 関数のマニュアルのミスとは、キャンセルされた場合に返す値である。
実際には、InputBox 関数でキャンセルすると、長さ 0 の文字列 ("") ではなく、vbNullString が返る。
この、vbNullString は、"" とは異なる値である。
InputBox 関数で OK を押した場合、テキストボックスの内容が戻り値となる。
テキストボックスが空の場合は "" が返るので、キャンセルの vbNullString と区別することができる。
ただ、1 つ大きな問題がある。
vbNullString と "" をどうやって区別すれば良いのか。
vbNullString = "" は TrueStrComp(vbNullString, "") は 0Len(vbNullString) も Len("") は 0困ったことに、VBA の一般的な方法では、上記を区別するのは困難なので、特別な方法を使う必要がある。
VB(A) の中でも、不思議な仕様なのが InputBox 関数だ。
この関数は、一行入力のテキストボックスを持つダイアログボックスを表示し、 利用者に適当なテキストの入力を促す。 見た目が質素なので、その用途は微妙だが、 フォームをいちいち作るのが面倒な時に使うこともある。
ダイアログボックスには、OK だけでなくキャンセルボタンもあるので、 利用者はキャンセルを選んで、処理を中止することもできる。 ということは、この関数は入力されたテキストだけでなく、 キャンセルされたかどうかの情報も返さなければならない。
さて、この関数の戻り値は、String 型である。 他の引数には値を呼び出し側に返すものはなく、 エラーを使ってキャンセルを表す感じでもない。 つまり、戻り値のみで対応しないといけないのだ。
どうなっているのか。
私にとって、Excel は紙のようなものである。
紙には、制限なく素早く自由に文字が書ける強みがあり、Excel には、自由にデータを移動、コピーできる強みがある。
考え事をするときは白紙と方眼紙とペンが手放せないのだが、紙に好きに書いて色々考え、頭の整理がついた後は、Excel を起動して区分・分類する癖がある。
Excel は表計算ソフトなので、計算用なイメージがあるが、そういった使い方ではなく、単なるメモ用として使っている。
それだけなら、別に Excel でなく、メモ帳や付箋ソフトでも良いんじゃないのと思うだろうが、私は VB プログラマなので、Excel に附属している VBA という環境が魅力なのである。
Excel をはじめとする Office ソフトには、古くから VBA と呼ばれるプログラミング環境がある。VBA は VB 系の中でも異例で、Office と共に 15 年も生き続けている長寿の言語である。
VBA では、アプリケーションの操作を自動化することができる程度にとどまらず、VB 言語を使って、自由にプログラムを書くことができる。
プログラムは Excel のデータと一緒にファイルに保管されるため、持ち運びも非常に楽である。Excel の普及率は結構高いので、人に渡す時もあまり苦労せずに済む。
そのため、小さな業務の効率化のために、Excel は欠かせないツールとなっている。
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 コードやパズルの問題などが
すべて同じブックに格納されているからだ。
そこで、問題を解くための処理を書いたブックと、
問題だけを格納したブックに分離して管理することにした。
サイズ的にもすっきりしたし、
必要な問題だけを開くことができるようになった。