今回はfrmInputを開いた時に、鑑別報告書のワークシートを初期化するコードを書いていきます。要は値が入力されるセルを空欄にする動作ですね。前に作成した鑑別書のデータが残っていると大変です。

 

例えば前の患者AさんのデータがNo1~5まで入っており、次の患者BさんのデータがNo1~4までだった場合、AさんのNo5の薬品がBさんのシートに載ってしまいます。これに気付かなければインシデントレポート提出確定です(笑)。それではいきましょう。

スポンサーリンク

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

 

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

 

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

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

になります。

 

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

 

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

 

vba5-7-2上のコードを見て下さい。これで入力されるセルは全て空欄になります。ですがいきなり上のコードを見ても訳がわからないと思いますので、1行ずつ解説していきます。

 

vba5-7-3まずはシート上部の情報(患者情報、主治医など)を空欄にするコードを書いていきましょう。

 

.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

 

vba5-7-5まずは上の画像を見て下さい。
コンボボックスの読み込みのコードで変数iの宣言は既に行われていますので今回の処理では不要です。それではいきましょう。

 

For i = 8 To 62 Step 6

変数iには8から62までの値を入れる。これは何回もやっているのでOKですね。

 

次のStep 6。これは何でしょうか?これは何個飛ばすのかを意味します。そのまんまです。

 

もしstepを書かなければ連続で入れる(8、9、10…62)という意味になります。今回は8から62まで6個飛ばしで入れるということなので(8、14、20…62)と変数iに入れるという意味になります。

 

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

「B列変数i行のセルを空欄にする。」上で書きましたが、変数iには8、16…と入っていくわけです。

 

つまり動作としては「B8セルを空欄にする→B14を空欄にする…→B62を空欄にする。」という事になります。

 

Next

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

 

続いて記号・色のセルにいきます。列がCになっただけで採用区分のセルと同じコードが使えます。

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

これでOK。

 

薬品名、成分名、薬効はとりあえず置いておいて、右側に注目して下さい。

vba5-7-6上の画像のように適当に入力してみて下さい。私は数字とアルファベットを入れましたが、きちんと処理が行われるか確認するだけなので全部1とかでも全然OKです。

 

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

 

vba5-7-8それでは

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

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

 

vba5-7-9先ほど入力した部分がきれいに削除されましたね。続いてNo1とNo2のセルをちょっと比較してみます。下の画像をよく見て下さい。

 

vba5-7-10どの部分も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ですよ。

 

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

>>Excel VBA講座 目次へ