今回は鑑別報告書をエクセルファイルで保存するコードを書いていきましょう。

 

それでは早速いきます。

スポンサーリンク

ダイアログボックスの表示

vba5-13-1シート保存ボタンをダブルクリック。又は右クリックからコードの表示。

 

vba5-13-2こうなりましたね。ここに以下のように書いていきます。

 

vba5-13-3ユーザーフォーム上段の患者IDや患者氏名、主治医等のテキストボックス、コンボボックスと下段のコメント欄を印刷シートに転記するコードになります。

 

問題はここからです。今回はシート保存ボタンを押すと「患者名+ページ数.xlsx」で保存するようにしたいと考えています。

 

例えば

・患者名:薬剤 太郎
・ページ数:1

の場合、

 

シート保存ボタンを押すと上の画像が表示され、保存ボタンを押すとExcelブックとして保存。更にそのブックが自動的に閉じられるコードを書きます。

 

ちなみに上のような画面をダイアログボックスといいます。覚えておいてくださいね。

 

例えば印刷する時なども小窓で上のような画面がでますよね。これもダイアログボックスといいます。

 

それでは早速コードを書いていきましょう。

 

これも書き方は色々ありますが、今回もわかりやすさを重視して以下のように書いてみました。下の画像を見て下さい。

 

vba5-13-6

With Worksheets(“印刷シート”)

.Range(“D3”) = txPtID
.Range(“D4”) = txPtKana
.Range(“D5”) = txPtName
.Range(“J3”) = cboKa
.Range(“J4”) = cboPlace
.Range(“J5”) = cboDoctor
.Range(“Q3”) = txJissibi
.Range(“Q4”) = cboInput
.Range(“T1”) = txPage1
.Range(“V1”) = txPage2
.Range(“A68”) = txComment
.Range(“Q5″) = cboDocument

Dim i As String, j As Integer, FName As Variant

i = txPtName
j = txPage1

FName = Application.GetSaveAsFilename(InitialFileName:=i & j, _
FileFilter:=”Excelファイル,*.xlsx”)

If FName <> False Then

.Copy

ActiveWorkbook.SaveAs Filename:=FName
ActiveWorkbook.Close

End If

End With

動作の流れを今一度確認しておきます。

  1. 「シート保存」ボタンを押す
  2. 「名前を付けて保存」のダイアログボックスが表示される
  3. ファイル名が自動的に「患者名+ページNo」、ファイルの種類が「.xlsx」になる
  4. 保存場所を選び、保存ボタンを押す
  5. 新規のブックとして持参薬のデータが保存される。
  6. そのブックが自動的に閉じる

こんな感じです。それでは1つずつ見て行きましょう。

 

Dim i As String, j As Integer, FName As Variant

「変数iを文字列、変数jを整数、変数FNameをVariantと宣言する。」

 

「Variant」これ初めて見るデータ型ですね。

 

Variantはなんでも入れることができるオールマイティーな箱です。

 

VBA講座2-5で変数についてお話しましたが、変数を使う場合はデータ型を宣言して、宣言した以外のデータ型を入れることはできないということでしたね。

 

vba5-13-7通常はIntegerなら整数、Stringなら文字列と一つの箱(変数)につき1種類の型しか入れる事ができません。

 

vba5-13-8Variantは全ての型を入れる事ができる箱の集合体であるとイメージ頂ければと思います。

 

そうなると…「データ型はVariant型以外いらないのでは?」という意見も聞こえてきそうですね。

 

ですが、可能な限りVariant型は使わないようにして下さい。初心者の方も楽をせず、きちんと宣言するようにしましょう。

 

理由として、

  • どのデータ型を入れたいのかわかりにくい
  • メモリを食うので実行速度が遅くなる
  • 予期せぬエラーが出ることがある

などが挙げられます。

 

今回の講座では、「名前を付けて保存ダイアログボックスを表示する時はVariant型を使う」と覚えて頂ければ結構です。

 

これ以上のことは別の機会に勉強することにしましょう。

 

続いて

i = txPtName
j = txPage1

「変数iにtxPtNameの値を入れる。」「変数jにtxPage1の値を入れる。」これは問題ないでしょう。

スポンサーリンク

GetSaveAsFilenameメソッド

こちらも初めて見る感じですね。

FName = Application.GetSaveAsFilename(InitialFileName:=i & j, _
FileFilter:=”Excelファイル,*.xlsx”)

「変数FNameに=の右側を入れる。」=の右側ですが、これはまとめて覚えてしまった方が早いですね。

 

Variant型変数 = Application.GetSaveAsFilename(InitialFileName:=ファイル名, FileFilter:=”保存形式”)

実はこのコード、ファイル名や保存形式以外にも、保存形式の何番目を初期値にするか等色々設定できるのですが、今回は使用しませんのでここまでにしておきます。

 

FName = Application.GetSaveAsFilename(InitialFileName:=i & j, _
FileFilter:=”Excelファイル,*.xlsx”)

では=の右側を翻訳すると…「名前をつけて保存ダイアログを表示し、保存するファイル名を変数i&j(患者名+ページ数)、保存形式をxlsxとする。」となります。

 

この時に覚えておいて頂きたいのが、「名前を付けて保存ダイアログボックス」が表示されている時にキャンセルボタンを押すと、FalseをVariant型変数FNameに入れるというものです。

 

If FName <> False Then

「もし変数FNameがFalseでないならば」つまり…=キャンセルボタンを押さない時=保存ボタンが押された時になりますね。

 

.Copy

「ワークシート印刷シートをコピーする。」.Copyだけだとコピーするだけと思うかもしれませんが、実は自動的に新しいブックが作成されています。

 

ただこの時点ではブックに名前は付いておらず、保存もされていない状態です。

 

ActiveWorkbook.SaveAs FileName:=FName

新しく作成されたブックはアクティブな状態、つまり今現在選択されている状態です。後はそのまんまですね。

 

「ファイルネーム(新しいブックの名前)は変数FNameとして保存する。」つまり(患者名+ページ数).xlsxとして保存する、となります。

 

ActiveWorkbook.Close

そして新規ブックの名前もファイル形式も決まり、保存されましたのでブックを閉じる、となります。

 

今回FName=False(キャンセルボタンを押した)時の処理は書いていません。その場合は前の画面に戻る(ダイアログを閉じる)だけなので書く必要がないのです。

 

End If

最後にEnd If。エラーが発生するので必ず書くように。

 

さてこれで完成と行きたい所ですが、大事な事を忘れていました。

 

例えば鑑別報告書のページ数が1ページだけならばいいのですが、2ページになる場合は左側のNoを11~20、3ページになる場合は21~30にしてあげる必要がありますよね。

 

vba5-13-9上の画像を見て下さい。これで1ページ目なら1~10が、2ページ目なら11~20が、3ページ目なら21~30がNoのセルに入ります。

Dim k As Integer

If txPage1 = 1 Then
k = 1
End If

If txPage1 = 2 Then
k = 11
End If

If txPage1 = 3 Then
k = 21
End If

For j = 8 To 62 Step 6

.Range(“A” & j).Value = k

k = k + 1

Next

それでは1つずつ解説していきましょう。大事なコードも出てきますよ。

Dim k As Integer

「変数kを整数と宣言する。」これはいいですね。

 

If txPage1 = 1 Then

「もしtxPage1が1ならば(鑑別報告書1ページ目なら)」

 

k = 1

「変数kに1を入れる。」

 

変数kに鑑別報告書のNoに入れる数字の最初の番号を入れることにしました。その後は繰り返し処理を使います。

 

ElseIf txPage1 = 2 Then

「もしtxPage1が2ならば(鑑別報告書2ページ目なら)」Elselfについてはこの前やりましたね。

 

k = 11

「変数kに11を入れる。」

 

ElseIf txPage1 = 3 Then

「もしtxPage1が3ならば(鑑別報告書3ページ目なら)」

 

k = 21

「変数kに21を入れる。」

 

End If

最後にEnd Ifを忘れずに。

 

Noもセルの行が6個飛びになっている事を確認して下さい。

 

更に最初の番号に1ずつ足していけば、鑑別報告書が1ページ目の時No1~10、2ページ目の時No11~20、3ページ目の時はNo21~30が自動的に入ることになりますね。

 

つまり、ここでも繰り返し処理が使えるのです。

 

For j = 8 To 62 Step 6

「変数jに8~62までの数字を6個飛びで入れる。」

 

8、14、20…62ですね。

 

.Range(“A” & j).Value = k

「A列変数j行に変数kの値を入れる。」

 

先ほど何ページ目なのかで場合分けしましたね。1ページ目なら変数kは1、2ページ目なら11、3ページ目なら21が入ります。

 

さて、鑑別報告書それぞれのページでNo2~10、12~20、22~30をセルに入れるにはどうすればいいでしょうか?

 

ここで使うのが

k = k + 1

これです。変数kに変数kに1を足した数を入れる。ちょっとわかりづらいですかね。

 

鑑別報告書1ページ目の場合として解説していきますね。

 

まず変数kには1が入ります。そして印刷シートのA8セルに1が入ります。

 

次に変数k(1)に1を足した数(2)が変数kに入ります。ここまではいいですね。

 

繰り返し2回目に突入。この時点で変数kには2が入っていますね。そして印刷シートのA14セルに2が入ります。次に変数k(2)に1を足した数(3)が変数kに入ります。

 

上記を変数jが62になるまで繰り返す、となります。これで1ページ目なら1~10がNoセルに入るわけです。

 

変数i = 変数i+1

これはかなり使えるコードなのでぜひ覚えて下さいね。色んな場面で活用できますから。

 

vba5-13-10最後に今解説したコードを移動します。ブックが保存された後に処理しても意味がないので上に移動しましょう。

 

vba5-13-11これでOKです。ついでに変数kの宣言も他の変数とまとめました。

 

いや~今回は内容盛り沢山でしたね。本当にお疲れ様でした。

 

次回は鑑別報告書を印刷するコードについて解説します。