クリエイティブを楽しむ新メディア 牛の歩みで更新中!クリエイティブを楽しむ新メディア 牛の歩みで更新中!
プログラム・IT
【Excel VBA】[元に戻す]の代用マクロ
2022年6月4日(土曜日)

同じVBAでも、Wordではアンドゥ(元に戻す)ができるのにExcelではできません!

シートの内容を書き換えるマクロを実行する場合に、うっかり「失敗」することはよくあることですが、それを元に戻せないのはかなりの困りものです。

そこで今回は、Execlでマクロを実行する際にシートを丸ごと複製する方法を紹介します。

Public Sub ExcelTest_SheetBreak()
'まさに台無しにするテスト

    '台無しにする失敗コード
    Range("A1", "E5") = "台無し!"

End Sub

マクロ実行前は大事なデータが書かれていたシートですが……

上記のマクロを実行すると、A1~E5のセルに「台無し!」と書かれてしまいます。

もう文字通り、これでもかと言わんばかりに「台無し!」です。これをアンドゥで元に戻せないのは悲しい……!

マクロを書き換えてバックアップに対応

そこで、このマクロを書き換えて……

Public Sub ExcelTest_SheetBackup()

    'まずバックアップ
    Call SheetBackup

    '台無しにする失敗コード
    Range("A1", "E5") = "台無し!"

End Sub

「台無し!」にする前に"SheetBackup"というマクロを実行するように変更します。

マクロ解説 SheetBackup

このマクロがバックアップを行なう処理の本体で、実行すると現在選択中のシートが複製されます。複製されたシートは「(元の名前_backup)」という名前になりますが、すでに同名シートが存在する場合は上書き(消して、再作成)します。

このマクロを標準モジュールに追加しておく必要があります。コードは以下のとおりです。

Sub SheetBackup()
'アクティブシートを複製するマクロ

    '現在のシートを取得
    Dim vSheet As Worksheet
    Set vSheet = ActiveSheet

    'バックアップ名を決定
    Dim vBackupName As String
    vBackupName = "(" & vSheet.Name & "_backup)"

    '同名シートがあるか確認
    If utSheetExist(vBackupName) = True Then
    '(発見)
        Application.DisplayAlerts = False 'メッセージ非表示化
        Sheets(vBackupName).Delete '削除
        Application.DisplayAlerts = True 'メッセージ表示復帰
    End If

    '複製実行
    Call vSheet.Copy(before:=Worksheets(1))
    ActiveSheet.Name = vBackupName 'シート改名

    '元シートをアクティブに戻す
    vSheet.Activate

End Sub

関数解説 utSheetExist

SheetBackupなかで、さらに"utSheetExsist"という関数を実行しているので、こちらも追加しておく必要があります。

この関数は、引数に指定した文字列と同じ名前のシートがあるかを確認するものです。同名シートがあればTrueを、なければFalseを返します。

コードは以下のとおりです。

Function utSheetExist(ByRef aSheetName As String) As Boolean
'指定名のシートが存在すればTrueを返す
    Dim vSheet As Worksheet, vFound As Boolean
    vFound = False
    '検索
    For Each vSheet In Sheets
        If LCase(vSheet.Name) = LCase(aSheetName) Then
        '(発見)
            vFound = True
            Exit For 'ループを抜ける
        End If
    Next
    '戻り値
    utSheetExist = vFound
End Function

元に戻すときは

上記のExcelTest_SheetBackup、SheetBackup、utSheetExistを標準モジュールに追加して、ExcelTest_SheetBackupを実行すると、現在のシート"テスト"は「台無し!」にされてしまいますが……

シート"(テスト_backup)"が作成されており、その中身はExcelTest_SheetBackup実行前のものになっています。元に戻すときは、"テスト"を消して、"テスト_backup"の名前を"テスト"に戻せばOKです。

Wordの場合(以下の記事を参照)のように一発で元通りとはいきませんが、複雑な処理を行なうマクロを開発する際は、マクロの先頭で"SheetBackup"を実行するようにしてみてください。

なお、SheetBackupはあくまで現在選択中のシートひとつのみを複製するマクロです。マクロのなかで複数のシートに手を加える場合は、他のシートに対してもバックアップを行なうようにする必要がありますのでご注意ください。

コメントを記入

メールアドレスが公開されることはありません。 が付いている欄は必須項目です