VBA

ワークブックの保存方法(Save,SaveAsの使い方、名前が既にある場合に(番号)を後ろに付ける方法)

記事内に商品プロモーションを含む場合があります
このページでわかること

ワークブックの保存方法(SaveとSaveAs)の使い方がわかります。

覚えること
  1. 上書き保存:ワークブックオブジェクト.Save
  2. 新規ファイルではSaveメソッドは極力使わない。
  3. 名前を付けて保存:ワークブックオブジェクト.SaveAsメソッド
  4. SaveAsは引数が多いので、
    最低限Filename
    できればFileformatやPassword,WriteResPasswordあたりを覚えていくのがおすすめ
  5. 名前が被っている場合は上書き保存するかどうかの警告文が出るので注意
    回避する方法はApplication.DisplayAlerts = Falseを入れる
    (2),(3)と番号を付けて保存する方法は下記詳細をご覧ください。

こんにちはhokkyokunです。

ワークブックの保存方法についてまとめました。
今回は良く使うSaveメソッドとSaveAsメソッドについてご紹介します。

上書き保存(Saveメソッド)

Saveメソッドは基本的に既に保存しているファイルを上書き保存するメソッドです。
しかし、新規ファイルでもSaveメソッドは使えます。
その際は注意が必要です。

既に保存されているファイルを上書き保存する場合

とても簡単です。

構文:ワークブックオブジェクト.Save
Sub 上書き保存()
ActiveWorkbook.Save
End Sub

新規でブックを作成した場合

新規でブックを作った場合は要注意です。

Sub ブック新規作成から上書き保存()

'ブックを作成し、
Workbooks.Add

'上書き保存する
ActiveWorkbook.Save

End Sub

動かしてみるとわかりますが、何事もなくプログラムは作動します。
でも、どこに保存されているのでしょうか?

正解は
デフォルトで指定されているフォルダです(カレントフォルダ)。
デフォルトで指定されているフォルダってどこでしょう?
探す方法があります。

デフォルトで指定されているフォルダを探す方法

簡単な探し方です。

Sub ダイアログ出現()

Application.GetOpenFilename

End Sub

これでダイアログがデフォルトのフォルダを開くと思います。
最初に開いたフォルダに保存されることになります。

Saveメソッドを新規ファイルで使うのはおすすめしません。

保存したいところであればいいのですが、
そうでない場合が多いと思いますし、誤動作の温床になるので
基本的にはSaveメソッドは既に保存しているファイルの上書きのみに限定したほうが言いと思います。

名前を付けて保存(SaveAsメソッド)

新規でブックを作成するときはこちらを使いましょう。

構文:ワークブックオブジェクト.SaveAs(Filename , [FileFormat], [Password], [WriteResPassword], [ReadOnlyRecommended], [CreateBackup], [AccessMode], [ConfictResxlution], [AddToMru], [TextCodepage], [TextVisualLaycut], [Local])

引数はたくさんあります。
全部使えなくて大丈夫です。
重要なものだけピックアップします。

  • FileName:=ファイルのパス名とファイル名 省略可ですが、省略するとデフォルトのフォルダに保存されます。
  • FileFormat:=ファイルの形式を選択します。
    .csv :xlCSV
    .txt :xlText
    .xlsx :xlOpenXMLWorkbook
    .xlsm:xlOpenXMLWorkbookMacroEnabled
    ※マクロを有効にして保存したい場合はFilenameで拡張子を.xlsmにし、FileFormatをxlOpenXMLWorkbookMacroEnabledで保存してください。
  • Password:15文字以内の文字列を指定。大文字と小文字は区別されます。
  • WriteResPassword:パスワードを指定し、パスワードを入力しないで開くと読み取り専用になる。

新規ブックを作成し、マクロ有効ブックにして保存してみます。

Sub ブック新規作成から名前をつけて保存()

'ブックを作成し、
Workbooks.Add

'名前を付けて保存する
'マクロ有効で保存するには拡張子を.xlsmにし、FileFormatをxlOpenXMLWorkbookMacroEnabledにする。
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\サンプルファイル.xlsm", _
                    FileFormat:=xlOpenXMLWorkbookMacroEnabled

'名前を付けて保存したファイルは開いたままなので、もう使わないなら閉じましょう。
ActiveWorkbook.Close
End Sub

名前が被っていたときの処理

フォルダ内に同じ名前のファイルがあった場合警告文がでます。

上書きをする場合は警告文を無視するコードを入れましょう。

Sub ブック新規作成から名前を付けて保存()

'ブックを作成し、
Workbooks.Add

'警告文を無視する
Application.DisplayAlerts = False

'名前を付けて保存する
'マクロ有効で保存するには拡張子を.xlsmにし、FileFormatをxlOpenXMLWorkbookMacroEnabledにする。
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\サンプルファイル.xlsm", _
                    FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
                    writerespassword:="Password"

'警告文を無視しない
Application.DisplayAlerts = True


'名前を付けて保存したファイルは開いたままなので、もう使わないなら閉じましょう。
ActiveWorkbook.Close

End Sub

上書き保存しない場合

ちょっとやっかいですが、こういう場合もあると思います。
よくあるファイル名の後ろに(2),(3)がつくやつを考えてみたいと思います。

Sub ブック新規作成から上書き保存()

Dim filePath As String 'ファイルのパス名
Dim fileName As String 'ファイル名
Dim i As Long 'ファイル名につけるインデックス番号

'格納する場所(パス名)
filePath = ThisWorkbook.Path & "\"

'先ず最初のファイルがあるかどうか検索
fileName = Dir(filePath & "サンプルファイル.xlsm")

'インデックス番号を1から始める
i = 1

'ブックを作成
Workbooks.Add

'ファイル名が存在しなくなるまでDo Loop文を繰り返す。
'ファイル名が存在しないインデックス番号=新規のファイルのインデックス番号
Do While fileName <> ""
    i = i + 1
    fileName = Dir(filePath & "サンプルファイル(" & i & ").xlsm")
Loop


'初回の場合はファイル名を「サンプルファイル」
'二回目以降の場合は「サンプルファイル」の後ろに()を付ける
If i = 1 Then
    fileName = "サンプルファイル.xlsm"
Else
    fileName = "サンプルファイル(" & i & ").xlsm"
End If

'名前を付けて保存する
'マクロ有効で保存するには拡張子を.xlsmにし、FileFormatをxlOpenXMLWorkbookMacroEnabledにする。
ActiveWorkbook.SaveAs fileName:=filePath & fileName, _
                    FileFormat:=xlOpenXMLWorkbookMacroEnabled, _
                    writerespassword:="Password"


'名前を付けて保存したファイルは開いたままなので、もう使わないなら閉じましょう。
ActiveWorkbook.Close

End Sub

まとめ

いかがでしょうか。

Saveは上書き保存
SaveAsは名前を付けて保存

という使い方を基本とするといいと思います。
エクセルを使う場合と同じ感覚で使えると思いますし。

名前が被らないコツを一つ

日付を入れる習慣が良いと思います。
例えば

Sub 保存の名前()
Dim bookName As String
bookName = Format(Date, "yyyymmdd") & "_保存したいファイル名.xlsx"
Debug.Print "bookName:" & bookName

End Sub

こうしておくと被る可能性が低くなりますし、一日に何度も使うのであればDateをNowとかに変えて時間を表記してもいいと思います。

ではでは。