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

VBAを100本の練習問題で鍛えます
最終更新日: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入門
ワークブックを閉じる場合や保存する場合のマクロVBAの説明です。閉じる時に保存するか保存しないかを指定できます、また、ブックを保存するにも、上書きなのか別ファイルにするのか等によってVBAの記述がそれぞれ違ってきます。ブックを閉じる ブックを閉じるには、WorkbookのCloseメソッドを使用します。
第79回.ファイル操作Ⅰ(Dir)|VBA入門
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。引数に指定したファイルが存在すると、そのファイル名を返し存在しないと空欄を返します。
第80回.ファイル操作Ⅰ(その他)|VBA入門
VBAではファイル操作するためのステートメントと関数が多数用意されています、マクロVBAでファイル操作する場合は、これらの用意されたステートメントや関数を使い処理を実現します。ファイル操作で使う、ステートメントと関数 ChDriveステートメント ChDirステートメント CurDir関数 MkDirステートメント…
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし機能が大変多いため、これらを全て覚えるという事は困難です。
DIR関数で全サブフォルダの全ファイルを取得|VBAサンプル
指定フォルダ以下の全サブフォルダ内の全ファイルを取得する場合、通常はFileSystemObjectの再帰モジュールで実現しますが、これをDir関数だけで、かつ、再帰ではなく二重ループで実現しています。FileSystemObjectの再帰プロシージャーについては、エクセルでファイル一覧を作成 こちらをご覧ください。
Dir関数の制限について|VBA技術解説
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。




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

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


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

VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)
DXってなんだ? ITと何が違うの?|エクセル雑感(2021-06-24)
エクセルVBA 段級位 目安|エクセル雑感(2021-06-21)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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