第4章は今回の講座で最後となります。今回はちょっと内容的に難しいかもしれませんが、ここまで到達した皆さんなら理解できると思います。

 

更新ボタンを押した時の処理を書いていきますが、前回同様コピー・アンド・ペーストで結構作業を省略できますので最大限利用していきます。それではいきましょう。

スポンサーリンク

更新ボタンの処理

 

vba4-3-1ではまず更新ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba4-3-2上のようにコードが表示されました。さて、更新ボタンを押した時にどういった処理を行えばよいか考えましょう。

 

1 「本当に更新していいか」の確認メッセージの表示
2 「はい」を押したら該当の医薬品情報を更新する
3 医薬品データをソートする
4 リストボックス、コンボボックス、テキストボックスの初期化
5 (次の検索に備え)txDsearchにカーソルを合わせる

こんな感じですね。基本的には医薬品削除と大きくは変わりません。

 

vba4-3-3まず削除ボタンの処理で書いたコードを一部使用します。上の画像を参考にコピーして下さい。

 

vba4-3-4そして更新ボタンのコードの部分に貼り付けます。このままだとダメなので…

 

vba4-3-5「削除 → 更新」に訂正します。また削除の時よりは注意は柔らかくして「vbCritical → vbExclamation」に変更して下さい。確認メッセージボックスについてはこれでOKです。続いてデータ更新のコードを書きます。

 

vba4-3-6上の画像はデータを削除する時のコードの途中までのものですね。これが示す意味をもう一度確認していきましょう。

 

Dim TargetRow As Integer, Kensaku As String

「変数TargetRowを整数、変数Kensakuを文字列と宣言する」

 

Kensaku = txtDname.Text

「変数KensakuにはtxtDnameのテキストを入れる」

 

.Range(“A1”).AutoFilter field:=1, Criteria1:=Kensaku

「ワークシート医薬品マスタの1行目に変数Kensakuの値でフィルターをかけて抽出する。」

 

TargetRow = .Range(“A65536”).End(xlUp).Row

「変数TargetRowはワークシート医薬品マスタのA65536セルから上に向かってぶつかった行である。」ここまではいいですね。

 

更新する医薬品のデータは既に抽出されており、その行数は変数TargetRowの値であることがわかります。

 

つまり、変数TargetRow行の値を修正・削除画面で入力されているデータで上書きしてあげれば、医薬品情報が更新されることになります。これもコピーアンドペーストでいけるんですよ。

 

vba4-3-7frmDRegistのコードを表示します。

 

vba4-3-8医薬品の登録ボタンのコードを上の画面を参考にガッツリコピーしちゃって下さい。そのまま先ほどの更新ボタンの後に貼り付けます。

 

vba4-3-9以上で先ほどの1~4はほぼ完成しました。ただリストボックスを空欄にするコードはまだ書いていません。リストボックスのクリアは「lstKouho.clear」を追加します。

 

5についてはtxDSearchにカーソルを合わせるコード「txDSearch.SetFocus」を入れて終了です。

 

それではメニュー画面から医薬品修正・削除画面を呼び出せるように設定しましょう。

 

vba4-3-10メニュー画面を開いて、修正・削除ボタンをダブルクリック。または右クリックからコードの表示。

 

vba4-3-11ここに

frmDCorrect.Show

を追加します。

 

これで修正・削除ボタンを押すと、医薬品修正・削除画面が起動するようになります。

「やったー完成だ!」と言いたい所ですが、一つ問題が。このシステムには検索用の医薬品コードは設けていません。上書きする医薬品を医薬品名でフィルターをかけ、抽出しています。

 

そのため、医薬品情報の修正・削除画面でtxtDname、つまり医薬品名を変更されると上書きする医薬品を検索することができなくなってしまいます。

 

ではどうしたらいいでしょうか?

 

リストボックスでクリックした医薬品名(変更される前)の値をどこかに保存しておき、更新ボタンを押した時にその値で上書きする医薬品を抽出すればいい事がわかりますね。

 

医薬品名の保存方法にはいくつか方法がありますが、今回は一番わかりやすい方法でいきましょう。

 

その方法とは「空いているワークシートのセルに値を入れておき、フィルターをかける時に利用する」というものです。

 

この方法を見て馬鹿にする方もいるかもしれませんが、これが一番わかりやすくかつ確実です。

スポンサーリンク

 

vba4-3-12ではワークシートを一つ作成します。シート名は予備とでもしましょうか。

 

vba4-3-13ワークシート予備のA1セルにfrmCorrect更新時検索用と入力して下さい。後で何かわからなくなる可能性がありますからね。そしてB1セルに医薬品名を保存することにします。

 

vba4-3-14それではまずlstKouhoのコードを見て下さい。

 

上から5行目に

Worksheets(“予備”).Range(“B1”) = txtDname.Text

を追加します。これでワークシート予備のB1セルに医薬品名が保存されますね。

 

vba4-3-15続いて更新ボタンのコードを見て下さい。画面一番下に「Kensaku = txtDname」という部分があるかと思いますが、これを…

txtDnameをWorksheets(“予備”).Range(“B1”).Value

に変更します。

 

これで更新前の医薬品名で検索されますので、きちんと上書きされるようになります。

 

最後にもう一つコードを追加しなければなりません。それは変更した医薬品名が重複していないかをチェックするコードです。ただこれは他のユーザーフォームで既に書いています。コピペしちゃいましょう。

 

vba4-3-16frmDRegisterの上の画像の部分です。これをコピーして…

 

vba4-3-17更新ボタンのコードに貼り付けます。よく見ると重複しているコードがありますね。

 

vba4-3-18上の画像の「With Worksheets(“医薬品マスタ”)」と「End With」は既に書かれており重複しますので削除します。そして「Criteria1:=DSearch」を「Criteria1:=Kensaku」に変更します。

 

vba4-3-19後は「Kensaku = txtDname」を上の画像を参考に追加して下さい。これで医薬品情報変更後の医薬品名重複チェックと上書きする医薬品の抽出、上書きを行うコードが完成しました。

 

ようやくこれでOK…ではないんです!「まだあるのかよ?」って方、あるんです。

 

このままですと、医薬品名は変更せずそれ以外の一般名等を変更した時、毎回必ず「医薬品が重複しています!」とメッセージボックスが表示されてしまいます。

 

ではこのメッセージボックスの表示に条件を付けてあげましょう。このメッセージボックスは医薬品名の重複がある時、つまりtxtDnameの値が既に登録されている医薬品の中にある場合にのみ表示させたいわけです。

 

ということは、ワークシート予備に保存された医薬品名と変更後の医薬品名(txtDname)が異なる時だけ表示すればいいですよね。同じ場合は医薬品名を変更していないという事になりますのでメッセージボックスを表示する必要がありません。

 

では早速コードを書いていきましょう。下の画像を見て下さい。

 

vba4-3-20

Kensaku = Worksheets(“予備”).Range(“B1”).Value

をIfステートメントの上に移動します(切り取り→貼り付け)。問題はその後です。

 

vba4-3-21上が完成形です。Ifの中にもう一つIfが入っていますね。Ifステートメントは何個でも追加することができます。条件を複数付けたい場合はその分だけ追加して下さい。ただしその数だけEnd Ifをつけるのも忘れずに。

 

If Kensaku <> txtDname.Text Then

「もし変数Kensaku(ワークシート予備のB1の値)とtxtDnameのテキストが異なるならば」

 

これはつまり「医薬品名を変更したならば」と同義ですね。その場合に「医薬品名が重複している」メッセージボックスを表示するとなります。

 

実際に起動してきちんと動作するか確認してみて下さい。ようやく医薬品情報の修正・削除画面の完成です。

 

説明が長くてウンザリしたかもしれませんが、あえてそうさせて頂きました。今回のように「コードを書く、問題が浮上する、その問題の原因を突き止めて修正する」この作業が非常に大切なんです。

 

そうすることで応用が効くようになります。それでは今回はここで終了です。お疲れ様でした。次回からいよいよ最終章、第5章に突入です。

>>Excel VBA講座 目次へ