今回は「ユーザーフォームに登録した医薬品データをワークシートに転記するコード」を書いていきます。

 

それではいきましょう。

スポンサーリンク

上下のセルを参照するoffset()プロパティ

vba2-15-1上の画像の赤枠の部分が今回書くコードになります。VBA講座2-14で書いた「医薬品新規登録の最終確認のコード」の下に書きます。

 

With Worksheets(“医薬品マスタ”)
Dim TargetRow As IntegerTargetRow = .Range(“A65536”).End(xlUp).Offset(1).Row.Range(“A” & TargetRow).Value = txtDname.Text
.Range(“B” & TargetRow).Value = txtGname.Text
.Range(“C” & TargetRow).Value = txtKigou.Text
.Range(“D” & TargetRow).Value = txtEffect.Text
.Range(“E” & TargetRow).Value = cboKubun.Value
.Range(“F” & TargetRow).Value = cboTani.Value
.Range(“G” & TargetRow).Value = txtSei1.Text
.Range(“H” & TargetRow).Value = txtSei2.Text
.Range(“I” & TargetRow).Value = txtSei3.Text
.Range(“J” & TargetRow).Value = txtSei4.Text
.Range(“K” & TargetRow).Value = txtKou1.Text
.Range(“L” & TargetRow).Value = txtKou2.Text
.Range(“M” & TargetRow).Value = txtKou3.Text
.Range(“N” & TargetRow).Value = txtKou4.TextEnd With

1行ずつ解説していきます。

With Worksheets(“医薬品マスタ”)

まずはwithステートメント。Worksheets(“医薬品マスタ”)を省略する目的で使用します。

 

Dim TargetRow As Integer

続いて変数の宣言。変数TagetRowを整数と宣言します。なぜ整数かは追々わかりますので、このまま読み進めて下さい。

 

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

まず=の左側の意味は…「変数TargetRowは」ですね。

 

そして=の右側。

 

採用区分と単位のコンボボックスにワークシートの値を読み込ませる所で、「最終行の取得」についてお話しましたね(VBA講座2-11参照)。

 

ただ今回はOffset(1)というのが入っています。これが非常に重要なポイントです。

 

Offset(1)は「1つ下」という意味です。

 

(2)なら「2つ下」。後ろに「.Row」が付いていますので、「Offset(1).Row」は「1つ下の行」となります。

 

withで省略されていますが、「Worksheets(“医薬品マスタ”)のA65536のセルから上に向かってぶつかった行の1つ下の行」という意味です。

 

なぜこのように書く必要があるのでしょうか?

 

もしこのoffset(1)を入れないと、ぶつかった行を上書きしてしまう事になります。なのでぶつかった行の一つ下の行にデータを登録していくんですね。

 

vba2-15-2上の画像を見て下さい。

 

まだ医薬品データが一つも登録されていない状態です。この状態では上に向かってぶつかった行は1行目ですよね?

 

それの1つ下ですから2行目に登録されるという事です。もしoffset(1)を入れないと1行目の見出しに上書きされてしまいます。わかりますか?

 

次にいきましょう。

.Range( “A”&TargetRow).Value = txtDname.Text

「ワークシート医薬品マスタのA列、変数TargetRow行の値はtxtDnameに入力されたテキストである。」

 

1行に1個の医薬品データを登録していきます。薬品名はA列になりますね。

 

なぜ行を変数にするのかわかりますか?

 

登録する行はぶつかった行の一個下ということになるので、行は既に登録されている薬の数により変わるので、TargetRowと変数にするわけです。

 

txtGname以下も同じように入力していきます。成分名はB列になりますね。

.Range( “B”&TargetRow).Value = txtGname.Text

「ワークシート医薬品マスタの(B列、変数TargetRow行)の値はtxtGnameに入力されたテキストである」となります。これで一般名が転記されます。

 

最後の行です。

.Range( “N”&TargetRow).Value = txtKou4.Text

これで同効薬の4つ目が転記されるようになります。

 

最後に「End With」を入れるのを忘れずに。エラーが発生します。

 

それではF5を押して実行してみましょう。

スポンサーリンク

実際に登録されるかチェックしてみよう

上の画像のように入力してみてください。

 

今回は「アリセプトD錠5mg」を入力しました。あなたが勤務する病院には採用がなく、後発品の「ドネペジルOD錠5mg「JG」」の採用があるという設定です。

 

では「登録ボタン」を押して、「はい」をクリック。

 

ユーザーフォームの後ろに表示されているワークシートの2行目に注目!

 

データが登録されましたね。今回見やすいように列の幅を一部拡げていますが、しなくてもOKです。

 

ここで1つ注意です。データを登録する際は、全角か半角か必ずどちらかに統一して入力するようにして下さい。

 

例えばアリセプトD錠3mgとアリセプトD錠3mgは別の医薬品と認識されてしまいますので、同一の医薬品が複数登録される可能性があります。

 

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

 

次回もこれまた重要なポイント。医薬品が重複して登録されないようにチェックするコードを書いていきます。

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