Visual Basicユ―ザーのための Accessプログラミングソリューション
Access97 Tips集 part 6
秋月 巌 AKIZUKI,Iwao
これからパソコンを覚える人の定番ソフトはWordとExcelなのだと思っていたのですが,ある人は,Wordは当然としても,会社での業務としては顧客のリストや社員名簿の作成などにはExcelよりもAccessの方が便利だと言っていました.
AccessはVisual Basicと比較して,プログラムを作成しないでもこなせる作業の範囲が広いのが長所ですが,普段,Accessをインタラクティブに使いこなしている人たちにも,ぜひ,プログラミングをおぼえてほしいものです.
リストボックスに表示されている値とは別の項目を取得する
テキストボックスの入力値でリストボックスを検索
アイテムの一部分を入力しただけでリストボックスを検索
近似値でアイテムを検索する
フォーカスのあるテキストボックスを立体化する
連結コントロールにテーブルにない値を表示する
ページ分割機能を利用する
カレントレコードが新規レコードかどうか判断する※コラム − Microsoft Accessはパーソナルなデータベースマネージメントシステム? −
リストボックスを使うときに,表示選択されている値とは別の値をブログラムで使用したいことがあります.サンプルではリストで選択されているのは商品名「雪かき大福」ですが,メッセージボックスにはフリガナである「ユキカキダイフク」を表示しています(図1).
このような処理を実現するには,リストボックスのColumnCountプロパティに2を設定し,RowSourceプロパティでフリガナと商品名を指定します.しかし,これだけではフリガナと商品名の2項目が表示されてしまいます.そこで,ColumnWidthsプロパティの設定でフリガナ項目の表示幅を0に設定して非表示にします.
Private Sub Form_Load() List1.ColumnCount = 2 List1.RowSource = "SELECT furigana, " & _ "syohin_mei FROM Syohin" List1.ColumnWidths = "0;5" End Sub Private Sub command1_Click() MsgBox List1 End Sub図1:別の値を使用する
テキストボックスに入力したキーワードで,リストボックスに表示されている内容を検索すると便利なことがあります(図2).リストボックス内の値を検索するためには,リストボックスに検索キーワードを代入します.
Private Sub Text1_Change() List1 = Text1.Text End Sub図2:リストボックスを検索
前のTipsで用いた方法だと,ユーザーが検索するときにキーワードが表示しているデータと完全に一致していないと該当のアイテムに移動しません.ここで紹介する方法は,一度データベースにアクセスして,データの全文字列を取得してから,リストボックスに代入して検索しています.この方法はテーブルのデータをリストボックスに表示している場合のみ利用できます.
テキストボックスのChangeイベントプロシージャに処理を記述しているため,一文字確定するごとに検索処理が実行されます(図3).
Private Sub Form_Load() List1.RowSource = "SELECT furigana " & _ "FROM Syohin ORDER BY furigana" End SubPrivate Sub Text1_Change() Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("SELECT furigana FROM Syohin " & _ "ORDER BY furigana", _ dbOpenSnapshot) rs.FindFirst "furigana Like" & "'" & Text1.Text & "*'" List1 = rs("furigana") End Sub図3:一文字確定するごとに検索処理を実行
近似値検索とは,検索用のキーワードに先頭一致するデータがなくても,できるだけそのキーワードに近い検索結果を取得する機能です.概してデータベースはこの処理が苦手なのですが,Accessは検索条件に不等号(>,<,>=,<=)を使うことで対応しています.
前のTipsで説明した方法だと,図4のサンプルのように入力した場合には,該当レコードが取得できずに検索に失敗します.不等号を用いることで「カラシソバ」に一番近いデータ「カラメル」を取得することができます.
Private Sub Text1_Change() Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("SELECT furigana FROM Syohin " & _ "ORDER BY furigana", _ dbOpenSnapshot) rs.FindFirst "furigana >=" & "'" & Text1.Text & "'" List1 = rs End Sub図4:近似値で検索
フォーカスのあるテキストボックスの外見を変更することで,ユーザーは入力ターゲットを把握しやすくなります(図5).ここではSpecialEffectプロパティとBackColorプロパティを,フォーカスの移動時に変更して特徴づけています.SpecialEffectプロパティに設定できる値は,各々図6A〜6Fの通りです.
Private Sub Text1_GotFocus() Text1.SpecialEffect = 2 Text1.BackColor = 16777215 '白を設定 End Sub Private Sub Text1_LostFocus() Text1.SpecialEffect = 3 Text1.BackColor = 12632256 '灰色を設定 End Sub Private Sub Text2_GotFocus() Text2.SpecialEffect = 2 Text2.BackColor = 16777215 End Sub Private Sub Text2_LostFocus() Text2.SpecialEffect = 3 Text2.BackColor = 12632256 End Sub Private Sub Text3_GotFocus() Text3.SpecialEffect = 2 Text3.BackColor = 16777215 End Sub Private Sub Text3_LostFocus() Text3.SpecialEffect = 3 Text3.BackColor = 12632256 End Sub図5:立体化させて見やすくする
<= このテキストボックスにフォーカスがある
図6A:値0コントロールは非立体に表示されます
図6B:値1コントロールは凸状に浮き出して表示されます
図6C:値2コントロールはへこんで表示されます
図6D:値3コントロールは枠で囲まれて表示されます
図6E:値4コントロールは立体影付きで表示されます
図6F:値5コントロールは下線部が表示されます
コントロールのデータ連結機能は便利なのですが,テーブルにない値を表示するには,テクニックが必要です.ここではRowSourceプロパティにSQLのUNION句を使用したクエリーを使う方法を解説します.UNION句を使用すると複数テーブルのレコードを結い合わせたレコードセットを作成することができます.このサンプルのドロップダウンリストには「(なし)」という1レコードだけを持つテーブルと,商品テーブルの全レコードが合わさった結果セットが表示されます(図7).
Private Sub Form_Load() Combo1.RowSource = "SELECT syohin_mei FROM Syohin " & _ "UNION SELECT '(なし)' FROM Syohin" End Sub図7:テーブルにはない値(なし)が追加されている
Accessが提供する複数ページの分割機能は,本来,複数のフォームで処理する機能をひとつのフォームで行なうためのものです.タブ形式のフォームによる複数ページ機能と同様の効果が期待できます.また,設定画面等,肥大化しがちなフォームを小さく設計できるメリットもあります.
フォームを複数ページに分割するには,ツールボックスの「改ページコントロール」ボタン(図8)を使って,分割位置を指定します.
表示するページを指定するには,フォームのGoToPageメソッドを使用します.サンプルではグループ内の選択されているボタンの番号(OptionValueプロパティで設定)を引数としてGoToPageメソッドに渡しています.
Private Sub Form_Load() BT1.OptionValue = 1 BT2.OptionValue = 2 BT3.OptionValue = 3 Group1 = 1 '初期状態でBT1を選択状態にする End SubPrivate Sub Group1_AfterUpdate() Me.GoToPage Group1 End Sub
図8:ツールボックスの「改ページコントロール」ボタン
図9A:1ページ目が表示された状態
図9B:2ページ目が表示された状態
図9C:3ページ目が表示された状態
図10:フォーム画面
<= オプショングループ(Group1) <= トグルボタン(BT1,BT2,BT3) <= 指定された改行位置 <= 指定された改行位置
対象となるレコードが,新規に挿入されたレコードか,既存のレコードかで,プログラミングの処理が大きくかわる場合があります.そのためにはカレントのレコードが新規に挿入されたレコードなのかどうかを判断して,コード内で条件分岐する必要があります.
カレントレコードが新規レコードかどうかは,フォームのNewRecordプロパティを使って調べることができます.サンプル(図11)ではBeforeUpdateイベントプロシージャでレコードの状態をハンドリングしてメッセージを表示しています.
Private Sub Form_BeforeUpdate(Cancel As Integer) If Me.NewRecord Then MsgBox "新規レコードを登録します" Else MsgBox "既存のレコードを更新します" End If End SubPrivate Sub Form_Current() If Me.NewRecord Then Text1 = "新規レコードです" Else Text1 = "既存のレコードです" End If End Sub図11:編集してレコードを移動すると,更新処理が行なわれる
↓
次号では初心者向けのテクニックをまとめて紹介する予定です.
VB Magazine ライブラリ | Visual Basicコースホームページ
int21 ホームページ | PCDN ホームページ
![]()