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

スポンサーリンク

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

 

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

 

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

 

vba5-13-3ここまではいいですね。ユーザーフォーム上段の患者IDや患者氏名、主治医等のテキストボックス、コンボボックスと下段のコメント欄を印刷シートに転記しただけです。

 

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

 

例えば

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

の場合、

 

vba5-13-4上の画面を表示し、保存ボタンを押すとExcelブックとして保存され、そのブックが自動的に閉じられるコードを書きます。ちなみに上のような画面をダイアログボックスといいます。

 

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

 

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

 

vba5-13-6
動作の流れを確認しておきます。

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

こんな感じです。ではまた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型を使うと覚えて頂ければ結構です。これ以上のことは別の機会にしましょう。

 

続いて

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のセルに入ります。

 

それでは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が入ります。

 

最後にどうすれば1ずつ足すコードになるでしょうか?

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の宣言も他の変数とまとめました。

 

いや~今回は内容盛り沢山でしたね。本当にお疲れ様でした。次回は鑑別報告書を印刷するコードについて解説します。

>>Excel VBA講座 目次へ