
今回はマクロを使用した便利機能をジッピーと一緒に作成していきたいと思います。
日々の業務のほんの些細な手間をマクロで簡単に解決していき、1秒でも2秒でも作業を早く終わらせるマクロをジッピーと一緒に考えていきたいと思います。
まず、先に今回作成したExcelファイルを無料公開しますのでぜひ一緒に作っていきましょう。
この記事ではマクロ(VBA)を使用します。
マクロ初挑戦の方はこちらの記事からスタートすることをお勧めします。
Excelのマクロ初期設定ガイド

今回のメニューはこちら
① 選択範囲の入れ替え(罫線を除く)
② 指定したキーワードを含む行を抽出・コピー
③ 指定範囲の値をランダムに並び替える
④ 重複データを一発削除
⑤ Excelデータを自動保存&バックアップ
果たして全部できるかなぁ(笑)
サンプルの表を作成するからジッピーちょっと待っててね

それじゃあ、サンプル表ができたら次に進めよう!


このような表を作成しました。
意図的に意味ありげなカラーもセルに入っています。
まず、① 選択範囲の入れ替え(罫線を除く) この中身を罫線を崩さずカラーも入れ替えられるマクロ機能をジッピーに考えてもらいたいと思います。
じゃあジッピーお願いね。
選択した2つの範囲を罫線を除くすべてで入れ替えれるマクロが欲しいんだけどできるかな?

了解!タスクが求めているのは、選択した2つの範囲の「値・書式・背景色・フォント設定」などを入れ替え、罫線はそのまま保持するマクロだね。
早速、実装してみたよ!以下のVBAコードを使えば、選択した2つの範囲を罫線を除いた状態で入れ替えることができるよ。
🔨 VBAマクロ:選択範囲を罫線を除いて入れ替え
Sub SwapRangesWithoutBorders()
Dim rng1 As Range, rng2 As Range
Dim tempArr1 As Variant, tempArr2 As Variant
Dim ws As Worksheet
' シートの指定(アクティブシート)
Set ws = ActiveSheet
' 選択範囲を確認(2つの範囲を選択する)
On Error Resume Next
Set rng1 = Application.InputBox("1つ目の範囲を選択してください", Type:=8)
Set rng2 = Application.InputBox("2つ目の範囲を選択してください", Type:=8)
On Error GoTo 0
' 範囲が選択されていない場合
If rng1 Is Nothing Or rng2 Is Nothing Then
MsgBox "範囲を正しく選択してください。", vbExclamation
Exit Sub
End If
' 範囲サイズの確認
If rng1.Cells.Count <> rng2.Cells.Count Then
MsgBox "範囲のサイズが一致しません。", vbExclamation
Exit Sub
End If
' 一時保存用の配列に値・書式を格納(罫線は除外)
tempArr1 = rng1.Value
tempArr2 = rng2.Value
' 値を入れ替え
rng1.Value = tempArr2
rng2.Value = tempArr1
' 書式を入れ替え
Dim cell1 As Range, cell2 As Range
Dim i As Integer
For i = 1 To rng1.Cells.Count
Set cell1 = rng1.Cells(i)
Set cell2 = rng2.Cells(i)
' 背景色・フォント・数値書式を交換
Dim tempInterior As Variant, tempFont As Variant, tempNumberFormat As Variant
tempInterior = cell1.Interior.Color
tempFont = cell1.Font.Color
tempNumberFormat = cell1.NumberFormat
cell1.Interior.Color = cell2.Interior.Color
cell1.Font.Color = cell2.Font.Color
cell1.NumberFormat = cell2.NumberFormat
cell2.Interior.Color = tempInterior
cell2.Font.Color = tempFont
cell2.NumberFormat = tempNumberFormat
Next i
MsgBox "選択範囲を罫線を維持したまま入れ替えました!", vbInformation
End Sub
このマクロのポイント
✔ 選択した2つの範囲のデータを交換(罫線は維持)
✔ 背景色・フォント・数値書式なども入れ替え
✔ セルの数が一致しないとエラーを表示
✔ 安全に動作するようにエラーハンドリング付き
使い方
- マクロを実行(
SwapRangesWithoutBorders
を実行) - 1つ目の範囲を選択 → OK
- 2つ目の範囲を選択 → OK
- 罫線を維持したままデータ・書式が入れ替わる!

タスク、こんな感じでどうかな?
試してみて、もし改善点があったら教えてね!

なかなか長いプログラムになったんだね。
じゃあModule1を追加してコピペしてっと 再生ボタンを押してみる。


きたきた。


まずは1つ目の範囲を選択してOKボタンを押す。
次は、入れ替えたい範囲を選んでOKボタン。


さて、3行目と11行目が上手く入れ替わるのかなぁ?


ポチっとな! おお~~いきなり成功(笑)
1回目と2回目の選択範囲が違うと指摘されてしまいます。


これはかなり便利ですね!
それにしてもこんなVBAを一瞬で書いてしまうChatGPTはとんでもないですよね(笑)
ジッピー初手で上手くいったよ(笑)
次の② 指定したキーワードを含む行を抽出・コピー これに挑戦してみようか。
まぁ意味は分かるんだけど、どんな感じのマクロ機能になるのかな? 抽出・コピーする表は同じのを使うよ それではジッピーよろしく。

よし、次は 「指定したキーワードを含む行を抽出・コピー」 だね!
🔨 VBAマクロ:指定したキーワードを含む行を抽出・コピー
マクロの仕様
- ユーザーがキーワードを入力
- 指定した列からキーワードを検索
- 該当する行を別のシート(または指定した範囲)にコピー
- 既存のデータを消さずに追記可能

では、VBAマクロを用意するよ!
VBAマクロ:キーワードを含む行を抽出・コピー
Sub ExtractRowsByKeyword()
Dim wsSource As Worksheet, wsDest As Worksheet
Dim lastRow As Long, destRow As Long
Dim searchColumn As String, keyword As String
Dim cell As Range
' 元データのシート(現在のアクティブシート)
Set wsSource = ActiveSheet
' 結果を出力する新しいシートを作成
On Error Resume Next
Set wsDest = Worksheets("抽出結果")
If wsDest Is Nothing Then
Set wsDest = Worksheets.Add
wsDest.Name = "抽出結果"
End If
On Error GoTo 0
' 抽出結果シートのデータをクリア
wsDest.Cells.Clear
' 検索対象の列(手入力)
searchColumn = "E" ' 例: "E" 列(区分)
' キーワード入力(メッセージボックスで入力)
keyword = InputBox("抽出したいキーワードを入力してください", "キーワード検索")
If keyword = "" Then
MsgBox "キーワードが入力されていません。処理を終了します。", vbExclamation
Exit Sub
End If
' 元データの最終行を取得
lastRow = wsSource.Cells(wsSource.Rows.Count, searchColumn).End(xlUp).Row
' ヘッダーをコピー
wsSource.Rows(2).Copy Destination:=wsDest.Rows(2)
' 抽出結果の書き込み開始行
destRow = 3
' 検索して一致する行をコピー
For Each cell In wsSource.Range(searchColumn & "3:" & searchColumn & lastRow)
If InStr(1, cell.Value, keyword, vbTextCompare) > 0 Then
cell.EntireRow.Copy Destination:=wsDest.Rows(destRow)
destRow = destRow + 1
End If
Next cell
' 抽出された行がない場合
If destRow = 3 Then
MsgBox "指定したキーワードに一致するデータはありませんでした。", vbInformation
Else
MsgBox "キーワード [" & keyword & "] を含む行を抽出しました!", vbInformation
wsDest.Activate
End If
End Sub
このマクロのポイント
✔ ユーザーがキーワードを入力(InputBox)
✔ E列(区分)を検索し、一致する行を抽出(E列以外の列も設定可能)
✔ 該当する行を「抽出結果」シートにコピー(新規作成 or 既存シート)
✔ データがない場合のエラーハンドリングも実装
使い方
- マクロを実行(
ExtractRowsByKeyword
を実行) - キーワードを入力(例:「構造材」や「羽柄材」)
- 一致する行が「抽出結果」シートにコピーされる!

タスク、試してみてどうかな?
もし検索対象の列を変更したい場合は、searchColumn = "E"
の "E"
を "C"
(邸名)や "D"
(建設場所)などに変更できるよ!

試してみよう!


VBAをコピーしてModule1に貼り付けて、再生ボタンを押す!


お!抽出結果のシートが追加された!? 構造材で試してみるね。
どうだ?


ジッピーばっちりじゃん!!
完璧に抽出できてるよ! さすがだね。
でも抽出列をVBAで直すのはめんどくさいなぁ~ なんとかならない?

なるほど!毎回VBAのコードを書き換えるのは面倒だから、「検索対象の列をユーザーが選べるようにする」 機能を追加しよう!
改良版:キーワード検索の列もユーザーが選択可能
Sub ExtractRowsByKeyword()
Dim wsSource As Worksheet, wsDest As Worksheet
Dim lastRow As Long, destRow As Long
Dim searchColumn As String, keyword As String
Dim cell As Range
' 元データのシート(現在のアクティブシート)
Set wsSource = ActiveSheet
' 結果を出力する新しいシートを作成
On Error Resume Next
Set wsDest = Worksheets("抽出結果")
If wsDest Is Nothing Then
Set wsDest = Worksheets.Add
wsDest.Name = "抽出結果"
End If
On Error GoTo 0
' 抽出結果シートのデータをクリア
wsDest.Cells.Clear
' 検索対象の列(手入力)
searchColumn = "E" ' 例: "E" 列(区分)
' キーワード入力(メッセージボックスで入力)
keyword = InputBox("抽出したいキーワードを入力してください", "キーワード検索")
If keyword = "" Then
MsgBox "キーワードが入力されていません。処理を終了します。", vbExclamation
Exit Sub
End If
' 元データの最終行を取得
lastRow = wsSource.Cells(wsSource.Rows.Count, searchColumn).End(xlUp).Row
' ヘッダーをコピー
wsSource.Rows(2).Copy Destination:=wsDest.Rows(2)
' 抽出結果の書き込み開始行
destRow = 3
' 検索して一致する行をコピー
For Each cell In wsSource.Range(searchColumn & "3:" & searchColumn & lastRow)
If InStr(1, cell.Value, keyword, vbTextCompare) > 0 Then
cell.EntireRow.Copy Destination:=wsDest.Rows(destRow)
destRow = destRow + 1
End If
Next cell
' 抽出された行がない場合
If destRow = 3 Then
MsgBox "指定したキーワードに一致するデータはありませんでした。", vbInformation
Else
MsgBox "キーワード [" & keyword & "] を含む行を抽出しました!", vbInformation
wsDest.Activate
End If
End Sub
改良ポイント
✔ 検索対象の列を「マウスで選択」できる
✔ 選択した列のデータを検索し、指定したキーワードを含む行を抽出
✔ コードを書き換えなくても、どの列でも検索可能!
使い方
- マクロを実行
- 検索対象の列を選択(マウスで1列選択する)
- キーワードを入力(例:「構造材」や「大阪府」など)
- 一致する行が「抽出結果」シートにコピーされる!

タスク、これなら「どの列を検索するか」VBAを書き換えずに自由に選べるから、めちゃくちゃ便利になったはず!
試してみてどうかな?

試してみよう。
VBAをコピーしてさっきのVBAと入れ替える。


そして実行。
列選択の入力ボックスが出てきたね。
B列を選択してみようか。


これでいいのかな?
キーワードは中村工務店にしてみるね。


どうだ?


おーーーッ!ジッピー成功だよ!
これまた業務でも使える機能だね~。
じゃあ、次のお題に行こうか。
③ 指定範囲の値をランダムに並び替える
う~ん、これは表現としてはあまり良くないかな?
「指定した範囲の行をランダムで並び替える」
って表現した方がいいね。
ジッピーいけるかな?

了解!じゃあ、「指定した範囲の行をランダムに並び替える」マクロを作るね!
これは例えば、順番をランダムに決めたいときや、リストをシャッフルしたいときに便利だね。
🔨 VBAマクロ:指定範囲の行をランダムに並び替える
Sub ShuffleRows()
Dim ws As Worksheet
Dim rng As Range, tempRange As Range
Dim rowCount As Long, i As Long, j As Long
Dim temp As Variant
' シートの指定(アクティブシート)
Set ws = ActiveSheet
' 並び替える範囲を選択
On Error Resume Next
Set rng = Application.InputBox("ランダムに並び替えたい範囲(行単位)を選択してください", Type:=8)
On Error GoTo 0
' 選択がない場合、終了
If rng Is Nothing Then
MsgBox "範囲が選択されていません。処理を終了します。", vbExclamation
Exit Sub
End If
' 行数を取得
rowCount = rng.Rows.Count
' 行数が1行以下なら処理しない
If rowCount < 2 Then
MsgBox "2行以上の範囲を選択してください。", vbExclamation
Exit Sub
End If
' ランダムに並び替えるための配列を作成
Dim indexArr As Variant
ReDim indexArr(1 To rowCount)
' インデックス配列を初期化
For i = 1 To rowCount
indexArr(i) = i
Next i
' インデックスをランダムに並び替え(Fisher-Yatesシャッフル)
For i = rowCount To 2 Step -1
j = Int(Rnd() * i) + 1
temp = indexArr(i)
indexArr(i) = indexArr(j)
indexArr(j) = temp
Next i
' 一時的な範囲を作成して並び替え
Set tempRange = rng.Offset(, rng.Columns.Count).Resize(rowCount, 1)
' ランダムな順序で行をコピー
For i = 1 To rowCount
rng.Rows(indexArr(i)).Copy Destination:=tempRange.Rows(i)
Next i
' コピーした内容を元の範囲に上書き
rng.Value = tempRange.Value
' 一時的なデータを削除
tempRange.Clear
MsgBox "選択した範囲の行をランダムに並び替えました!", vbInformation
End Sub
このマクロのポイント
✔ ユーザーが並び替えたい範囲を選択できる
✔ Fisher-Yatesシャッフル(高速で公平なシャッフル)を使用
✔ 元の表を直接並び替える(コピー&ペーストで再配置)
✔ エラーチェック機能あり(1行だけの選択などを防ぐ)
使い方
- マクロを実行(
ShuffleRows
を実行) - 並び替えたい範囲を選択(例: B3:F15 のように行単位で選択)
- OKを押すと、その範囲の行がランダムに並び替えられる!

タスク、これなら業務で使えるし、色んなデータのランダムシャッフルに応用できるよ!
試してみてどうかな?

やってみようか


コピって貼り付けて この範囲でやってみよう どうだ?


!?


ジッピーおかしくなったぞ !
見た感じB列からF列までがH列に移動して B列からF列が日付で埋まってる感じ・・・
どうなんってんだこれ(笑)

なるほど、列の内容が日付で埋まったり、データが意図しない場所にコピーされたりしているね。
これは、ランダムシャッフル後のデータを 一時的なセル範囲にコピー→それを元の範囲に戻す処理 でミスがあったのが原因だと思う。
修正点 ✅ コピーではなく「元の位置を直接入れ替える」方法に変更
✅ 書式や値の保持を改善
✅ 範囲を正しく入れ替えるように修正
修正版:指定範囲の行をランダムに並び替える
Sub ShuffleRowsFixed()
Dim ws As Worksheet
Dim rng As Range
Dim rowCount As Long, i As Long, j As Long
Dim temp As Variant
Dim indexArr As Variant
' アクティブシートを設定
Set ws = ActiveSheet
' 並び替える範囲を選択
On Error Resume Next
Set rng = Application.InputBox("ランダムに並び替えたい範囲(行単位)を選択してください", Type:=8)
On Error GoTo 0
' 範囲が選択されていない場合、終了
If rng Is Nothing Then
MsgBox "範囲が選択されていません。処理を終了します。", vbExclamation
Exit Sub
End If
' 行数を取得
rowCount = rng.Rows.Count
' 2行以上の範囲が必要
If rowCount < 2 Then
MsgBox "2行以上の範囲を選択してください。", vbExclamation
Exit Sub
End If
' インデックス配列を作成(1から行数までの連番)
ReDim indexArr(1 To rowCount)
For i = 1 To rowCount
indexArr(i) = i
Next i
' インデックスをランダムに並び替え(Fisher-Yatesシャッフル)
For i = rowCount To 2 Step -1
j = Int(Rnd() * i) + 1
temp = indexArr(i)
indexArr(i) = indexArr(j)
indexArr(j) = temp
Next i
' シャッフルされた順序で行を直接入れ替える
Dim tempRow As Variant
For i = 1 To rowCount
If i <> indexArr(i) Then
tempRow = rng.Rows(i).Value
rng.Rows(i).Value = rng.Rows(indexArr(i)).Value
rng.Rows(indexArr(i)).Value = tempRow
End If
Next i
MsgBox "選択した範囲の行をランダムに並び替えました!", vbInformation
End Sub
修正ポイント
✅ 「コピー」ではなく、直接入れ替える方式に変更
✅ データが別の場所にコピーされる問題を解消
✅ シャッフルロジックを修正し、全体のデータを乱れなく維持
✅ 日付や書式が崩れないように入れ替え
使い方
- マクロを実行(
ShuffleRowsFixed
を実行) - 並び替えたい範囲を選択(例: A3:F15 のように行単位で選択)
- OKを押すと、その範囲の行がランダムに並び替えられる!

タスク、これで意図しない日付の書き換えや別のセルにコピーされる問題は解決するはず!
もう一度試してみてくれる?

よし。
いったん閉じて仕切り直しだね もっかいいくよ。
コピペしてポチっとな


さっきと同じくA3からF15に範囲設定して どうだ?


お!ジッピー今度は上手くいったよ!!
でもセルカラーが一緒に移動してないなぁ
罫線と計算式(入れてないけど)以外をランダムにできるかな?

なるほど、罫線と計算式を維持しつつ、値・背景色・フォントカラーをシャッフルしたいんだね!
それなら、データだけでなく「セルの書式」も一緒に入れ替えるように修正しよう!
🔨 修正版:罫線・計算式を維持し、値・色をシャッフルする
Sub ShuffleRowsWithFormatting()
Dim ws As Worksheet
Dim rng As Range
Dim rowCount As Long, i As Long, j As Long
Dim tempValue As Variant, tempInterior As Variant, tempFont As Variant
Dim indexArr As Variant
' アクティブシートを設定
Set ws = ActiveSheet
' 並び替える範囲を選択
On Error Resume Next
Set rng = Application.InputBox("ランダムに並び替えたい範囲(行単位)を選択してください", Type:=8)
On Error GoTo 0
' 範囲が選択されていない場合、終了
If rng Is Nothing Then
MsgBox "範囲が選択されていません。処理を終了します。", vbExclamation
Exit Sub
End If
' 行数を取得
rowCount = rng.Rows.Count
' 2行以上の範囲が必要
If rowCount < 2 Then
MsgBox "2行以上の範囲を選択してください。", vbExclamation
Exit Sub
End If
' インデックス配列を作成(1から行数までの連番)
ReDim indexArr(1 To rowCount)
For i = 1 To rowCount
indexArr(i) = i
Next i
' インデックスをランダムに並び替え(Fisher-Yatesシャッフル)
For i = rowCount To 2 Step -1
j = Int(Rnd() * i) + 1
tempValue = indexArr(i)
indexArr(i) = indexArr(j)
indexArr(j) = tempValue
Next i
' シャッフルされた順序で行を直接入れ替える(値・背景色・フォントカラー)
Dim tempArr As Variant
For i = 1 To rowCount
If i <> indexArr(i) Then
' 値を一時保存
tempArr = rng.Rows(i).Value
rng.Rows(i).Value = rng.Rows(indexArr(i)).Value
rng.Rows(indexArr(i)).Value = tempArr
' 書式の入れ替え(背景色・フォントカラー)
For j = 1 To rng.Columns.Count
tempInterior = rng.Cells(i, j).Interior.Color
tempFont = rng.Cells(i, j).Font.Color
rng.Cells(i, j).Interior.Color = rng.Cells(indexArr(i), j).Interior.Color
rng.Cells(i, j).Font.Color = rng.Cells(indexArr(i), j).Font.Color
rng.Cells(indexArr(i), j).Interior.Color = tempInterior
rng.Cells(indexArr(i), j).Font.Color = tempFont
Next j
End If
Next i
MsgBox "選択した範囲の行を罫線・計算式を維持したままランダムに並び替えました!", vbInformation
End Sub
改善点
✅ 罫線・計算式を維持しつつ、値・背景色・フォントカラーを入れ替え
✅ 色ごとシャッフルすることで、違和感なく行が入れ替わる
✅ 列ごとではなく「行単位」でシャッフルするため、視認性を維持
✅ エラーハンドリング付きで、誤操作を防止
使い方
- マクロを実行(
ShuffleRowsWithFormatting
を実行) - 並び替えたい範囲を選択(例: A3:F15 のように行単位で選択)
- OKを押すと、罫線・計算式を維持したまま、値とセルの色がランダムに並び替わる!

タスク、これで セルの色も移動しつつ、罫線や計算式はそのまま になるはず!
もう一度試してみて、結果を教えてくれる?

わかり易くする為に、試しに1行だけフォントカラーとセルカラーを変えてみたよ


できるかなぁ?


おーー!ジッピー大成功だよ!!
まぁランダムに配置し直すなんて機会はほぼないと思うけど(笑)
これはこれでこんなこともできちゃうよ。的なおもしろ機能だね。
それではお次のお題で、④ 重複データを一発削除にいってみよう!
ジッピーよろしくね

おお!タスク、うまく動いたみたいでよかった!
「ランダム並び替え」は業務で使う機会は少ないかもだけど、
「こんなこともできるんだ!」っていう発見があるとVBAの可能性が広がるね!
さて、次は ④ 重複データを一発削除 だね。
🔨 VBAマクロ:選択範囲の重複データを一発削除
Sub RemoveDuplicates()
Dim rng As Range
Dim ws As Worksheet
Dim colNum As Integer
' アクティブシートを設定
Set ws = ActiveSheet
' 重複を削除する範囲を選択
On Error Resume Next
Set rng = Application.InputBox("重複削除を行う範囲を選択してください(タイトル行を含める)", Type:=8)
On Error GoTo 0
' 選択範囲がない場合
If rng Is Nothing Then
MsgBox "範囲が選択されていません。処理を終了します。", vbExclamation
Exit Sub
End If
' ユーザーに重複削除の基準列を選択させる
On Error Resume Next
colNum = Application.InputBox("重複削除の基準にする列番号を入力してください(1列目なら1)", Type:=1)
On Error GoTo 0
' 無効な入力チェック
If colNum < 1 Or colNum > rng.Columns.Count Then
MsgBox "正しい列番号を入力してください。", vbExclamation
Exit Sub
End If
' 重複削除の実行
rng.RemoveDuplicates Columns:=colNum, Header:=xlYes
MsgBox "重複データを削除しました!", vbInformation
End Sub
このマクロのポイント
✔ 選択した範囲の重複データを削除(タイトル行含める)
✔ 基準にする列をユーザーが選べる
✔ ワンクリックで実行可能(シンプルな操作)
✔ ヘッダーを考慮して重複判定する
使い方
- マクロを実行(
RemoveDuplicates
を実行) - 重複チェックする範囲を選択(例: B2:F20 など)
- 基準となる列番号を入力(例: 工務店で判定なら2, 邸名なら3)
- OKを押すと、一発で重複データが削除される!

タスク、これで「不要な重複データを一括で削除できる」ようになったよ!
試してみて、もし改善点があったら教えてね!

変な動きしたら戻れないから別シートにコピーしたよ(笑)
じゃあさっそく試してみようかな。
コードをコピーして貼り付け。


重複削除を行う範囲は、A2からF20にすると。


重複削除の基準列番号は工務店名にするから2だね。
そしてOKボタンを押すと・・・


なんと!?重複してる行が全部消えたわ(笑)
この機能は・・・使い道・・・あるな!(笑)
じゃあ最後の機能行ってみよう!
⑤ Excelデータを自動保存&バックアップ この機能は・・・あれかな? デスクトップとかにバックアップ用のフォルダを作って保存するたびにバックアップ用のフォルダにも保存されていく仕組み?
そもそも自動保存って・・・自動で保存するの?

おお!重複削除、ばっちり機能したみたいでよかった!
これは「似たデータを整理したい」「間違って重複入力しちゃったとき」なんかにめちゃくちゃ便利だね(笑)
さて、最後の 「Excelデータを自動保存&バックアップ」 についてだけど、
✔ 保存時に自動でバックアップを取る
✔ 指定フォルダ(例: デスクトップの”Excelバックアップ”)に、日付つきでコピーを保存
✔ 上書きではなく、新しいファイルとして履歴を残せる
みたいな感じの機能を作っていくよ!
🔨 VBAマクロ:バックアップ用フォルダに自動保存
Sub AutoBackup()
Dim wb As Workbook
Dim backupFolder As String
Dim backupFile As String
Dim timeStamp As String
' 現在のブックを取得
Set wb = ThisWorkbook
' バックアップ用のフォルダをデスクトップに設定
backupFolder = Environ("USERPROFILE") & "\Desktop\Excelバックアップ\"
' バックアップフォルダが存在しない場合は作成
If Dir(backupFolder, vbDirectory) = "" Then
MkDir backupFolder
End If
' タイムスタンプ付きのバックアップファイル名(例: ファイル名_20250218_120500.xlsx)
timeStamp = Format(Now, "yyyymmdd_HHMMSS")
backupFile = backupFolder & wb.Name & "_" & timeStamp & ".xlsx"
' バックアップを保存
wb.SaveCopyAs backupFile
MsgBox "バックアップを作成しました!" & vbCrLf & "保存先: " & backupFile, vbInformation
End Sub
このマクロのポイント
✔ デスクトップに「Excelバックアップ」フォルダを作成し、そこにバックアップを保存
✔ 現在のブックのコピーを、日付&時間つきのファイル名で保存
✔ 既存のファイルを上書きせず、履歴をどんどん残せる
✔ フォルダがなければ自動作成!
使い方
- マクロを実行(
AutoBackup
を実行) - デスクトップに「Excelバックアップ」フォルダが作成される(初回のみ)
- 「ブック名_20250218_120500.xlsx」みたいな名前でバックアップ保存!
- 履歴が残るので、過去データの復元が可能!
応用編
💡 「上書き保存するたびに自動バックアップ」する方法
このマクロを 「Workbook_BeforeSave」 に組み込めば、手動で実行しなくても 保存するたびにバックアップ を自動で取れるようになる!
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call AutoBackup
End Sub
👉 「ThisWorkbook」モジュール に追加すると、上書き保存のたびにバックアップが自動作成される!

タスク、どう?
この機能なら「ファイルが壊れた!」「間違ってデータ消しちゃった!」ってときに役立つはず!
試してみて、感想聞かせてね!

ほほぉ~これは便利そうだね。
クラウドとかに保存してるファイルを消してしまったらどこ行ったか分からんくなるもんね。
それが共有ファイルだったらなおさらだし。
じゃあやってみよう!


まず、自動保存機能のコードを貼り付ける。
ついでに応用編の上書き保存するたびに自動バックアップもやってみる。


これはModule1ではなくてThisWorkbookに貼り付けるんだね。
で、Module1に戻って、再生ボタンを押すとデスクトップにフォルダが作られるのかな?
やってみよう!


おー!デスクトップにフォルダができてるし、その中にバックアップファイルもできてる(笑)
しかも日付と何時何分何秒まで(笑)
さらに応用編が効いているかだよね。
保存ボタンをポチっと。


いいね!!完璧に機能してるよジッピー!
これは便利だし超安心機能だね!!

おおお!完璧に動いたみたいでよかった!!🎉🎉
タスク、今回はめちゃくちゃ業務効率化につながる機能をいっぱい作ったね!
🔨 今回作ったVBAマクロ一覧
✅ ① 選択範囲の入れ替え(罫線を除く) → 指定した2つの範囲のデータを入れ替え!
✅ ② 指定したキーワードを含む行を抽出・コピー → どの列でも検索できる柔軟な検索機能!
✅ ③ 指定範囲の行をランダムで並び替え → 罫線と計算式を維持しつつ、値と色を入れ替え!
✅ ④ 重複データを一発削除 → 好きな列を基準にして、一発で重複データを整理!
✅ ⑤ Excelデータを自動保存&バックアップ → いざという時のために安心のバックアップ機能!

どれも業務で実際に使えるレベルの機能 ばかりだし、ちょっとした工夫でさらに応用もできそうだね!
特にバックアップ機能は、データを誤って消しちゃったり、上書きして後悔するのを防げるから安心感がすごい✨

さて、この内容をブログ記事にまとめようか!
今回のVBAは 「業務で役立つ便利マクロ5選!」 みたいな感じで書いたら、かなり有益な記事になりそう!
タスク、どうまとめていくか、見出しや構成を一緒に考えていこうか?

いや、もうこのままねジッピーとの会話を直接載せるからいいよ。
失敗も成功も全部ブログの記事にする(笑)
若干修正はする(笑)
と、言うことで今回はマクロを使ったExcelの便利機能を5つ!紹介?ChatGPTのジッピーに教えてもらいました。
このように、Excelでやりたいことをざっくり伝えるだけでも今回のような機能をChatGPTは考えてくれます。
とても良い奴です!!
今回の記事は以上になります。
皆様のChatGPT使用法の参考になればうれしいです。
ほな、ジッピー最後に締めの言葉を読者さん達によろしくね!

おっけー!タスクのブログは 「失敗も成功も全部見せる」 のがめちゃくちゃリアルでいいよね!
読者さんにも「試行錯誤しながらVBAを学ぶ楽しさ」が伝わると思うよ!
じゃあ、締めの言葉いくよ!👇
🔨 今回の記事を読んでくれた皆さんへ!

ExcelのVBAって難しそうに見えるけど、
「こんなことできるかな?」って試してみるだけで、どんどん便利な機能が作れるんです!
ChatGPTをうまく活用すれば、 「やりたいことを伝えるだけで、VBAのコードがサクッと完成!」
今回のように 失敗も成功も楽しみながら、どんどん便利な機能を作っていきましょう!
タスクのブログ 「ジッピーとタスクのExcel工房」 では、
これからも 実際に使えるVBAマクロや業務効率化のアイデア を紹介していくので、
ぜひまた読みに来てくださいね!
それでは 良きExcelライフを! 🏆✨
🔨 終わりに

マクロを使った便利機能5選いかがだったでしょうか?
今回も使用したExcelを無料公開しますので宜しければダウンロードしてみてください。
それではまた次回一緒に勉強していきましょう。
コメント