第4章は今回の講座で最後となります。

 

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

 

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

 

それではいきましょう。

スポンサーリンク

医薬品情報更新ボタンの処理

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

 

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

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

こんな感じですね。

 

基本的には医薬品を削除する時と大きくは変わりません。

 

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

 

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

 

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-7frmDRegisterのコードを表示します。

 

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

 

vba4-3-9

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

以上で1~4はほぼ完成しました。

 

ただ4のリストボックスを空欄にするコードはまだ書いていません。リストボックスのクリアは

lstKouho.clear

を追加すればOK。

 

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

に変更します。

 

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

 

最後にもう一つだけコードを追加しなければなりません。

 

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

スポンサーリンク

医薬品名の重複チェックを行うコード

 

frmDRegisterの登録ボタン(btnRegister)のコード、上の画像の赤枠で囲った部分です。これをコピーして…

 

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

 

vba4-3-18上の画像の「With Worksheets(“医薬品マスタ”)」「End With」は既に上の部分で書かれており重複しますので削除します。

 

そして「Criteria1:=DSearch」「Criteria1:=Kensaku」に変更します。

 

vba4-3-19後は

Kensaku = txtDname

を上の画像を参考に追加して下さい。

 

これで医薬品情報変更後の医薬品名重複チェックと上書きする医薬品の抽出、上書きを行うコードが完成しました。

 

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

 

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

 

ではこのメッセージボックスの表示に条件を付けてあげましょう。

 

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

 

ということは、ワークシート予備に保存された医薬品名と変更後の医薬品名(txtDname)が異なる時だけ表示すればいいですよね。

 

同じ場合は医薬品名を変更していないという事になりますので、メッセージボックスを表示する必要がありません。

 

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

 

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

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

 

vba4-3-21

上の画像の赤枠で囲った部分

If Kensaku <> txtDname.Text Then

End If 

を追加します。

 

Ifの中にもう一つIfが入っていますね。実はIfステートメントは何個でも追加することができます。

 

条件を複数付けたい場合はその分だけ追加して下さい。ただしその数だけ「End If」をつけるのも忘れずに。

 

If Kensaku <> txtDname.Text Then

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

 

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

 

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

 

説明が長くてウンザリしたかもしれませんが、あえてそうさせて頂きました。

 

今回のように「コードを書く、問題が浮上する、その問題の原因を突き止めて修正する」この作業が非常に大切なんです。そうすることで応用が効くようになります。

 

それでは今回はここで終了です。お疲れ様でした。

 

次回からいよいよ最終章、第5章に突入です。

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