今回は医薬品名で検索するコードを書いていきます。

 

医薬品新規登録画面で、医薬品名の重複チェックを行うコードを書きましたね。

 

そこで使用したAutoFilterメソッドの応用になります。それではいきましょう。

スポンサーリンク

AutoFilterメソッドの応用~部分一致検索

vba3-4-1

Dim Kensaku As String
Kensaku = txDSearch.ValueWorksheets(“医薬品検索結果”).Activate
ActiveSheet.Range(“A1”).CurrentRegion.ClearWith Worksheets(“医薬品マスタ”)
.Range(“A2″).AutoFilter field:=1, Criteria1:=”=*” & Kensaku & “*”
.Range(“A1”).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _
Worksheets(“医薬品検索結果”).Range(“A1”)
End WithIf Worksheets(“医薬品検索結果”).Range(“A2”) = Empty Then
MsgBox “その医薬品の採用はありません。”, vbExclamation, “確認”
txDSearch.SetFocus
Exit Sub
End If

これが完成形です。それでは順番に解説していきましょう。

 

Dim Kensaku As String
Kensaku = txDSearch.Value

「変数Kensakuを文字列と宣言する」
「変数KensakuにはtxDSearchの値を入れる」

※Valueの代わりにTextでも可

変数の宣言は何度もやっていますので、これはもう大丈夫ですね。

 

Worksheets(“医薬品検索結果”).Activate
ActiveSheet.Range(“A1”).CurrentRegion.Clear

これはフィルターを掛ける前の処理。医薬品新規登録画面でやりましたね。

「ワークシート医薬品検索結果をアクティブにする≒選択する(タブをクリックする)」
「アクティブシートのA1セルを起点として隣接する入力された範囲をクリア(値を削除)する。」

 

With Worksheets(“医薬品マスタ”)
.Range(“A2″).AutoFilter field:=1, Criteria1:=”=*” & Kensaku & “*”
.Range(“A1”).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _
Worksheets(“医薬品検索結果”).Range(“A1”)
End With

今回の講座はここがキモです。ちょっと検索方法について考えてみましょう。

スポンサーリンク

検索方法を設定する

処方オーダリングシステムであれば誤入力防止のために、先頭一致かつ3文字以上入力してヒットするように設定されているケースが多いと思います。

 

例えば抗菌薬(抗生物質)の塩酸バンコマイシン散0.5g「マイラン」があるのですが、これを検索する場合、基本的に「エンサ」「塩酸バ」等で入力する必要があります。

 

これって結構面倒くさいんですよね。これ「バンコ」とかで検索したくないですか?

 

薬品名だけでなく、識別記号にしてもアルファベットを入れず、数字だけで検索したい時もあるかと思います。

 

例えば糖尿病治療薬のキネダック錠50mgの識別記号は「ONO 601」。これを「601」で検索したい場合もあるでしょう。

 

今回は処方オーダリングシステムではなく、持参薬鑑別システムということで利便性を優先したいと思います。

 

つまり先頭一致ではなく、部分一致で検索できるようにしましょう。更に1文字から検索可能に設定します。これで大幅な時間短縮にもつながります。

 

具体的には、塩酸バンコマイシン散0.5g「マイラン」の場合、「塩酸」でも「バンコ」でも「マイシン」でも「マイラン」でも「バ」でも検索可能にするということです。

 

それでは先ほどのコードに戻りますね。以下を翻訳すると…

With Worksheets(“医薬品マスタ”)
.Range(“A2″).AutoFilter field:=1, Criteria1:=”=*” & Kensaku & “*”
.Range(“A1”).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _
Worksheets(“医薬品検索結果”).Range(“A1”)
End With

「変数Kensakuに入っている文字列(txDSearchで入力した文字列)でワークシート医薬品マスタの1行目にフィルターをかけ、部分一致するものを抽出し、ワークシート医薬品検索結果のA1セルに貼り付ける」という意味になります。

 

完全一致の場合は「Criteria1:=Kensaku」でいいんです。ですがそうなると、先ほどの塩酸バンコマイシン散0.5g「マイラン」の場合、先頭の「塩」から入力しないとヒットしません。

 

そんな面倒臭いことやってられませんよね。持参薬鑑別ってただでさえ結構時間がかかりますから。

 

ちなみに部分一致の時は「Criteria1:=”=*” & Kensaku & “*”」このように書く必要があります。

 

部分一致検索するときは「*(アスタリスク)」で囲む。これは理屈抜きに覚えちゃいましょう。

 

If Worksheets(“医薬品検索結果”).Range(“A2”) = Empty Then
MsgBox “その医薬品の採用はありません。”, vbExclamation, “確認”
txDSearch.SetFocus
Exit Sub

これはもう既にやりましたね。

 

「もしワークシート医薬品検索結果のA2セルが空欄ならば、その医薬品の採用はありません、とメッセージボックスに表示する(枠に確認と表示)。そしてtxDSearchにカーソルを合わせる。」となります。

 

フィルターをかけてA2セルが空欄ならば、採用がない事を意味します。

 

その場合は入力し直すわけですから、txDSearchにカーソルを合わせてあげるとシステム利用者が助かる、ということですね。

 

何度も言いますが、システムを作る時は常に使う人のことを考えて。思いやりが大切です。

 

それでは今回はこれで終わりにしましょう。お疲れ様でした。

 

次回は検索結果をリストボックスに表示するコードについて解説します。

>>Excel VBA講座 目次はこちら