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

スポンサーリンク

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

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

 

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

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

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

 

Dim TargetRow As Integer

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

 

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

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

 

そして=の右側。

 

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

 

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

 

これは「1つ下」という意味です。(2)なら「2つ下」。後ろに「.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以下も同じように入力して下さい。

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

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

 

このように書いていきまして…最後の行です。

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

同効薬の4つ目が転記されます。

 

この後には「End With」を入れるのを忘れずに。エラーが発生します。それではF5を押して実行してみましょう。

スポンサーリンク

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

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

 

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

 

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

 

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

 

データが登録されましたね。

※今回見やすいように列の幅を一部拡げていますが、皆さんはしなくても大丈夫です。

 

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

 

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

 

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

 

次回は医薬品が重複して登録されないようにチェックするコードを書いていきます。

>>Excel VBA講座 目次へ