VBA練習問題
VBA100本ノック 20本目:ブックのバックアップ

VBAを100本の練習問題で鍛えます
公開日:2020-11-09 最終更新日:2021-01-13

VBA100本ノック 20本目:ブックのバックアップ


開いているブックのバックアップファイルを作成する問題です。
フォルダーの作成も行います。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。

VBAテスト用のサンプルデータはご自身でご用意ください。


出題

出題ツイートへのリンク

#VBA100本ノック 20本目
マクロブック(ThisWorkbook)と同じフォルダに"BACKUP"フォルダを作成し、
"BACKUP"に自身(ThisWorkbook)のバックアップを以下の名称で保存してください。
ブック名_yyyymmddhhmm.xlsm
マクロ終了時には元のブックが開いている状態にしてください。
※繰り返し実行を考慮


VBA作成タイム

この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。


他の人の回答および解説を見て、書いたVBAを見直してみましょう。


頂いた回答

解説

フォルダ作成はMkDirステートメントで出来ますが、フォルダが存在しているとエラーになるのでDir関数で存在確認する必要があります。
Dir関数は制限もありますが、まずは使えるようになっておいた方が良いでしょう。
開いているブックのコピーを作成するにはSaveCopyAsメソッドが便利です。

Sub VBA100_20_01()
  Dim wb As Workbook
  Dim sPath As String
  Dim sFile As String
  Dim sExt As String
  
  Set wb = ThisWorkbook
  sPath = wb.Path & "\BACKUP"
  If Dir(sPath, vbDirectory) = "" Then
    MkDir sPath
  End If
  
  sExt = Mid(wb.Name, InStrRev(wb.Name, "."))
  sFile = Left(wb.Name, InStrRev(wb.Name, ".") - 1) & _
      Format(Now(), "_yyyymmddhhmm") & sExt
  wb.SaveCopyAs sPath & "\" & sFile
End Sub

hhmmまでにしたのは、SaveCopyAsが上書きになる事を意識してもらう為です。
また、FileSystemObjectは是非使えるようになっておきたいところです。
機能が豊富なので、必要な機能を順次使いながら覚えていけばよいと思います。
VBAサンプルは記事補足にて。


補足

実務としては、hhmmは中途半端なので普通はhhmmssにするかなとは思います。
1分ですと結構長いので、その間にどのような操作があるか分かりません。
その間に、確認の為にバックアップファイルを開いてしまう事もあるかもしれません。
その場合は、再実行するとSaveCopyAsがエラーになる可能性が出てきます。
また、新規ブックにVBAを貼り付けて実行した場合、ThisWorkbook.Pathは空白になります。

上記を考慮し、FileSystemObjectを使ったものが以下になります。

Sub VBA100_20_02()
  Dim wb As Workbook
  Dim sPath As String
  Dim sFile As String
  Dim sExt As String
  
  Set wb = ThisWorkbook
  If wb.Path = "" Then
    MsgBox "新規ブックです。" & vbLf & "保存してから実行してください。"
    Exit Sub
  End If
  
  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  sPath = wb.Path & "\BACKUP"
  If Not fso.FolderExists(sPath) Then
    fso.CreateFolder (sPath)
  End If
  
  sExt = fso.GetExtensionName(wb.Name)
  sFile = fso.GetBaseName(wb.Name) & _
      Format(Now(), "_yyyymmddhhmm.") & sExt
  Set fso = Nothing
  
  On Error Resume Next
  wb.SaveCopyAs sPath & "\" & sFile
  If Err Then
    MsgBox Err.Description
  End If
End Sub

※上記VBAは先のDir+MkDirと比べやすいように記述しました。

上記では、ThisWorkbook.Saveしていませんが、適宜必要に応じて入れることになると思います。

また、回答では、ファイルコピーを使ったものも多くありました。
この方法ももちろん良いと思います。
その場合は、
・ThisWorkbook.Saveをどうするか
・コピー先のファイルが存在していた場合
・コピー先が存在し削除できない場合
等々の検討が必要になってくると思います。


サイト内関連ページ

第64回.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
・ブックを閉じる ・ブックを上書き保存 ・ブックに名前を付けて保存 ・ブックのコピーを保存 ・ブックを閉じる・保存の実践例
第79回.ファイル操作Ⅰ(Dir)|VBA入門
・Dir関数 ・Dir関数の使用例 ・Dir関数の実践例 ・Dir関数の制限について ・Dir関数の関連記事
第80回.ファイル操作Ⅰ(その他)|VBA入門
・ファイル操作で使う、ステートメントと関数 ・ファイル操作の使用例 ・ファイル操作の実践例 ・ファイル操作について
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例
DIR関数で全サブフォルダの全ファイルを取得|VBAサンプル
・Dir関数でサブフォルダも含むファイル一覧を取得するVBA ・ファイル一覧を取得するVBAの使用例と解説 ・Dir関数の関連記事
Dir関数の制限について|VBA技術解説
・3桁拡張子の指定時の問題 ・256バイトを超えるパス名が扱えない ・UNICODEファイル名が扱えない ・特殊なネットワークドライブでエラー ・Dir関数の制限の最後に




同じテーマ「VBA100本ノック」の記事

17本目:重複削除(ユニーク化)
18本目:名前定義の削除
19本目:図形のコピー
20本目:ブックのバックアップ
21本目:バックアップファイルの削除
22本目:FizzBuzz発展問題
23本目:シート構成の一致確認
24本目:全角英数のみ半角
25本目:マトリックス表をDB形式に変換
26本目:ファイル一覧作成
27本目:ハイパーリンクのURL


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ