MS Access Tips/Sample and VBA and Blog customize etc...

オプショングループで50音選択 高速版

50音選択ボタン

フリガナで50音選択するボタンを以前、下記で紹介しました。

オプショングループで50音選択 改良版

インデックを有効利用できなないものだったので、インデックスを利用できるものに改良しました。

機能的にはまったく同じなんですが、レコード件数が多い場合、対象フィールドにインデックスを設定しておくと、抽出が高速になります。

難易度:

インデックスを有効にするには

フィールド名 Like "ア*"

というような先頭一致の場合はインデックスが有効になり高速に抽出できるというのは、常識です。

アイウエオで始まるデータを抽出する場合は、

フィールド名 Like "[ア-オ]*"

と記述できますが、これも先頭一致なのでインデックスが利用できると思い込んでいました。ところが、下記の掲示板のスレッドでのMukkuMukuさんの投稿で、[] で囲むと有効にならないとの指摘を受けました。

全角カタカナの「ノ」の字で始まるデータが読み出せない(ヒットしない)。 - マイクロソフト コミュニティ

実行計画をみて確認していますので間違いないでしょう。ちなみに、実行計画をみて、フルスキャンなのか、インデックスが使われているか、を確認する方法は、下記にあります。

ACCESS(MDB)の実行計画を見る方法 - seraphyの日記

では、複数の値で先頭一致抽出する場合、インデックスを使用するにはどうすばいいかというと、これも、上記のMukkuMukuさんの投稿で、不等号を使う方法を提案しています。

フィールド名 >= "ア" AND フィールド名 < "カ"

これで、アイウエオで始まるデータをインデックスを使用して高速に抽出できます。

50音抽出関数

以前の記事では、Like を使ったインデックスを利用しないものになっていたので、不等号を使うものに変更したのが下記のものです。

標準モジュールに下記のコードをコピーして貼り付けます。

2015.04.08追記: サブフォームで使用するとエラーになるバグの対処としてScreen.ActiveForm を CodeContextObject に置換しました。
ただし、「分割フォーム」の場合エラーがでますので CodeContextObject は Screen.ActiveForm に置換してください。

使用方法

下記のサンプルデータベースファイルをダウンロードして、フォームをデザインビューで開きます。オプショングループを2つ(op50音選択 と op段選択)をコピーして、利用したいフォームに貼り付けます。

それぞれのオプショングループの更新後処理に設定してある関数の引数を抽出対象フィールド名に変更します。もし、フィールド名がフリガナだったらそのままで結構です。

設定例

オプショングループ「Op50音選択」の更新後処理
=fnc50音選択("フリガナ")

オプショングループ「op段選択」の更新後処理
=fnc段選択("フリガナ")

サンプルファイルが下記からダウンロードできます。
Frm50OnSelect3_07.zip (Access 2007-2010 形式 - 34kb)
Frm50OnSelect3.zip (Access 2002-2003 形式 - 32kb)
Frm50OnSelect3_2k.zip (Access 2000 形式 - 32kb)

拍手する

2 Comments

湘南JUN says..."cb部署選択"

Option Compare Database
Option Explicit

Private Sub cb部署選択_AfterUpdate()
Me.Requery
End Sub

について、お伺いします。
Private Sub cb歌手選択_AfterUpdate()
にしたいのですが作動しません。
どこをどうしたら作動しますか。教えて下さい。

2015.08.18 17:13 | URL | #v6af..5Y [edit]
hatena says..."re:cb部署選択"

サンプルファイルにあるコードですね。
そのコードは、元のファイルのコードの消し忘れで、何も機能していません。

具体的に何をしたいのか説明してください。

2015.08.20 11:22 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/410-31b5a7bd
該当の記事は見つかりませんでした。