データベースを使っていると、確実にデータの検索や抽出と言ったことが必要になります。
マイクロソフトアクセス(Access)の場合は、クエリーという機能を使って、その機能が簡単に実現することができるのですが、その他にも方法があります。
今回は、その数種類のテクニックの解説をしてみたいと思います。
マスタテーブルをフォーム設定
私もAccessというソフトを使い始めた頃は、データを蓄積するテーブルを作成したら、そのままフォームウィザードを使って、テーブルをフォームに起していました。
これは、これで間違いでも何でもないのですが、直接マスタデータに触れるので人的ミスが直接起きやすいという欠点があります。
以前、下記の内部リンクサイトのように直接テーブルを入力フォームにした時のサンプルを使って進めていきます。
関連
https://pctips.jp/pc-soft/access-howto2019-1/
クエリーを使って検索・抽出
VBAなどのコードを使わずに実現可能なのが、クエリーを使う事だと思う。
例として、氏名を検索する方法をやってみたいと思います。
(1)フォームに非連結の検索窓を設置
サンプルの「住所データ」テーブルをフォームにした「入力画面」というフォームに非連結のテキストボックスを設置して名前を「名前検索窓」としてみました。
名前という日本語を検索する窓になりますので、途中のIME入力モードの設定にて、「ひらがな」に設定しておいてください。
メモ
後からプロパティシートの方から変更してもOK
(2)クエリを作成する
次にメニューバーから、「作成>>クエリウイザード>>選択クエリウイザード」と進んでいき、テーブルに「住所データ」を選択します。
途中クエリ名を「氏名検索」とでもしてクエリ編集モードに移動してください。
(3)クエリの[氏名]の抽出条件の場所で、右クリックして「ビルド」を選択
(4)抽出条件に、入力画面フォームの「氏名検索窓」を設定
(5)クエリを試す
クエリを保存すると、左側のナビゲーションバーの位置に、「氏名検索」というクエリが出来上がっていますので試してみましょう。
フォームの「入力画面」を表示モードに変更して、「氏名検索」窓に「埼玉 次郎」と3レコード目の氏名を入れてから、クエリの「氏名検索」をダブルクリックすると動きます。
あとは、この「氏名検索」クエリをフォームにすればOKだし、印刷物にしたいなら、レポートにすればいいのです。
ちなみに、「埼玉」だけに絞りたいとかの検索の場合は、Like関数を使うと便利です。
Like "*" & [Forms]![入力画面]![名前検索窓] & "*"
以前は、私もこの方法しか知らなかったので、こればかりやっていましたが、テーブルのデータが複雑になって行ったり、リレーションを組んでいたりすると、頻繁にエラーがでます。
また、クエリにクエリを設定したりすると、データの更新が出来ない場合があります。
そこで、次の方法が出てきます。
VBAを使ってフィルター検索・抽出
VBAなんていうコードを見ただけで嫌気がさす私でしたが、設定方法だけしっておけば使いまわしできます。
そして、なんといってもシンプルにすることができるので助かります。
やることは、簡単、「入力画面」フォームの「氏名検索窓」の更新後処理に下記のVBAコードを書き込むだけ。
Private Sub 名前検索窓_AfterUpdate()
Me.Filter = "氏名 like'*" & Me.名前検索窓 & "*'"
Me.FilterOn = True
名前検索窓 = Null
End Sub
実際に試して分かると思いますが、クエリーで抽出して新たにフォーム画面を作るよりも、簡単に目的のデータ検索ができるので便利な機能です。
実際、「埼玉」であいまい検索したので、下記の図のように2件がフィルターされてみることができました。そして、VBAにて、「名前検索窓」にNullを設定したので、検索後は空になり次の入力待ちをするようになりました。
また、フィルターでの検索・抽出は、フィルター解除すれば全データがでてくるような仕組みになっています。
VBAでレコードソース検索
VBAで検索抽出させる方法は沢山あります。
今度は、レコードソースを使って検索・抽出する方法です。
VBAの設定の仕方はフィルターを使った時と同じで、「氏名検索窓」の更新後処理にて、下記のVBAコードを記入するだけです。
Private Sub 名前検索窓_AfterUpdate()
Dim stCD As String
stCD = DCount("*", "住所データ", "氏名 Like '*" & 名前検索窓 & "*'")
If stCD = 0 Then
MsgBox "検索されたデータは存在しません。ご確認ください。"
名前検索窓 = Null
Me.名前検索窓.SetFocus
Exit Sub
Else
Me.RecordSource = "Select * From 住所データ Where 氏名 Like '*" & Me!名前検索窓 & "*'"
名前検索窓 = Null
End If
End Sub
フィルターでデータを抽出している訳ではなく、フォームのレコードソース自体を抽出表示しているので、フィルター処理はしていません。
このように簡単に目的のデータを検索し、抽出させることが可能なのです。
今回は、フォームでやってみましたが、レコードソースの場合は、レポートなどにも応用できそうですね。
コード嫌いの自分ですが、動作速度やシンプルさを考えると、このコード丸ごと覚えて使った方が楽だと思います。
非連結テキストボックス検索
上のフォームでの、検索・抽出方法は、テーブルを直接操作しているので、
注意ポイント
人的ミスによりデータの変更が簡単にできる
という危険性もあります。
そこで、フォームには、直接テーブルのソースを設定するのではなく、非連結テキストボックスをフィールド数だけ設置して、その都度、データを呼び出すという方法がとられる場合があります。
複数人の同時アクセスする場合は必須
その流れとしては、
- データを検索
- 検索したデータをレコードセットやDlookupなどでテキストボックスに表示
- 更新したい場合は、ワンクッション置いてVBAやクエリにて処理
スタンドアロン(PC1台)で処理するような場合は、この対策は特に考える必要は低くなりますが、複数人でテーブルに同時アクセスするような場合は確実に対策しなければならないことになります。
この内容においては、詳細を別の機会にやりたいと思います。