*当ブログではアフェリエイト広告を利用しています。

VBA

【VBA】保存忘れをもうしない!閉じるだけで自動保存&バックアップ!

momeq
モー
モー

今回はVBAで自動保存とバックアップを行うコードを作ってみました。

今回のコードでやりたかったことは次の通りです。

ブックを閉じたときに

  1. 自動に上書き保存
  2. 同じフォルダ内にBUCKUPフォルダがなければ作成
  3. BUCKUPフォルダ内に「ブック名+日時」のファイルをバックアップ
ニャー
ニャー

このVBAがあれば、保存し忘れなし、かつ、保存するたびに日時が入った自動バックアップが取れるということだにゃ。

モー
モー

重要な内容が入っているシートであれば、これくらいのバックアップシステムを入れておきたいところです。

それでは詳しくみていきましょう。

完成コードの確認

モー
モー

まずは、完成したコードを確認しておきましょう。

Sub Auto_Close()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim fso As Object
    Dim path
    path = wb.path & "\BUCKUP\"
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If Not fso.FolderExists(path) Then
        fso.CreateFolder path
    End If
    
    saveFolder = path & fso.GetBaseName(wb.Name) & "_" _
                 & Format(Now, "yyyymmddhhmmss") & ".xlsx"
    Application.DisplayAlerts = False
    wb.Save
    wb.SaveAs saveFolder, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
End Sub
ニャー
ニャー

全体感として、そんなに長くないコードかにゃ。意外と簡単にできるもんだにゃ。

コードの詳細

自動に上書き保存

モー
モー

自動実行は簡単にできます。プロシージャの名前を「Auto_Close」にするだけです。

自動実行

Sub Auto_Close()

//ブックを閉じたときに自動実行するコードを記載

End Sub

VBAでの自動実行は簡単で、上のように「Auto_Close」にするだけで、自動実行できます。

ですので、その中で、上書き保存のコードを書いておけば、ブックを閉じたときに、自動で保存ができます。

ちなみに、上書き保存は、次のように書きます。

上書き保存

ブック名.save

ニャー
ニャー

次のように書いておけば、自動上書き保存ができるんだにゃ。これだけでも使い道ありそうだにゃ。

Sub Auto_Close()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    wb.Save
End Sub

BUCKUPフォルダの作成

モー
モー

BUCKUPフォルダの作成です。今回は、FileSystemObject(通称:fso)でフォルダ操作を行なっていますが、MkDir()やDir()を使っても実現できます。

まずは、BUCKUPフォルダを作り手順を整理しておきましょう。

  1. 同じ階層にBUCKUPフォルダがあるかの確認
  2. なければ、フォルダの作成
ニャー
ニャー

上のように、あれば実行せず、なければ実行など2択を取る場合、ifを使うんだにゃ。

また、fsoを使うことで、フォルダがあるかを簡単に確認できるんだにゃ。

フォルダがあれば・・・

if //フォルダがなければ then

//フォルダの作成

end if

フォルダの存在を確認

fso.FolderExists(確認したいフォルダのパス)

返値:True or False

モー
モー

フォルダの確認ができ、なければ作成します。

フォルダの作成

fso.CreateFolder 作りたいフォルダのパス

実際にフォルダがなければ作成のコードは次のとおりとなります。


    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim fso As Object
    Dim path
    path = wb.path & "\BUCKUP\"
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If Not fso.FolderExists(path) Then
        fso.CreateFolder path
    End If

「ブック名+日時」のファイルをバックアップ

モー
モー

ブック名と日時でファイルを作ります。手順は次の感じになりますね。

  1. 実行中のブック名(拡張子より前)を取得
  2. 日時を取得し「20230202123456」の形式で取得
  3. ファイルを保存(マクロ実行なし)
ニャー
ニャー

まずは、ブック名を取得するんだけど、拡張子を除いた名前の取得にはfsoを使えるんだにゃ。

拡張子以外の名前の取得

fso.GetBaseName(取得したいファイル名)

モー
モー

日時は「Now」で取得できますね。「Format」と組み合わせると、自由な形式で時間を取得可能です

形式を指定して日時を取得

Format(Now, “yyyymmddhhmmss”)

「yyyymmddhhmmss」は左から順に年、月、日、時、分、秒を表します。間にハイフンやスラッシュを入れることもできるので、好きな形式を指定できます。

モー
モー

最後にファイルを保存します。保存の時は、マクロがない状態で保存したいので、拡張子を「.xlsm」で保存します。

.xlsm形式で名前をつけて保存

ファイル名 = 付けたいファイル名 + “.xlsx”

ブック.SaveAs ファイル名, FileFormat:=xlOpenXMLWorkbook

ニャー
ニャー

.xlsxに拡張子を変えて、SaveAsの引数に「FileFormat:=xlOpenXMLWorkbook」を付けることで、マクロなし保存ができるんだにゃ。

Sub Auto_Close()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim fso As Object
    Dim path
    path = wb.path & "\BUCKUP\"
    
    saveFolder = path & fso.GetBaseName(wb.Name) & "_" _
                 & Format(Now, "yyyymmddhhmmss") & ".xlsx"
    Application.DisplayAlerts = False
    wb.Save
    wb.SaveAs saveFolder, FileFormat:=xlOpenXMLWorkbook
    Application.DisplayAlerts = True
End Sub
モー
モー

拡張子を変更して保存しると、アラートが出てしまします。

ですので、「Application.DisplayAlerts = False」にして、アラートが出ないようにしてから変更しています。

プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

TechAcademy [テックアカデミー]

モー
モー

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。

TechAcademyのおすすめポイント
  • オンラインで選抜された現役エンジニアから学ぶことができる
  • 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
  • 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている
ニャー
ニャー

無料体験や相談もあるから、一度試してみてもいいんだにゃ!

\無料体験、無料相談はこちらから/



記事URLをコピーしました