病院で処方された薬や病気についてわかりやすく解説します

VBA講座2-16  薬品名の重複チェックを行うコード~前編

ノートパソコンとハーブ

今回は医薬品データが重複しないようチェックをかけるコードを書きましょう。今回はちょっと難しいですが、頑張って下さいね。

スポンサーリンク

データの重複をチェックするコードを書く

 

前回は登録した医薬品データをワークシートに転記するコードを書きました。ただこれだけですとちょっとマズイんです。

 

vba2-16-1上の画像を見て下さい。

前回の講座と同じように医薬品の新規登録画面でアリセプトD錠5mgについて入力しました。

 

登録ボタンを押して「はい」を選ぶと、同じ内容にも関わらず押した分だけ後ろのワークシートにデータが転記されていきます。これではダメですね。

 

今回は医薬品名が重複した(既に登録されている)場合、「重複しています」とメッセージを表示するコードを書いていきましょう。

 

vba2-16-2その前に重複チェックを行うためにワークシートを1つ作ります。Sheet3を医薬品検索結果として下さい。

 

vba2-16-3続いて上の画像を見て下さい。

赤で囲った部分がVBA講座2-16でお話する内容。長くなるので青で囲った部分は次回お話します。それ以外の部分は前回の講座までに入力済みです。

 

重複チェックはこのようにイメージして下さい。

1.txtDnameに入力された文字列で、ワークシート医薬品マスタにフィルターをかける(ふるいにかけて抽出する)。
2.ふるいにかけた結果をワークシート医薬品検索結果に貼り付ける(コピーする)。

 

もしふるいにかけて抽出された医薬品があれば、それは既に登録済みの医薬品という事になりますね。それが医薬品検索結果に貼り付けられた場合は重複チェックがかかるように設定していきます。

 

ふるいにかけて残らなければ登録されていない医薬品名ということになるので問題なく新規登録ができるようにします。イメージ的にはこんな感じです。

CurrentRegionプロパティとClearメソッド

 

それでは1行ずつ解説していきましょう。

Dim DSearch As String
DSearch = txtDname.Text

これはもう慣れましたね?変数の宣言です。変数Dsearchを文字列と宣言する。変数DsearchはtxtDnameに入力されたテキストである。

 

Worksheets(“医薬品検索結果”).Activate

ワークシート医薬品検索結果をアクティブにする「アクティブにする≒選択する(タブをクリックする)」と考えて頂ければいいでしょう。

 

ActiveSheet.Range(“A1”).CurrentRegion.Clear

まずはCurrentRegionの説明をします。

 

例えば

Range(“A1”).CurrentRegion

の意味ですが、これは「A1セルを起点としてデータが入力されている範囲をまとめて選択する」という意味です。

 

vba2-16-4例えば上の画像のような感じですね。

A1セルをクリックし、クリックしたまま右下にカーソルを移動させ離すとこうなります。それでは実際使用する画面でいきましょう。

 

vba2-16-5上の画像ですが、わかりやすくするため、1行目のアリセプトD3mgと3行目のアリセプト細粒0.5は私が追加で入力しました。

 

列はN列まで、行は4行までデータが入力されていますね。

Range(“A1”).CurrentRegion

は、この場合A1~N4までを選択するという形になります。なので…

 

ActiveSheet.Range(“A1”).CurrentRegion.Clear

これは、「ActiveSheet(ワークシート医薬品検索結果)のA1セルを起点としてデータが入力されている範囲を選択してClearする。」という意味になります。

 

Clearは文字通りクリアする(消す)。Deleteを押すと思って頂いてOKです。

 

なぜこの作業が必要なのかわかりますか?

もし過去の検索結果が残っていた場合、まだ登録していない薬にも関わらず既に登録済みと認識される可能性があるからです。

AutoFilterメソッド

 

vba2-16-6上の画像でA列をアリセプトD5mgでフィルターをかけるとしたらどういうふうに行いますか?

 

A1セルをクリックして、「並び替えとフィルター → フィルター」を選択します。

 

vba2-16-7A1セル(薬品名)の右側の下矢印をクリックすると下に小窓が現れます。アリセプトD3mg、アリセプト細粒0.5%のチェックを外してOKを押します。

 

vba2-16-8アリセプトD5mgのみが抽出されました。これをコードで書きますと…

With Worksheets(“医薬品マスタ”)
.Range(“A1″).AutoFilter field:=1, Criteria1:=”アリセプトD錠5mg”

となります。

 

「AutoFilter」は”フィルターをかけて抽出する”こと。「Field:=1」は”1行目”という意味。「Criteria1:=”アリセプトD錠5mg”」はフィルターをかける文字列を”アリセプトD錠5mg”で。

 

つまり

With Worksheets(“医薬品マスタ”)
.Range(“A2”).AutoFilter field:=1, Criteria1:=Dsearch

「変数Dsearchに入っている文字列で1行目にフィルターをかけて抽出する」という意味になります。

 

では次

.Range(“A1”).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets(“医薬品検索結果”).Range(“A1”)

長ったらしいのが出てきました。

 

まず真ん中付近のSpecialCells(xlCellTypeVisible)。これは一言で言えば「フィルターにかけて抽出されたもの」です。基本英語なのでなんちゃってでいいから訳していけばわかりますよ。

 

Special cellsは「特別なセル」そのType(タイプ)は「Visible(目に見えている)セル」つまり「抽出されているセル」のような感じで。

 

まとめると、withで省略されていますが、「(ワークシート医薬品マスタの)A1セルを起点としてデータが入力されている範囲をまとめて選択、その中でフィルターにかけて抽出され見えている部分を選択し、ワークシート医薬品検索結果のA1セルに貼り付けるという意味です。」

 

ちょっとくどい説明になりましたが、省略せずに書くとこういう意味になります。

 

長くなりましたので今回はこの辺にしましょう。お疲れ様でした。次回は重複チェックの後半を説明します。
次の講座

スポンサーリンク

こちらの記事もおすすめです

関連記事

サイト内検索