今回は医薬品データが重複しないようにチェックをかけるコードを書きましょう。

 

今回はちょっと難しいですが、頑張ってついてきて下さいね。

スポンサーリンク

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

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

 

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

 

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

 

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

 

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

 

続いて上の画像を見て下さい。赤で囲った部分が今読んで頂いているVBA講座2-16でお話する内容になります。

 

実はその下の青で囲った部分も書く必要があるのですが、長くなるので青で囲った部分は次回のVBA講座2-17でお話します。

 

それ以外の部分は前回の講座までに入力済みです。

 

医薬品データの重複チェックは以下のようにイメージして下さい。

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

もし「ふるいにかけて抽出された医薬品があれば、それは既に登録済みの医薬品である」という事になりますね。

 

ふるいにかけて抽出された医薬品データが医薬品検索結果に貼り付けられた場合は、重複チェックがかかるように設定していきます。

 

ふるいにかけて残らなければ、登録されていない医薬品名ということになるので問題なく新規登録ができるようにします。

 

大体のイメージが湧きましたでしょうか?

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

Dim DSearch As String
DSearch = txtDname.Text

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

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

それでは赤く囲った部分を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セルをクリックし、クリックしたまま右下にカーソルを移動させてC6セルで離すとこうなります。他にもA1セルをクリックして、その状態で「Ctrl+A」でもOKです。

 

それでは実際使用する画面でいきましょう。

 

上の画像ですが、わかりやすくするため、1行目のアリセプトD3mgと3行目のアリセプト細粒0.5は私が追加で入力しました。みなさんも同じように入力してください。

 

画像では空欄の部分も含め、列はN列まで、行は4行目までデータが入力されていますね。

Range(“A1”).CurrentRegion

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

 

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

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

 

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

 

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

 

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

 

新たに検索するために、一度まっさらにした状態にする必要があるということですね。

スポンサーリンク

AutoFilterメソッド

上の画像を見てください。この時、A列を「アリセプトD錠5mg」でフィルターをかけるとしたら、どのように行うかご存知ですか?

 

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

 

vba2-16-7A1セル(薬品名)の右側の下矢印をクリックすると下に小窓が現れます。

 

すべてにチェックが入っている状態だと思いますが、アリセプトD錠3mg、アリセプト細粒0.5%のチェックを外してOKを押します。

 

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

 

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セルに貼り付ける」

という意味になります。

 

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

 

長くなりましたので今回はこの辺にしましょう。お疲れ様でした。

 

次回は今回に続き、重複チェックの後半について解説します。

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