今回はファイルを別ファイルとして保存する方法を紹介したいと思います。
例えば原紙のファイルがあったとして、そのファイル自体はいじらずに複製・編集して保存したい・・・なんてときに役に立つので是非参考にしていただければと思います。
また不定期でVBAに関する記事を投稿していますので、是非こちらも併せてご覧ください!
どうやって複製して保存するか
Excelファイルを複製して保存するには、Workbook.SaveAsを使用します。
Workbook.SaveAsとはざっくり言うとExcelファイルを指定した保存先に新しく保存するメソッドです。Excelでコピーを保存(名前を付けて保存)する操作ができますよね。あれと同じ操作がマクロ上からできるようになるイメージです。
Workbook.SaveAsの使い方
それではWorkbook.SaveAsの使い方をざっくり説明します。とりあえず名前を付けて保存したい場合はこれだけでOKです。
【保存したいWorkbook】.SaveAs 【保存先のパス】
保存したいWorkbook
ここでは保存したいWorkbookを指定します。
現在作業しているブックを保存したい場合は、
ThisWorkbook.SaveAs ...
というふうに指定してあげればいいですし、特定のファイルや変数にセットしているファイルを保存したい場合は
'特定のファイルの場合
Workbooks(Dir(【ファイルのパス】)).SaveAs ...
'変数にセットしているファイルの場合
TestBook.SaveAs ...
のように指定すればOKです。
保存先のパス
ここでは保存先のパスを指定します。直接文字列でも変数で指定してもOKです。
'直接文字列で指定する場合
TestBook.SaveAs "C:\ExcelVBA\はりぼなブログ\test_1.xlsx"
'変数で指定する場合
str_savepath = "C:\ExcelVBA\はりぼなブログ\test_1.xlsx"
TestBook.SaveAs str_savepath
注意点
Workbook.SaveAsを使う上での注意点は保存対象のファイルを開いておく必要があることです。開かれていない状態で実行するとエラー(実行時エラー’9’)になってしまうので、そこだけ注意しましょう。
逆に実行時にエラーになってしまう場合は、保存したいファイルが閉じていないか確認するようにしましょう。
Workbook.SaveAsを使ったマクロの紹介
では、実際にWorkbook.SaveAsを使ったマクロを紹介します。
今回紹介するマクロは業務依頼書を台帳から管理・作成できるマクロになっています。
C列の「作成」をダブルクリックすると、その行に入力されているデータを業務依頼書に自動で入力し、「業務依頼書保存先」フォルダに自動で保存されるマクロになります。
今回紹介するマクロをアップロードしてありますので、↓からダウンロードして実際に動作確認していただければと思います!
コードの紹介
C列の「作成」もしくは「作成済」がダブルクリックされたか判定するコード
まず、Sheet1(台帳)のコードになります。こちらはセルがダブルクリックされた時に実行させるようにしています。
'Sheet1(台帳)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Application.ScreenUpdating = False
If Not (Intersect(Target, Range("C:C")) Is Nothing) And _
Target.Value = "作成" And Target.Row >= 5 Then
Cancel = False
Call Module1.makeRequestForm(Target.Offset(0, -1), _
Target.Offset(0, 1), _
Target.Offset(0, 2), _
Target.Offset(0, 3), _
Target.Offset(0, 4), _
Target.Offset(0, 5), _
Target.Offset(0, 6), _
Target.Offset(0, 7))
Target.Value = "作成済"
ElseIf Not (Intersect(Target, Range("C:C")) Is Nothing) And _
Target.Value = "作成済" And Target.Row >= 5 Then
MsgBox "作成済のファイルを開きます。"
Call Module1.openRequestForm(Target.Offset(0, -1))
End If
Application.ScreenUpdating = True
End Sub
ポイントは If Not(Intersect … の部分になります。
If Not (Intersect(Target, Range("C:C")) Is Nothing) And _
Target.Value = "作成" And Target.Row >= 5 Then
~
ElseIf Not (Intersect(Target, Range("C:C")) Is Nothing) And _
Target.Value = "作成済" And Target.Row >= 5 Then
~
End If
このIf文で
- C列がダブルクリックされたかどうか
- セルの値が「作成」か「作成済」になっているかどうか
- 5行目以降にあるかどうか
を判定させ、満たしていればそれぞれ処理を分岐させている感じです。因みに分岐後は、
- セルが「作成」だった(IfがTrueの)場合→業務依頼書を作成するマクロを実行
- セルが「作成済」だった(ElseIfがTrueの)場合→作成済の業務依頼書を開くマクロを実行
のようにして、Module1のどのマクロを実行するかを決めています。
セルがダブルクリックされた時にマクロを実行させる方法や、ダブルクリックしたセルの判定をする方法については過去記事で紹介・解説していますので、こちらも併せてご覧ください!
業務依頼書を作成・保存するコード
続いて標準モジュールのコードになります。それぞれ、
- 業務依頼書を作成するマクロ
- 作成済の業務依頼書を開くマクロ
の2つがあります。
Private Const c_FormFldrName As String = "RequestForm"
Private Const c_FormFileName As String = "template.xlsx"
Private Const c_FormShtName As String = "業務依頼書"
Private Const c_posDate As String = "T4"
Private Const c_posNo As String = "T6"
Private Const c_posTitle As String = "F9"
Private Const c_posName As String = "F13"
Private Const c_posDepartment As String = "P13"
Private Const c_posTo As String = "F15"
Private Const c_posContent As String = "C20"
Private Const c_posRemark As String = "C43"
'業務依頼書を作成
Sub makeRequestForm(target_no As Long, _
target_date As String, _
target_title As String, _
target_name As String, _
target_department As String, _
target_to As String, _
target_content As String, _
target_remark As String)
Dim MyBook As Workbook
Dim MySht As Worksheet
Set MyBook = Workbooks.Open(ThisWorkbook.Path & "\" & c_FormFileName, False, False)
Set MySht = MyBook.Sheets(c_FormShtName)
With MySht
.Range(c_posNo) = target_no
.Range(c_posDate) = target_date
.Range(c_posTitle) = target_title
.Range(c_posName) = target_name
.Range(c_posDepartment) = target_department
.Range(c_posTo) = target_to
.Range(c_posContent) = target_content
.Range(c_posRemark) = target_remark
End With
MyBook.SaveAs ThisWorkbook.Path & "\" & _
c_FormFldrName & "\" & _
Format(target_no, "000") & ".xlsx"
End Sub
'作成済の業務依頼書を開く
Sub openRequestForm(target_no As Long)
Workbooks.Open (ThisWorkbook.Path & "\" & c_FormFldrName & "\" & Format(target_no, "000") & ".xlsx")
End Sub
定数
標準モジュール(Module1)では定数を定義しています。
Private Const c_FormFldrName As String = "RequestForm"
Private Const c_FormFileName As String = "template.xlsx"
Private Const c_FormShtName As String = "業務依頼書"
Private Const c_posDate As String = "T4"
Private Const c_posNo As String = "T6"
Private Const c_posTitle As String = "F9"
Private Const c_posName As String = "F13"
Private Const c_posDepartment As String = "P13"
Private Const c_posTo As String = "F15"
Private Const c_posContent As String = "C20"
Private Const c_posRemark As String = "C43"
c_Form…で始まる定数の中身についてはそれぞれ以下の通りになっています。
定数 | 中身 |
---|---|
c_FormFldrName | 保存先のフォルダ名 |
c_FormFileName | 業務依頼書のファイル名 |
c_FormShtName | 業務依頼書のシート名 |
名前を変えずにこのまま使う場合は変更する必要はないですが、もし名前を変更した場合はこちらも変更するようにしましょう(この定数を使って作成・保存をしている為)。
またc_pos…で始まる定数は業務依頼書のセル位置を指定しているので、業務依頼書のセル位置を変えたい場合、こちらも変更するのを忘れないようにしましょう!
業務依頼書を作成するマクロ
続いて業務依頼書を作成するマクロです。「作成」セルをダブルクリックされた時に呼び出されます。
Sub makeRequestForm(target_no As Long, _
target_date As String, _
target_title As String, _
target_name As String, _
target_department As String, _
target_to As String, _
target_content As String, _
target_remark As String)
Dim MyBook As Workbook
Dim MySht As Worksheet
Set MyBook = Workbooks.Open(ThisWorkbook.Path & "\" & c_FormFileName, False, False)
Set MySht = MyBook.Sheets(c_FormShtName)
With MySht
.Range(c_posNo) = target_no
.Range(c_posDate) = target_date
.Range(c_posTitle) = target_title
.Range(c_posName) = target_name
.Range(c_posDepartment) = target_department
.Range(c_posTo) = target_to
.Range(c_posContent) = target_content
.Range(c_posRemark) = target_remark
End With
MyBook.SaveAs ThisWorkbook.Path & "\" & _
c_FormFldrName & "\" & _
Format(target_no, "000") & ".xlsx"
End Sub
ここでのポイントはMyBook.SaveAs…の部分です。
MyBook.SaveAs ThisWorkbook.Path & "\" & _
c_FormFldrName & "\" & _
Format(target_no, "000") & ".xlsx"
MyBook.SaveAsを使用して指定したパスに名前を付けて保存しています。
今回はThisWorkbook.Pathと定数のc_FormFldrNameを合わせて相対パスで指定できるようにしています。ThisWorkbook.Pathを使うことでどの階層にこのマクロフォルダを置いても動作するようになっています。
パスについては過去記事で紹介・解説していますので、こちらも併せてご覧ください!
作成済の業務依頼書を開くマクロ
最後に作成済の業務依頼書を開くマクロです。「作成済」セルをダブルクリックされた時に呼び出されます。
Sub openRequestForm(target_no As Long)
Workbooks.Open (ThisWorkbook.Path & "\" & c_FormFldrName & "\" & Format(target_no, "000") & ".xlsx")
End Sub
ダブルクリックした行のNo.を引数にして取得し、その名前のファイルを開くようにしています。
当たり前ですが、保存先フォルダ内にそのファイル名のファイルがなければ開けないのでそこは注意しましょう。
実行例
では、実際に作成してみます。例としてNo.001の行に必要情報を入力します。
入力後、「作成」をダブルクリックすると業務依頼書が作成&台帳の内容が自動入力されます。
ちなみにこの時点でちゃんと保存されてます。
まとめ
今回はファイルを別ファイルとして保存する方法を紹介しました。
Workbook.SaveAsは非常によく使うメソッドなので、是非覚えていただければと思います。
また、今回紹介した業務依頼書マクロも色々カスタマイズして使っていただければ嬉しいです。
コメント