WSH(Windows Scripting Host)を使ってデスクトップのフルパスを取得してアクティブなブックをデスクトップに保存するマクロをご紹介しました。
このマクロに限らず、保存を行うマクロをVBAで作るときには、考えておかなければいけないことは、いろいろとあります。
いろいろある中でまず考えるべきは、同じ名前のファイルが存在していたときにどうするか、でしょう。
保存時に同じ名前のファイルがあったときの挙動
VBAのSaveAsメソッドで保存をしようとしたときに同じファイルが存在していた場合、
「この場所に'○○'という名前のファイルが既にあります。置き換えますか?」
という[はい][いいえ][キャンセル]という3つのボタンが並んだ確認メッセージが表示されます。
このメッセージで[はい]を選択した場合は、上書き保存が行われます。
問題は[いいえ]と[キャンセル]です。
[いいえ]でも[キャンセル]でも、エラーが発生してしまうのです。
これをどうするのかは様々な仕様が考えられます。
事前に同名のファイルが存在しないかチェックする仕様。強制的に上書き保存してしまう仕様。ファイル名に枝番をつけて保存する仕様などなど。
Dir関数で事前にチェックして同名ファイルがあったときは中断する
無難なのは、同じ名前のファイルが存在しないかを事前にチェックして、存在していた場合はマクロを終了してしまうという仕様でしょうか。
Dim wsh As Object ' IWshRuntimeLibrary.WshShell
Dim dt_path As String
Dim bk_name As String
Set wsh = CreateObject("WScript.Shell")
dt_path = wsh.SpecialFolders("desktop")
Set wsh = Nothing
bk_name = ActiveWorkbook.Name
bk_name = dt_path & "\" & bk_name
If Dir(bk_name) <> "" Then
MsgBox "同じ名前のブックがデスクトップに存在するのでマクロを中断します。"
Exit Sub
End If
End Sub
デスクトップのフルパスを取得して、パスを含んだファイル名を作成する処理の考え方は、既にご紹介しているマクロと同じです。
Set wsh = CreateObject("WScript.Shell")
dt_path = wsh.SpecialFolders("desktop")
Set wsh = Nothing
bk_name = ActiveWorkbook.Name
bk_name = dt_path & "\" & bk_name
上記の処理で作られた、パス込みのファイル名を、Dir関数の引数に指定して同じ名前のファイルが存在しないかを調べます。
If Dir(bk_name) <> "" Then
Dir関数は、ファイルが存在していない場合は、空白文字列を返します。
ですから、Dir関数の戻りが空白でない場合は、同じ名前のファイルが存在していることになります。
ファイルの存在確認は、FileSystemObjectのFileExistsメソッドでもできますが、今回のような処理なら、わざわざFileSystemObjectをCreateObjectしなくても、VBA標準のDir関数で十分でしょう。
Dir関数の戻りが空白でない場合、同じ名前のファイルが存在している場合に、メッセージを表示してマクロを終了しています。
MsgBox "同じ名前のブックがデスクトップに存在するのでマクロを中断します。"
Exit Sub
マクロを作る側からすると、この事前チェックして中断する仕様が一番無難ですが、マクロを使う側からは、いろいろと要望も出てきます。他の仕様にした場合の具体的なマクロは、別記事としてご紹介します。
- Newer:少人数で質問しやすいのが良かった
- Older:掛け算の計算結果を切り捨てにするには?-INT・ROUNDDOWN
Home » エクセルマクロ・Excel VBAの使い方 » Workbooks・Workbook » VBAで保存時に同じ名前のファイルがあったときは中断する