今回はfrmInputを開いた時に、鑑別報告書のワークシートを初期化するコードを書いていきます。

 

具体的には値を入力するセルを空欄にする、または初期値を入れる動作ですね。

 

前に作成した鑑別書のデータが残っていると大変です。

 

例えば前の患者AさんのデータがNo1~5まで入っており、次の患者BさんのデータがNo1~4までだった場合、AさんのNo5の薬品がBさんのシートに載ってしまいます。

 

これに気付かなければインシデントレポート提出確定です(笑)。

 

それではいきましょう。

スポンサーリンク

鑑別報告書のワークシートの初期化

VBA講座5-3でダウンロードした鑑別報告書のワークシート「印刷シート」を見ながら読み進めて下さい。

 

vba5-7-1例えばD3セルは患者ID、D4セルには患者名(カナ)が入りますよね。これを空欄にする場合一番簡単な方法は、

Range(“D3”) = “”
Range(“D4”) = “”

になります。

 

しかしこの方法だと数が少ない場合はいいですが、今回のように医薬品名や用法、残数などのセルも全て同様に行うとコードがものすごく長くなり、非常に見づらくなってしまいます。

 

そこで今までに書いたコードをちょっと応用して、なるべく短くなるように書いてみましょう。

 

vba5-7-2

With Worksheets(“印刷シート”)

.Activate

.Range(“D3:D5”) = “”
.Range(“J3:J5”) = “”
.Range(“Q3:Q5”) = “”

For i = 8 To 62 Step 6

Dim j As Integer
j = i + 3

.Range(“B” & i).Value = “”
.Range(“C” & i).Value = “”

.Range(“G” & i & “:R” & j) = “”

.Range(Cells(i, “G”), Cells(j, “R”)) = “”

Next

.Range(“E7:E64”) = “”
.Range(“A68”) = “”

End With

これで入力されるセルは全て空欄になります。ですがいきなり上のコードを見ても訳がわからないですよね。

 

上のコードは完成形です。とりあえず入力してから途中で修正したりしますので、皆さんも順番に自分で入力しながら進めてください。

 

まずはシート上部の情報(患者ID、カナ、患者指名、診療科、病棟、主治医、入力日、入力者、確認媒体)を空欄にするコードを書いていきましょう。

 

.Range(“D3:D5”) = “”

「ワークシート印刷シートのD3からD5セルを空欄にする。」

 

「:」は「~」の意味で、セルの範囲を指定する方法でした。これで患者ID、患者名カナ、患者名セルが空欄になります。

 

.Range(“J3:J5”) = “”

「ワークシート印刷シートのJ3からJ5セルを空欄にする。」

 

これで診療科、病棟、主治医のセルが空欄になります。

 

.Range(“Q3:Q5”) = “”

「ワークシート印刷シートのQ3からQ5セルを空欄にする。」

 

これで入力日、入力者、確認媒体のセルが空欄になります。

 

以上で上部のセルの初期化はOKです。

 

vba5-7-4次にワークシートの採用区分のセル(B列)を見て下さい。

 

No1の採用区分のセルはB8セル、No2はB14セルになります。

 

画像にはないですが、No3はB20セル、No4はB26となり、…No10はB62セルになります。

 

よく見たら法則があるのがわかりますか?

 

B列は行番号8を開始として62まで、6個飛びになっていますよね。

 

セル同士が隣接していないので、セルの範囲を指定する方法「:」は今回は使えません。

 

そこで繰り返し処理を使用します。具体的に解説していきましょう。

スポンサーリンク

For~Nextステートメント+Step

For i = 8 To 62 Step 6

「変数iには8から62までの値を入れる。」これは何回もやっているのでOKですが、最後にStep 6というのが付いています。

 

これは何でしょうか?

 

実はStepは「何個飛ばすのか」を意味します。そのまんまですね。

 

もしstepを書かなければ連続で入れる(8、9、10、11、12…62)という意味になります。

 

今回は8から62まで6個飛ばしで入れるということになりますので、(8、14、20…62)のように6個飛ばしで変数iに入れるという意味になります。

 

.Range(“B” & i).Value = “”

「B列変数i行のセルを空欄にする。」

 

上で書きましたが、変数iには8、16…と入っていくわけです。

 

つまり動作としては「B8セルを空欄にする→B14を空欄にする…→B62を空欄にする。」ということが実行されます。

 

Next

「次に進む(iが62になるまで)」これで採用区分のセルの初期化はOKですね。

 

続いて記号・色のセルにいきます。

 

列がCになっただけで採用区分のセルと同じコードが使えます。

.Range(“C” & i).Value = “”

これでOK。

 

印刷シートの薬品名、成分名、薬効の部分はとりあえず置いておいて、その右側に注目して下さい。

 

鑑別報告書のワークシート「印刷シート」の一番上の部分に、上の画像のように適当に入力してみて下さい。

 

私は数字とアルファベットを入れましたが、きちんと処理が行われるか確認するだけなので全部1とかでも全然OKです。

 

今回はG8セルからR11セルの値を空欄にしたいわけです。一番右の継続の欄は基本的に医師が入力しますので、元々作成者が入力する事はありません。含めなくてOKでしょう。

 

vba5-7-8それでは

.Range(“G8:R11”).Value = “”

を追加して、F5を押して起動してみましょう。

 

先ほど入力した部分がきれいに削除されましたね。

 

続いて印刷シートのNo1とNo2のセルをちょっと比較してみます。下の画像をよく見て下さい。

 

どの部分もNo1に6足すとNo2になっているんですよ。規則性がある、つまり…繰り返し処理が使えるという事です。

 

ただ今回はセル~セルと範囲を指定する必要があります。そのため変数をもう1つ用意しなければなりません。

 

Dim j As Integer

「変数jを整数と宣言する。」

 

変数jはiが既に使用されているので順番的にjにしました。それ以外の意味はありません。ぶっちゃけ他のアルファベットでも構いません。

 

For i = 8 To 62 Step 6

「変数iには8から62まで6個飛ばしで入れる。」これは先ほどやりましたね。

 

j = i + 3

「変数jには変数iに3を加えた値を入れる」これの意味が分かりますか?

 

先ほどの

.Range(“G8:R11”).Value = “”

を見て下さい。この8と11に注目。この2つの数字は3の違いですね。

 

つまり…始点セルの数字に3を足せば終点セルの数字になります。ではこのコードを削除して下のコードに書き換えて下さい。

 

.Range(Cells(i, “G”), Cells(j, “R”)) = “”

これが今回最大のポイントですが、正直意味不明ですよね。なんとRangeの中にcellsが入っちゃってます。

 

今までの流れだと

Range(“G” & i) : Range(“R” & j) = “”

になるんじゃないかと思う方もいらっしゃるかもしれません。なんとなく合ってそうですよね?しかしこれだとダメなんです。

 

変数を使用してセルの範囲を指定する場合は、Rangeのカッコ内にcellsで範囲を指定します。更に「:」ではなく、「,」を使用します。

 

これは決まりなので覚えて下さい。

 

以上から

.Range(Cells(i, “G”), Cells(j, “R”)) = “”

は「セル(G列変数i行)からセル(R列変数j行)の値を空欄にする」という意味になります。

 

iには8、14、20…62まで、jには11、17、24…65の値が入ります。

 

つまり「セルG8~R11を空欄にする→セルG14~R17を空欄にする→…セルG62~R65を空欄にする」となります。

 

今回はわかりやすい方法という事で上記を使用しましたが、

.Range(“G” & i & “:R” & j) = “”

こう書いてもOKです。ただこれだとちょっとわかりにくいですし、構文エラーも出やすいので前述の書き方をオススメします。

 

Next

「次に進む(iが62になるまで)」これでOKです。

 

vba5-7-11続いて印刷シートをアクティブにしないとエラーが発生する可能性があります。上の画像を参考に

.Activate

も追加して下さい。あと2行です!頑張って下さい。

 

vba5-7-12No1の薬品名の右のセルはE7ですね。

 

vba5-7-13No10の薬効の右セルはE64です。という事は…

.Range(“E7:E64”) = “”

これでE列、つまりNo1~No10の薬品名、成分名、薬効を全て空欄にする事ができますね。最後です。

 

vba5-7-14一番下のコメント欄を初期化するために…

.Range(“A68”) = “”

これでOKです。

 

いや~長かったですね。お疲れ様でした。

 

今回は初心者の方でもわかるようになるべく簡単なコードを使用しましたが、きちんと動作するならばどう書いてもOKです。

 

このVBA講座を読み終えたら、「自分ならこうやるな」と色々試してみてください。勉強になりますよ。

 

それでは今回以上で終了です。次回は他のユーザーフォームとの連携についてお話します。

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