ワークブックを保存

ワークブックを保存する方法になります。
例とそして5パターンの保存方法を列挙しました。
例1:上書き保存
例2:名前を付けて保存
例3:名前を付けて保存(上書き確認をしない)
例4:確認ダイアログを表示して保存するファイル名を指定
例5:名前を付けて保存(同じ名前がある場合は、ナンバリングして保存)

【サンプルプログラム】

Sub SampleProgram()
    Dim result As Boolean

    result = ExcelOpenFileSave_Example1("C:\ExcelVBA\ワークブック\Book1.xlsx")
    If result = False Then
        MsgBox "保存できませんでした"
    End If

    result = ExcelOpenFileSave_Example2("C:\ExcelVBA\ワークブック\Book1.xlsx", _
                                        "C:\ExcelVBA\ワークブック\Book2.xlsx")
    If result = False Then
        MsgBox "保存できませんでした"
    End If

    result = ExcelOpenFileSave_Example3("C:\ExcelVBA\ワークブック\Book1.xlsx", _
                                        "C:\ExcelVBA\ワークブック\Book2.xlsx")
    If result = False Then
        MsgBox "保存できませんでした"
    End If

    result = ExcelOpenFileSave_Example4("C:\ExcelVBA\ワークブック\Book1.xlsx")
    If result = False Then
        MsgBox "保存できませんでした"
    End If

    result = ExcelOpenFileSave_Example5("C:\ExcelVBA\ワークブック\Book1.xlsx")
    If result = False Then
        MsgBox "保存できませんでした"
    End If

End Sub

【例1】

' ------------------------------------------------------------
' 説明:Excelファイルを開いて上書き保存する
' 引数:1:読み込むファイル名
' 備考:ファイルが読み取り専用になっている場合の対策が必要
' ------------------------------------------------------------
Function ExcelOpenFileSave_Example1(ByVal in_name As String) As Boolean
    Dim wb As Workbook
    Dim ret As Boolean

    On Error Resume Next

    Set wb = Workbooks.Open(in_name)   ' ブックを開く

    ' ----------------------
    ' 例:適当な処理
    ' ----------------------
    wb.Sheets(1).Range("A1") = 123
    
    ' 読み取り専用が設定されている場合保存しないがエラーにもならないので保存処理しない
    If (GetAttr(in_name) And vbReadOnly) = vbReadOnly Then
        ExcelOpenFileSave_Example1 = False
    Else
        ' 上書き保存
        wb.Save
        ExcelOpenFileSave_Example1 = True
    End If
    
    ' ブックを閉じる(保存しない)
    wb.Close SaveChanges:=False
    Set wb = Nothing
End Function

【例2】

' ------------------------------------------------------------
' 説明:Excelファイルを開いて名前を付けて保存
'       既にファイルがある場合も、確認なく上書き保存
' 引数:1:読み込むファイル名
'       2:書き込むファイル名
' 備考:
' ------------------------------------------------------------
Function ExcelOpenFileSave_Example2(ByVal in_name As String, ByVal out_name As String) As Boolean
    Dim wb As Workbook

    On Error Resume Next

    Set wb = Workbooks.Open(in_name)   ' ブックを開く

    ' ----------------------
    ' 例:適当な処理
    ' ----------------------
    wb.Sheets(1).Range("A1") = 456

    ' 名前を付けて保存(既にファイルがある場合、上書き保存)
    Application.DisplayAlerts = False   ' 確認メッセージを非表示
    wb.SaveAs out_name                  ' ファイルを出力
    Application.DisplayAlerts = True    ' 確認メッセージを表示(元に戻す)
    
    If Err.Number > 0 Then
        ExcelOpenFileSave_Example2 = False
    Else
        ExcelOpenFileSave_Example2 = True
    End If
    
    ' ブックを閉じる(保存しない)
    wb.Close SaveChanges:=False
    Set wb = Nothing
End Function

【例3】

' ------------------------------------------------------------
' 説明:Excelファイルを開いて名前を付けて保存
'       既にファイルがある場合は確認画面を出す
'       既にファイルがある場合は、確認なく上書き保存
' 引数:1:読み込むファイル名
'       2:書き込むファイル名
' 備考:読み取り専用ファイルに保存しようとすると、確認画面は出ない
' ------------------------------------------------------------
Function ExcelOpenFileSave_Example3(ByVal in_name As String, ByVal out_name As String) As Boolean
    Dim wb As Workbook

    On Error Resume Next

    Set wb = Workbooks.Open(in_name)   ' ブックを開く

    ' ----------------------
    ' 例:適当な処理
    ' ----------------------
    wb.Sheets(1).Range("A1") = 789

    ' 名前を付けて保存するが、既にファイルがある場合は確認画面を出す
    wb.SaveAs out_name

    ' 「いいえ」と「キャンセル」への対応(保存できなかった場合も同じ)
    If Err.Number > 0 Then
        ExcelOpenFileSave_Example3 = False
    Else
        ExcelOpenFileSave_Example3 = True
    End If
    
    ' ブックを閉じる(保存しない)
    wb.Close SaveChanges:=False
    Set wb = Nothing
End Function

【例4】

' ------------------------------------------------------------
' 説明:Excelファイルを開いて名前を付けて保存
'       既にファイルがある場合は、確認なく上書き保存
' 引数:1:読み込むファイル名
'       2:書き込むファイル名
' 備考:
' ------------------------------------------------------------
Function ExcelOpenFileSave_Example4(ByVal in_name As String) As Boolean
    Dim wb As Workbook
    Dim out_name As Variant

    On Error Resume Next

    Set wb = Workbooks.Open(in_name)   ' ブックを開く

    ' ----------------------
    ' 例:適当な処理
    ' ----------------------
    wb.Sheets(1).Range("A1") = "ABC"

    'ダイアログで保存先・ファイル名を指定
    out_name = Application.GetSaveAsFilename

    ' 「いいえ」と「キャンセル」への対応
    If out_name = False Then
        ExcelOpenFileSave_Example4 = False
    Else
        wb.SaveAs out_name
        ' 上書き保存の場合、「いいえ」と「キャンセル」への対応
        If Err.Number > 0 Then
            ExcelOpenFileSave_Example4 = False
        Else
            ExcelOpenFileSave_Example4 = True
        End If
    End If
    
    ' ブックを閉じる(保存しない)
    wb.Close SaveChanges:=False
    Set wb = Nothing
End Function

【例5】

' ------------------------------------------------------------
' 説明:Excelファイルを開いて名前を付けて保存
'       既にファイルがある場合はナンバリングしたファイル名で保存
'       既にファイルがある場合は、確認なく上書き保存
' 引数:1:読み込むファイル名
'       2:書き込むファイル名
' 備考:
' ------------------------------------------------------------
Function ExcelOpenFileSave_Example5(ByVal in_name As String, ByVal out_name As String) As Boolean
    Dim wb As Workbook

    Set wb = Workbooks.Open(in_name)   ' ブックを開く

    ' ----------------------
    ' 例:適当な処理
    ' ----------------------
    wb.Sheets(1).Range("A1") = "DEF"

    out_name = FilenameAddNumber(out_name)
    If out_name = "" Then
        ExcelOpenFileSave_Example5 = False
    Else
        wb.SaveAs out_name
        ExcelOpenFileSave_Example5 = True
    End If
    
    ' ブックを閉じる(保存しない)
    wb.Close SaveChanges:=False
    Set wb = Nothing
End Function

例5を使用する場合は、ナンバリングしたファイル名を作成するから、FilenameAddNumber()関数をコピーしてください。

コメント