Kensu = 0 ' 検索合致件数を記録する変数の初期化
For Gyou = 1 To Grid1.Rows - Grid1.FixedRows Grid1.Row = Gyou
Sarch = "" ' 一行分の情報をまとめてためる変数
For Retu = 1 To Grid1.Cols - Grid1.FixedCols Grid1.Col = Retu
' 各列の情報を Sarch にためる Sarch = Sarch & Grid1.Text Next
' InStr関数は、Sarch の中にキーワードがあれば、
' その始まり位置を返す。無ければ、SarchResult の値は0 SarchResult = InStr(1, Sarch, KeyWord)
If SarchResult <> 0 Then
' 合致件数を Kensu でカウントする Kensu = Kensu + 1
' キーワードと合致する行にあるセルが持っている
' 情報を SarchedData 配列に保存しておく For Retu = 1 To Grid1.Cols - Grid1.FixedCols Grid1.Col = Retu
SarchedData(Retu) = Grid1.Text Next
' Sarched 配列に保存しておいた内容を
' 新たにグリッドの上の行から書き込んでいく
Grid1.Row = Kensu
For Retu = 1 To Grid1.Cols - Grid1.FixedCols Grid1.Col = Retu
Grid1.Text = SarchedData(Retu) Next
End If
Next
リスト 17 検索用のコード−その2:検索と結果の表示
9.2. 検索の仕組み
検索機能の本体は,リスト 17です.一 人分の四つの情報が一行に表示されるよう に設計してあるので,検索をかけるにはこ れら四つの項目を逐一チェックしなければ いけなくなり面倒な作業になります.
そこで四つの情報をつなぎ合わせて,一 人分の情報は一つの変数で取り扱えるよう に し ま し た . こ う し て 一 人 分 の 情 報 は
Sarch という名前の変数にまとまって与え
られます.これとキーワードとの比較をし ているのが,InStr関数です.
SarchResult = InStr(1 , Sarch , KeyWord)
KeyWord が持っている検索したい文字
列が,変数Sarchに含まれているかどうか,
Sarchの持っている文字列の1文字目から
順に探していきます.もしSarchがキーワ ードを持っていたら,それが何文字目で見 つかったのかという値がSarchResultに与 えられます.
もしSarchがキーワードを含んでいなけ
れば,SarchResultには0が入ります.注 目する行をFor 〜 Next文で変えながら,
全部の行を検索していきます.
9.3. 行の内容とキーワードが一致したとき
検索件数を与えるための変数 Kensu は 値を一つ増やします.キーワードと合致す る情報を含んでいる人の情報を,各項目ご とに配列に保存します.その後,配列に保 存しておいた情報は,Kensuの値で示され ている行(1 行目)に書き込まれます.書 き込みが終われば次の人の情報に移ります
つぎにキーワードに合致する人物が現れ ると,やはり Kensu は 1 増えます.先ほ どと同様に配列に情報が保存され,今度は さっきの次の行(2 行目)に書き込まれて いきます.
こうしてグリッドの全部の行を検索して いくと,キーワードに合致した人の情報は 1行目から順番に並べられることになりま す.
上から順に 見ていって
キーワードが見つかると 上端の行から順番に書き込む
図 12 検索の基本動作
' 検索の結果該当するものがあった時には、余分な行を消す If Kensu <> 0 Then
' 削除する行数を求める
KesuGyouSu = Grid1.Rows - Grid1.FixedRows - Kensu
' 行の削除作業
For Gyou = 1 To KesuGyouSu Grid1.RemoveItem Kensu + 1 Next
Else
' キーワードを入力して、検索したけど該当するものがなかった時の表示
Msg = " 該当するものはありませんでした "
If KeyWord <> "" Then MsgBox Msg , 0 , "検索結果"
End If
End Sub
リスト 18 検索用のコード−その3:不要な行の削除
9.4. 余分な行を削り取る
グリッドの上の方の行は検索の結果が書 き込まれていても,下の方は検索前の状態 の ま ま で す . そ の 下 の 方 の 余 分 な 行 を
RemoveItemメソッドで削り取るのが,リ
スト 18です.検索の結果が書き込まれた
最終行はKensuの値から分かりますから,
グリッド全体の行数を表す Rows プロパテ ィから,固定行数を表す FilexdRows プロ
パティとKensuuを引いた値が,削除する
行数となります.RemoveItemメソッドを For 〜 Next文を使って,この回数分だけ くり返して不要な行を削除します.
また,検索の結果該当するものがなかっ
た場合は,見つからなかった旨のメッセー ジを出すようにしています.
MsgBox 命令を使うと,小さなウインド
ウが開いてメッセージを表示させることが 出来ます.
MsgBox メッセージ
,モード ,ウインドウのタイトル
モードの値によってウインドウに表示され るボタンや絵が変わります.必要がなけれ ば,モードとタイトルを指定しなくてもか まいません.その時にはウインドウにはメ ッセージと[OK]ボタンだけが表示され ます.
蛇足ですが,リスト 16〜リスト 18は,
長い一つのCommand_Clickプロシージャ を三分割したのもです.実際に利用される ときは,一つに組み合わせてお使い下さい.
10. メニューバーの作り方
仕様に盛り込んでいた機能は,完成しま した.これにメニューバーを付けてみまし ょう.ほとんどの Windows ソフトは,コ マンドボタン以外にメニューバーも持った 作りになっています.初めて使うときには,
なにを意味しているか分からないボタンや アイコンよりも,文字で書かれたメニュー の方がわかりやすいからです.
10.1. メニューの構造を考える
ここでは,フォームの上の各ボタンの機 能をメニューバーから利用出来るように作 っていきましょう.通常メニューバーは,
[ファイル],[編集],[ヘルプ]など のタイトルがあり,各々のメニューを開く と,中に選択項目がある階層構造になって います.分かりやすいメニューになるよう に各機能を仕分けしておく必要があります.
今回は,次のような構造にしましょう.
[ファイル]
メニュー項目 保存 読み込み 終了
[行操作]
メニュー項目 行追加 行削除
[検索・抽出]
[検索・抽出]はメニュー項目は無しで す.
10.2. メニュー作成
メニューを作成するための「メニューデ ザイン」ボタンは,ツールボックスではな くツールバー上にあります.
フォームをクリックして,フォームがフ ォーカスされた状態にしてからメニューデ ザインボタンを押して下さい.
図 13 メニューデザインウインドウ
まず[キャプション(P)」のところにメ ニュータイトルを書き込みます.キャプシ ョンを書き込むと,ウインドウ下半分のリ ストボックスにキャプションの内容が表示 されます.メニューバーには左から,この 順番で並ぶことになります.またこの順番
ここです
リストボックス
で三行目の[インデックス(X)]の値を0,
1,2と書き込んで下さい.
[名前(M)」欄には,ファイル,行操作,
検索・抽出のそれぞれについて同じ名前を 書き込んで下さい.名前としては,mnu で良いでしょう.
リストボックスに上から順にファイル,
行操作,検索・抽出と並んでいる時には,
インデックスの値と名前は
キャプション 名前 インデックス
ファイル mnu 0
行操作 mnu 1
検索・抽出 mnu 2
となります.この状態で[OK]ボタンを 押して,フォーム画面に戻ってみましょう.
ここでエラーメッセージが出る時は,名 前が同じであることと,インデックスが上
から順に0,1,2となっているかどうか,
確認してみて下さい.無事フォームに戻れ たらメニューバーが出来ているはずです.
次は,メニュー項目を作っていきます.
再びメニューデザインスイッチを押してメ ニュー作成画面を出します.
10.2.1. [ファイル]のメニュー項目
このリストボックスの「行の操作」と書 かれたところをクリックした後で,[挿入 (I)]を押します.するとファイルとの間に 隙間が出来ます.この状態で[キャプショ ン]に「保存」という項目を書き込みます.
[名前]のところにはファイルで使ったの と違うもの(mnuFile)にします.また,
インデックスは0にして下さい.
ここでインデントスイッチ を押すと,
「保存」が右に寄ってファイルのメニュー 項目になります.同様な手法で「読み込 み」項目も作ります.これの名前は「保 存」と同じ mnuFile にして,インデック スは1 にします.終了も同様にしてインデ ックスは2にします.
ここで[OK]を押して再びフォームの 編集画面に戻ってみましょう.メニューバ ーの[ファイル]の部分をクリックすると,
[保存]や[読み込み]などが現れるよう になったはずです.
10.2.2. メニュー項目をクリックしたときに
行う命令の書き込み
ここでメニューバーをクリックして出て きた[保存]や[読み込み]をダブルクリ ックすると,コントロールオブジェクトの 時と同じようなコードウインドウが現れま す.ここに次のような Select Case 文を書 き込みます.
インデント スイッチ
Sub mnuFile_Click( Index As Integer ) Select Case Index
' Index = 0 の場合、保存 Case 0
Command1_Click
' Index = 1 の場合、読み込み Case 1
Command2_Click ' Index = 2の場合、終了
Case 2 End End Select End Sub
リスト 19 メニューバーのファイルメニュー