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 Sub
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 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 Sub
Private 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 Sub
Private Sub Form_Current()
  If Me.NewRecord Then
      Text1 = "新規レコードです"
  Else
      Text1 = "既存のレコードです"
  End If
End Sub

図11:編集してレコードを移動すると,更新処理が行なわれる


[ 目次へ ] [ タイトルへ ]


 次号では初心者向けのテクニックをまとめて紹介する予定です.


Microsoft Accessはパーソナルなデータベースマネージメントシステム?
 Microsoft Accessはパーソナルなデータベースマネージメントシステムと呼ばれています.ですが,1つのMDBファイルを共有することで,マルチユーザー環境でも利用することができます.
 ほんの数年前までは,パーソナルコンピュータによるマルチユーザーデータベースシステムといえば,このようなファイル共有型のデータベースが一般的でした.それが低価格なサーバー型データベースの普及によって,パーソナルコンピュータでも,C/S型の構成をとるのが一般的になってきました.ネットワークトラフィックの軽減やデータベースの一元管理などのメリットを考えれば,これは当然の流れだといえます.しかし,高速なネットワークインフラが確保できる場合やトラフィックの状態によっては,サーバーに負荷の集中するC/Sシステムよりも,処理を各クライアントに分散できるファイル共有型の方が高速に動作する場合があります.また,データベースサーバーはSybase SQL Anywhereなどの例外を除いて,メインテナンスのためのスキルやコストが必要になります.中小企業や部門サーバーのように,専任の担当者が確保できないようなケースでは,結局,Accessのようなメンテナンスコストの低いデータベースの方が稼働率が高くなることもあります.

[ 目次へ ] [ タイトルへ ]


VB Magazine ライブラリ | Visual Basicコースホームページ
int21 ホームページ | PCDN ホームページ


PCDN LOGO