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

VBAを100本の練習問題で鍛えます
最終更新日:2020-11-10

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


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


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


出題

出題ツイートへのリンク

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


頂いた回答

解説

フォルダ作成は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ステートメント RmDirステートメント Killステートメ…
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし機能が大変多いため、これらを全て覚えるという事は困難です。
DIR関数で全サブフォルダの全ファイルを取得|VBAサンプル
指定フォルダ以下の全サブフォルダ内の全ファイルを取得する場合、通常はFileSystemObjectの再帰モジュールで実現しますが、これをDir関数だけで、かつ、再帰ではなく二重ループで実現しています。FileSystemObjectの再帰プロシージャーについては、エクセルでファイル一覧を作成 こちらをご覧ください。
Dir関数の制限について|VBA技術解説
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。




同じテーマ「Python入門」の記事

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


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

VBA100本ノック 34本目:配列の左右回転|VBA練習問題(11月28日)
VBA100本ノック 33本目:マクロ記録の改修|VBA練習問題(11月26日)
VBA100本ノック 32本目:Excel終了とテキストファイル出力|VBA練習問題(11月25日)
VBA100本ノック 31本目:入力規則|VBA練習問題(11月24日)
将棋とプログラミングについて~そこには型がある~|エクセル雑感(11月22日)
VBA100本ノック 30本目:名札作成(段組み)|VBA練習問題(11月22日)
VBA100本ノック 29本目:画像の挿入|VBA練習問題(11月21日)
VBA100本ノック 28本目:シートをブックに分割|VBA練習問題(11月19日)
VBA100本ノック 27本目:ハイパーリンクのURL|VBA練習問題(11月18日)
VBA100本ノック 26本目:ファイル一覧作成|VBA練習問題(11月17日)


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

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




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


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



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