今回はfrmInputを開いた時に、鑑別報告書のワークシートを初期化するコードを書いていきます。
具体的には値を入力するセルを空欄にする、または初期値を入れる動作ですね。
前に作成した鑑別書のデータが残っていると大変です。
例えば前の患者AさんのデータがNo1~5まで入っており、次の患者BさんのデータがNo1~4までだった場合、AさんのNo5の薬品がBさんのシートに載ってしまいます。
これに気付かなければインシデントレポート提出確定です(笑)。
それではいきましょう。
スポンサーリンク
鑑別報告書のワークシートの初期化
VBA講座5-3でダウンロードした鑑別報告書のワークシート「印刷シート」を見ながら読み進めて下さい。
例えばD3セルは患者ID、D4セルには患者名(カナ)が入りますよね。これを空欄にする場合一番簡単な方法は、
Range(“D4”) = “”
になります。
しかしこの方法だと数が少ない場合はいいですが、今回のように医薬品名や用法、残数などのセルも全て同様に行うとコードがものすごく長くなり、非常に見づらくなってしまいます。
そこで今までに書いたコードをちょっと応用して、なるべく短くなるように書いてみましょう。
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、カナ、患者指名、診療科、病棟、主治医、入力日、入力者、確認媒体)を空欄にするコードを書いていきましょう。
「ワークシート印刷シートのD3からD5セルを空欄にする。」
「:」は「~」の意味で、セルの範囲を指定する方法でした。これで患者ID、患者名カナ、患者名セルが空欄になります。
「ワークシート印刷シートのJ3からJ5セルを空欄にする。」
これで診療科、病棟、主治医のセルが空欄になります。
「ワークシート印刷シートのQ3からQ5セルを空欄にする。」
これで入力日、入力者、確認媒体のセルが空欄になります。
以上で上部のセルの初期化はOKです。
No1の採用区分のセルはB8セル、No2はB14セルになります。
画像にはないですが、No3はB20セル、No4はB26となり、…No10はB62セルになります。
よく見たら法則があるのがわかりますか?
B列は行番号8を開始として62まで、6個飛びになっていますよね。
セル同士が隣接していないので、セルの範囲を指定する方法「:」は今回は使えません。
そこで繰り返し処理を使用します。具体的に解説していきましょう。
スポンサーリンク
For~Nextステートメント+Step
「変数iには8から62までの値を入れる。」これは何回もやっているのでOKですが、最後にStep 6というのが付いています。
これは何でしょうか?
実はStepは「何個飛ばすのか」を意味します。そのまんまですね。
もしstepを書かなければ連続で入れる(8、9、10、11、12…62)という意味になります。
今回は8から62まで6個飛ばしで入れるということになりますので、(8、14、20…62)のように6個飛ばしで変数iに入れるという意味になります。
「B列変数i行のセルを空欄にする。」
上で書きましたが、変数iには8、16…と入っていくわけです。
つまり動作としては「B8セルを空欄にする→B14を空欄にする…→B62を空欄にする。」ということが実行されます。
「次に進む(iが62になるまで)」これで採用区分のセルの初期化はOKですね。
続いて記号・色のセルにいきます。
列がCになっただけで採用区分のセルと同じコードが使えます。
これでOK。
印刷シートの薬品名、成分名、薬効の部分はとりあえず置いておいて、その右側に注目して下さい。
鑑別報告書のワークシート「印刷シート」の一番上の部分に、上の画像のように適当に入力してみて下さい。
私は数字とアルファベットを入れましたが、きちんと処理が行われるか確認するだけなので全部1とかでも全然OKです。
今回はG8セルからR11セルの値を空欄にしたいわけです。一番右の継続の欄は基本的に医師が入力しますので、元々作成者が入力する事はありません。含めなくてOKでしょう。
を追加して、F5を押して起動してみましょう。
先ほど入力した部分がきれいに削除されましたね。
続いて印刷シートのNo1とNo2のセルをちょっと比較してみます。下の画像をよく見て下さい。
どの部分もNo1に6足すとNo2になっているんですよ。規則性がある、つまり…繰り返し処理が使えるという事です。
ただ今回はセル~セルと範囲を指定する必要があります。そのため変数をもう1つ用意しなければなりません。
「変数jを整数と宣言する。」
変数jはiが既に使用されているので順番的にjにしました。それ以外の意味はありません。ぶっちゃけ他のアルファベットでも構いません。
「変数iには8から62まで6個飛ばしで入れる。」これは先ほどやりましたね。
「変数jには変数iに3を加えた値を入れる」これの意味が分かりますか?
先ほどの
を見て下さい。この8と11に注目。この2つの数字は3の違いですね。
つまり…始点セルの数字に3を足せば終点セルの数字になります。ではこのコードを削除して下のコードに書き換えて下さい。
これが今回最大のポイントですが、正直意味不明ですよね。なんとRangeの中にcellsが入っちゃってます。
今までの流れだと
になるんじゃないかと思う方もいらっしゃるかもしれません。なんとなく合ってそうですよね?しかしこれだとダメなんです。
変数を使用してセルの範囲を指定する場合は、Rangeのカッコ内にcellsで範囲を指定します。更に「:」ではなく、「,」を使用します。
これは決まりなので覚えて下さい。
以上から
は「セル(G列変数i行)からセル(R列変数j行)の値を空欄にする」という意味になります。
iには8、14、20…62まで、jには11、17、24…65の値が入ります。
つまり「セルG8~R11を空欄にする→セルG14~R17を空欄にする→…セルG62~R65を空欄にする」となります。
今回はわかりやすい方法という事で上記を使用しましたが、
こう書いてもOKです。ただこれだとちょっとわかりにくいですし、構文エラーも出やすいので前述の書き方をオススメします。
「次に進む(iが62になるまで)」これでOKです。
続いて印刷シートをアクティブにしないとエラーが発生する可能性があります。上の画像を参考に
も追加して下さい。あと2行です!頑張って下さい。
これでE列、つまりNo1~No10の薬品名、成分名、薬効を全て空欄にする事ができますね。最後です。
これでOKです。
いや~長かったですね。お疲れ様でした。
今回は初心者の方でもわかるようになるべく簡単なコードを使用しましたが、きちんと動作するならばどう書いてもOKです。
このVBA講座を読み終えたら、「自分ならこうやるな」と色々試してみてください。勉強になりますよ。
それでは今回以上で終了です。次回は他のユーザーフォームとの連携についてお話します。