【Excel VBA】ファイルを別ファイルとして保存する方法を紹介【Workbook.SaveAs】

Excel
スポンサーリンク

今回はファイルを別ファイルとして保存する方法を紹介したいと思います。

例えば原紙のファイルがあったとして、そのファイル自体はいじらずに複製編集して保存したい・・・なんてときに役に立つので是非参考にしていただければと思います。

また不定期で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の使い方_注意点_1

逆に実行時にエラーになってしまう場合は、保存したいファイルが閉じていないか確認するようにしましょう。

スポンサーリンク

Workbook.SaveAsを使ったマクロの紹介

では、実際にWorkbook.SaveAsを使ったマクロを紹介します。

今回紹介するマクロは業務依頼書を台帳から管理・作成できるマクロになっています。

Workbook.SaveAsを使ったマクロの紹介_1
Workbook.SaveAsを使ったマクロの紹介_2

C列の「作成」をダブルクリックすると、その行に入力されているデータを業務依頼書に自動で入力し、「業務依頼書保存先」フォルダに自動で保存されるマクロになります。

今回紹介するマクロをアップロードしてありますので、↓からダウンロードして実際に動作確認していただければと思います!

コードの紹介

C列の「作成」もしくは「作成済」がダブルクリックされたか判定するコード

コードの紹介_C列の「作成」もしくは「作成済」がダブルクリックされたか判定するコード_1

まず、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文で

  1. C列がダブルクリックされたかどうか
  2. セルの値が「作成」か「作成済」になっているかどうか
  3. 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の行に必要情報を入力します。

コードの紹介_業務依頼書を作成・保存するコード_1

入力後、「作成」をダブルクリックすると業務依頼書が作成&台帳の内容が自動入力されます。

コードの紹介_業務依頼書を作成・保存するコード_2

ちなみにこの時点でちゃんと保存されてます。

コードの紹介_業務依頼書を作成・保存するコード_3
コードの紹介_業務依頼書を作成・保存するコード_4

まとめ

今回はファイルを別ファイルとして保存する方法を紹介しました。

Workbook.SaveAsは非常によく使うメソッドなので、是非覚えていただければと思います。

また、今回紹介した業務依頼書マクロも色々カスタマイズして使っていただければ嬉しいです。

コメント

タイトルとURLをコピーしました