作成帳票の保存は、必要な部分だけをマクロなしエクセルブックで行いましょう。不要なVBAコードも同時に保存してしまうマクロ付き保存はトラブルの原因にもなります。
こんにちは、じゅんぱ店長(@junpa33)です。
販売帳票(見積書、納品書、請求書)を自動で作成するエクセルソフトの組み立てについてです。
今回は第4回目です。完成した帳票をファイル名を付けて、保存用に所定の別フォルダーに別名保存できるようにします。
ただし、マクロ付きエクセルブックの保存については、
リネームして「名前を付けて保存」を行ってもマクロ事故が起こるかもしれません。
一つ前の記事を確認するのは、こちら↓になります。

見積書納品書請求書作成の記事編成
- 見積書納品書請求書作成ソフトの使い方とダウンロード
- 見積書納品書請求書作成ソフトの作成概略
コンテンツ
マクロ付きエクセルブックの別名保存の危うさ

Excel VBAを使って、データ資料を作っている方なら経験があると思いますが、
複数のエクセルブックを開いていたら、何かのキッカケでVBAの誤動作が起こりセルデータがおかしくなった。
なんて経験がある人もいると思います。
あちゃ~😵なんて シャレにならない事経験ありませんか。
実はそれは、マクロ(VBA)が誤動作したわけでもなくて、複数開いているエクセルのアクティブ状態が違っていたからです。
Option Explicit
Sub クリア()
With Worksheets("Sheet1")
.Cells.Clear
.DrawingObjects.Delete
End With
End Sub
あるマクロ付きエクセルブックでこのようなVBAが記述されていて、同時に他のエクセルブックを複数開いていたとします。
「他のエクセルブック」がアクティブ状態で、たまたま、この「クリア」マクロが実行されたとしたら・・・
「他のエクセルブック」の「Sheet1」は真っ白な状態にクリアされてしまいます。
このVBAはアクティブブックに対して実行されるコードになっています。
皆さんは、作成したVBAマクロ付きのエクセルを、保存用にリネームして丸々そのまま「エクセルマクロ有効ブック」で保存していませんか?
エクセルの保存ダイアログは、基本、同じ種類のブックで保存する用に表示されます。
マクロ有効ブックをそのまま安易に保存すると、データ保存用にした別名エクセルブックも「VBAコードは有効」状態になっています。
データ保存用としてマクロの付いたエクセルブックを保存する場合は、「.xlsx」マクロなしエクセルブックで保存するようにしましょう。
記述されたVBAを無効にするためには、
「Excelブック(.xlsx)」で保存することでVBAが無効となります。
VBAが記述されたエクセルブックを無用に増やさないことが、VBAの誤操作を減らせる一つの方策ともなります。
作成帳票の保存は別名のマクロなしエクセルブック

この「見積納品請求書作成エクセルソフト」について、作成した「見積書」「納品書」「請求書」の3シートだけを別名エクセルブックにコピーして保存します。
作成した帳票を保存するためのVBA
VBAを動かしているエクセルBOOKは「エクセルマクロ有効ブック(.xlsm)」で作られていますが、名前を変えて保存する帳票保存のエクセルBOOKは「Excelブック(.xlsx)」とします。
データとして保存する部分も、3つのシート「請求書」・「納品書」・「見積書」だけです。
VBAコードはModule4に記述していきます。新たにモジュールを挿入してください。

Option Explicit
Sub 伝票保存()
Dim Mypath, FolderPathD As String
Dim Shell As Object
Dim Newbook As Object
Dim FP, FPN, FPM, FPMN As String
Dim FPL, FPLN, FN, NbkN As String
Dim a As Long
'保存フォルダを選択
Mypath = ThisWorkbook.Path & "\作成伝票"
Set Shell = CreateObject("Shell.Application") _
.BrowseForFolder(0, "フォルダを選択してください", _
&H1, Mypath)
If Shell Is Nothing Then
FolderPathD = ""
Exit Sub
Else
FolderPathD = Shell.Items.Item.Path
End If
'フォルダ名の取得
FP = FolderPathD
FPN = Mid(FP, InStrRev(FP, "\") + 1)
FPM = Left(FP, InStrRev(FP, "\") - 1)
FPMN = Mid(FPM, InStrRev(FPM, "\") + 1)
FPL = Left(FPM, InStrRev(FPM, "\") - 1)
FPLN = Mid(FPL, InStrRev(FPL, "\") + 1)
'ファイルを保存
ChDir FP
Set Newbook = Workbooks.Add
For a = 2 To 4
Workbooks("見納請3点伝票作成.xlsm").Activate
Worksheets(a).Cells.Copy
Newbook.Activate
Worksheets("sheet" & a - 1).Select
With ActiveSheet
.Paste
.Name = Workbooks("見納請3点伝票作成.xlsm") _
.Worksheets(a).Name
'行高さ設定
.Rows.RowHeight = 24
.Rows("1:12").RowHeight = 19.5
.Rows(2).RowHeight = 9
.Rows(4).RowHeight = 7.5
.Rows("7:9").RowHeight = 15.75
.Rows(10).RowHeight = 6.75
.Rows(11).RowHeight = 22.5
.Range("A1").Select
'印刷余白の設定
With .PageSetup
.TopMargin = Application _
.CentimetersToPoints(1.5)
.LeftMargin = Application _
.CentimetersToPoints(2.5)
.RightMargin = Application _
.CentimetersToPoints(1)
.BottomMargin = Application _
.CentimetersToPoints(1)
.HeaderMargin = Application _
.CentimetersToPoints(0.5)
.FooterMargin = Application _
.CentimetersToPoints(0.5)
'プリントタイトル
.PrintTitleRows = "$13:$13"
End With
End With
Application.CutCopyMode = False
Next a
'保存ファイルに名前を付ける
FN = Format(Now(), "yymmdd-hhmm")
With Newbook
If FPN = "作成伝票" Then
.SaveAs Filename:=FolderPathD & "\" _
& FPN & "請求書_" & FN & ".xlsx"
ElseIf FPMN = "作成伝票" Then
.SaveAs Filename:=FolderPathD & "\" _
& FPN & "請求書_" & FN & ".xlsx"
ElseIf FPLN = "作成伝票" Then
.SaveAs Filename:=FolderPathD & "\" _
& FPMN & FPN & "請求書_" & FN & ".xlsx"
Else
.SaveAs Filename:=FolderPathD & "\" _
& FPLN & FPMN & FPN & "請求書_" & FN & ".xlsx"
End If
NbkN = .Name
.Close
End With
Workbooks("見納請3点伝票作成.xlsm").Activate
Worksheets("作業シート").Activate
Range("A1").Select
MsgBox NbkN & " で帳票の保存を行ないました。", _
vbInformation, "見納請3点伝票作成"
End Sub
「作成伝票」というフォルダは名称固定で、このエクセルブックと同列(同じディレクトリ)で設置必須です。
このコードが実行されると、この「作成伝票」から下層がツリー表示されます。

「作成伝票」から3階層下まで取得することが出来ます。
保存時のファイル名を設定するのにそのフォルダ名を利用します。


エクセルブックの「請求書」「納品書」「見積書」3シートをコピーペーストの方法で、新しく作成したエクセルBOOKに移します。
シートも同名にします



エクセルの仕様として、コピーペーストでは行の高さをコピー先に引き継ぐことはできません。
ですので、
テンプレートを再生するためには、改めて各行の高さ情報をコードにセットする必要があります。
印刷余白についてもコピー先には引き継がれません。
印刷余白も改めてコードをセットします。
プリントタイトルも再設定します。
基本的に名前は自動で振られる設定にしています。
保存するExcel帳票の名付けのルールは、
「1階層下フォルダ名」「2階層下フォルダ名」「3階層下フォルダ名」請求書_年月日-時分
になります。
このケースで説明すると「作成伝票」→「ABショップ」→「CD店」→「EF営業所」であれば、

第一階層

第2階層

第3階層

この様にフォルダ名を使ってファイル名としています。
ファイル名に「時分」を入れているのは、項目追加や項目修正で同名ファイルにならないようにするためのものです。
(追加修正帳票を60秒以内に行うと上書き保存になってしまいます、ご注意を!)


エクセル帳票保存のまとめ

このエクセルソフトによって作成した「見積書」「納品書」「請求書」を、別名のエクセルブック(.xlsx)として、指定のフォルダ(3階層まで)に作成保存しました。
VBAを使っていないエクセルファイルをデータ保存する時は、特に考えなくてもいいですが、VBA付きのエクセルBOOKをデータ保存しようとしたときは注意が必要です。
「マクロ付きエクセルブックにあるデータを別名保存する時には、VBAコードは必ず削除する」ことをお勧めします。
VBAコードが残っているだけで、ファイル容量が大きくなるだけでなく、VBA誤操作の危険もはらむことになります。
次回は、今まで作ったVBAコードをコントロールするユーザーフォームを作成します。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。