Access2000VBA・Excel2000VBA独学~現在開いているファイルを、同じ形式で、かつリネームして(YYYYMMDDHHMMSSをつけて、指定フォルダにバックアップするサンプルプログラム(ファイルの複製・世代バックアップ)~
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
まず、マクロの記録機能で、適当なマクロを「個人用マクロブック」に作り、いったんファイルを閉じます。
そうすると、次回の立ち上げ時に、Personal.xlsbというファイルが一緒に、非表示で立ち上がります。
「リボンの開発タブ→VisualBasicボタン」で出てくるVBE(VisualBasicEditor)の画面の左側、「プロジェクトエクスプローラ」にて確認できます。
(過去にすでに何らかのマクロを作ったことがある場合は、Personal.xlsbというファイルがすでにできていると思いますが、念のため、再度、マクロの記録機能で、適当なマクロを作っておきます。そして、いったん閉じて、xlsxファイルを開きます。)
で、Personal.xlsb の標準モジュールに、以降に挙げたコードをコピペします。
あとは、この「BackUpMake_YYYYMMDD_HHMMSS_01()」というこのプログラムを、クイックツールバーの自作ボタンに登録すれば、そのボタンの押下をするだけで、xlsxもxlsmも複製コピーが可能です。
つまり、世代バックアップができます。
★注意
ActiveWorkbook(現在開いているブック)で「SaveAs」メソッドを使ってしまうと、「現在開いているファイルの内容」が、リネームして世代バックアップしたファイルのほうに置きかわってしまい、「1番最初に開いていたモトのExcelファイル」ではなくなってしまいます。
結果、世代バックアップがちゃんとできません。
また、「ファイル名がまだ決まっていない場合や、xlsやxlsmにも対応したい場合」、のことも考えると、「SaveAs」メソッドだと僕のような初心者にはわかりにくいです。
VBAに詳しい人なら、Workbooksコレクションをうまく使う方法もあるかもしれませんが、僕のような初心者にとっては、トリッキーに感じてしまい、メンテも面倒くさいです。
よって、本サンプルでは、「SaveAs」メソッドを使わずに、「SaveCopyAs 」メソッドを」使っています。
ただ、「現在のモトとなるファイル」と異なるファイル形式の拡張子を指定するとエラーになるので、一応事前に、If文にて、「ActiveWorkbook.FileFormat = xlExcel8 」みたいな感じで「現在のモトファイルがどんなファイル形式なのか?」のチェックをかけてます。(それによって、拡張子も変えています。)
ただこれも、チェックしなくても自由に保存形式を指定できる方法がきっとあると思います。それはご自分でも調べてみてください。
一応、「SaveAs」メソッドの「FileFormat」引数を使うことで実現できるようです。
(保存後に保存先のファイルに入れ替わらない方法が見つかれば尚いいですね!)
参考ページ
『保存するフォーマットの指定』
『【ExcelVBA入門】SaveAsメソッドを使ったファイル保存方法を徹底解説!』
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
' ' Sub BackUpMake_YYYYMMDD_HHMMSS_01() Dim s_Path01 As String Dim o_SrcWb01 As Workbook Dim s_XlFNm01 As String Dim s_YMDHMS01 As String '世代バックアップのコピー元となるブックの設定 Set o_SrcWb01 = ActiveWorkbook 'バックアップ先のパスの設定 s_Path01 = "D:\1\" 'Now()で取得した日付と日時の整形(/や:を取る、など) s_YMDHMS01 = Replace(Now(), "/", "", , , vbBinaryCompare) s_YMDHMS01 = Replace(s_YMDHMS01, ":", "", , , vbBinaryCompare) s_YMDHMS01 = Replace(s_YMDHMS01, " ", "_", , , vbBinaryCompare) ' '日付と時間のあいだに何もいらなければ、以下の1行でOK。今はコメントアウト ' '「yyyyymmddhhmmss」は、「yyyyymmdd_hhmmss」「yyyyymmdd_hh-mm-ss」とかなどと書いてもOKです。 ' s_YMDHMS01 = Format(Now(), "yyyyymmddhhmmss") 'ファイル名を取得 s_XlFNm01 = o_SrcWb01.Name '一回も保存されていないファイルかどうかのチェック。 '一回も保存されていないファイルは拡張子が付かない性質を利用。 '保存されていなければ中断し、保存されていれば念のため上書き。 If 0 = InStr(1, s_XlFNm01, ".xls", vbBinaryCompare) Then 'まだ保存されたことが無いファイルなら処理を中断して終わる。 MsgBox "まだ一度も保存がなされていないファイルです。" _ & vbCrLf & "" _ & vbCrLf & "いったん、保存してから再度実行してください。" Exit Sub Else 'そうじゃなければ念のため、ここまでの状態をいったん上書きして次へ。 '(まだ 1回も保存されていないファイルには対応していません。 ' その場合、ここでエラーになります。) o_SrcWb01.Save End If 'ファイル名から拡張子のカット。 'Len関数などを使うのが面倒くさかったし、のちに、SaveCopyAsを使うので、 'とりあえず Replace関数でやってしまった。 s_XlFNm01 = Replace(s_XlFNm01, ".xls", "", , , vbBinaryCompare) s_XlFNm01 = Replace(s_XlFNm01, ".xlxs", "", , , vbBinaryCompare) s_XlFNm01 = Replace(s_XlFNm01, ".xlsm", "", , , vbBinaryCompare) 'ファイル名に、YYYYMMDD_HHMMSS を付加。 s_XlFNm01 = s_XlFNm01 & "_" & s_YMDHMS01 'ファイル名に、現在のアクティブなブックのファイル形式と同じ拡張子を付加。 If o_SrcWb01.FileFormat = xlExcel8 Then 'もしこのマスタファイルがxls形式(56)だったら '「xls」で複製書き出し。 s_XlFNm01 = s_XlFNm01 & ".xls" ElseIf o_SrcWb01.FileFormat = xlOpenXMLWorkbook Then 'もしこのマスタファイルがxlsx形式(51)だったら '「xlsx」で複製書き出し。 s_XlFNm01 = s_XlFNm01 & ".xlsx" ElseIf o_SrcWb01.FileFormat = xlOpenXMLWorkbookMacroEnabled Then 'もしこのマスタファイルがxlsm形式(52)だったら '「xlsm」で複製書き出し。 s_XlFNm01 = s_XlFNm01 & ".xlsm" End If '冒頭で設定したフォルダに、元ファイルの複製を別名で書き出し。 o_SrcWb01.SaveCopyAs s_Path01 & s_XlFNm01 MsgBox "完了しました。" End Sub ' ' |