スポンサーリンク
Officeプログラミング

ExcelでVBAを実行するとCtrl + Zが使えなくなる理由と、初心者がつまずきやすいポイント

Office
この記事は約4分で読めます。

Excelを使っていると、Ctrl + Z(元に戻す)は欠かせない存在です。
操作を間違えたとき、とりあえずCtrl + Zを押せば元に戻せる。この安心感は大きいと思います。

そんな「当たり前」が通用しなかったのが、VBAを使い始めたときでした。

VBAに対する私のイメージは「互換性の問題がすぐ出る」

私はこれまで、あまりVBAを積極的に使ってきませんでした。
理由のひとつが、「環境やExcelのバージョンが違うと、すぐ互換性の問題が出そう」というイメージです。

  • 自分の環境では動くけど、他人のPCでは動かない
  • Excelのバージョン違いでエラーが出る
  • マクロ有効/無効でトラブルになる

こういった話をよく聞いていたこともあり、
「便利そうだけど、扱いが難しそう」という印象が先行していました。

そのため、VBA特有の仕様について深く調べることもなく、
必要最低限しか触ってこなかったのが正直なところです。

Ctrl + Zが効かない…最初は不具合だと思った

あるとき、データ整理を自動化するためにVBAマクロを作り、実行しました。
処理自体は問題なく終わったのですが、
「やっぱり元に戻したいな」と思い、いつもの癖でCtrl + Zを押しました。

しかし、何も起きません。

「Excelの調子が悪い?」
「互換性の問題が出た?」

最初はそんなふうに考えてしまいましたが、調べてみると原因は意外なものでした。

結論:VBA実行後にCtrl + Zが使えなくなるのは仕様

結論から言うと、これは不具合でも互換性トラブルでもありません。

VBAでブックやシートを変更すると、その時点ですべてのUndo(元に戻す)履歴が消える

これがExcelの仕様です。

手入力や数式の編集では普通にCtrl + Zが使えるため、
VBAを使った瞬間に使えなくなると、初見ではかなり戸惑います。


なぜVBAを使うとUndo履歴が消えるのか

Excelは、ユーザーの操作をUndo用の履歴として内部で管理しています。
しかしVBAによる処理は、Excelにとっては「プログラムによる一括操作」です。

そのため、

  • セルの値変更
  • 行や列の削除
  • セル内容のクリア

といった処理をVBAが行った時点で、
Excelは既存のUndo履歴を安全のためにすべて破棄します。

これは非常に小さな処理でも同じです。

Range("A1").Value = "テスト"

この1行だけでも、Ctrl + Zは使えなくなります。

Application.Undoに期待してはいけない

VBAには以下のようなメソッドがあります。

Application.Undo

一見すると「元に戻せそう」に見えますが、

  • マクロ実行直前の1操作のみ
  • 条件がかなり限定的
  • 安定して使えない

という特徴があり、Ctrl + Zの代わりとして使うのは現実的ではありません

現実的な対策①:実行前の状態を保存する

確実な方法は、マクロ実行前の状態を自分で保持しておくことです。

Dim backup As Variant

Sub 実行()
    backup = Range("A1:D10").Value
    ' 処理内容
End Sub

Sub 元に戻す()
    Range("A1:D10").Value = backup
End Sub

完全なUndoではありませんが、
「戻れない」という事態は防げます。

現実的な対策②:実行前に必ず警告を出す

これだけでも事故は大幅に減ります。

If MsgBox("この処理は元に戻せません。実行しますか?", _
          vbYesNo + vbExclamation) = vbNo Then Exit Sub

VBAを使う以上、
元に戻せない可能性をユーザーに伝えることはとても重要です。

VBAは「互換性」より「設計の考え方」が大事だった

今回の件を通して感じたのは、
VBAが怖い理由は「互換性」そのものよりも、

Excelの通常操作とは違う前提がたくさんあることを知らないまま使うこと

にあるという点です。

Ctrl + Zが使えないのも、その代表的な例だと思います。


まとめ

VBAを実行するとCtrl + Zが使えなくなるのは、Excelの仕様です。
互換性の問題や不具合ではありません。

私は「VBAは互換性トラブルが多そう」というイメージから敬遠していましたが、
実際には 事前に知っておくべき前提を知らなかっただけ だと気づきました。

VBAは強力ですが、万能ではありません。
だからこそ、こうした仕様を理解した上で使うことが大切だと思います。

コメント

タイトルとURLをコピーしました