ブックの保存済みチェック
VBAでの処理で、処理対象のブックが保存済みかどうかをチェックしたい場合があります。
利用する場面としては、処理対象のブックを保存するときです。保存済みであれば上書き保存を行い、未保存であれば、保存予定の名前と同名のブックの存在を確認して保存する、という流れの中で保存状態の判定に使います。
保存済みのチェックは以下のマクロで行います。
ソースコード
1 2 3 4 5 6 7 8 9 |
'// 引数:Excelブックのフルパスを指定する Public Function IsSaved(a_sFilePath) As Boolean '// パス区切り文字が入っていれば保存済みとみなす If (InStr(1, a_sFilePath, "\") > 0) Then IsSaved = True Else IsSaved = False End If End Function |
処理説明
保存済みのブックはWorkbooks(1).FullNameを見ると、フルパスの”C:\aaa\aaa.xlsm”などのようになります。
ところが未保存のブックは保存先が確定していないことからパスがないためWorkbooks(1).FullNameを見ても、フォルダがなく未確定ファイル名の”Book1″などになります。
拡張子も付きません。
使い方
以下のコードでは、未保存の場合と保存済みの場合のそれぞれをチェックしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Sub IsSavedTest() Dim newWorkbook As Workbook '// 新規作成ワークブック Dim savedStatus As Boolean '// 保存状態判定結果 Dim savedName '// 保存時のファイル名 '// 新規ブックを作成 Set newWorkbook = Workbooks.Add '// 保存状態を取得(ここでは未保存のFalseが返却される) savedStatus = IsSaved(newWorkbook.FullName) Debug.Print savedStatus '// 保存 savedName = "C:\" & Format(Now, "yyyymmdd-hhmmss") & ".xlsx" '// 通常はここで同名ファイルの存在チェックを入れることが多いと思いますが省略します '// 新規ブックを保存 Call newWorkbook.SaveAs(Filename:=savedName) '// 再度保存状態を取得(ここでは保存済みのTrueが返却される) savedStatus = IsSaved(newWorkbook.FullName) Debug.Print savedStatus End Sub |
まず7行目で新規ブックを作成します。
10行目で作成した新規ブックの保存状態を確認します。この時点では未保存のためFalseが返却されます。
17行目で同名ファイルチェック処理を省略していますが、必要な場合は「VBAでファイルの存在をチェックする」ページを参照してください。
20行目で一度新規ブックを保存します。ここではCドライブ直下にシステム日時のファイル名で保存しています。
23行目で保存したブックの保存状態を確認します。この時点では保存済みのためTrueが返却されます。
Macの場合のパス区切り文字はコロン(:)
このブログを見ている方はほとんどがWindows利用者と思うので関係ないとは思いますが一応書いておきます。
MacはUnixベースのためパスの区切り文字が\ではありません。
Unixベースのためスラッシュ(/)かと思いきやそうでもありません。
MacでのFullNameプロパティはコロン(:)でパス区切りがされているため、もしMacで実装する場合は\での判定部分を:に変更してください。