春日部の塾|春日部アカデミー通信

春日部の塾「春日部アカデミー」塾長が、小中高一貫指導で普通の成績から難関大学を目指す学び方を発信。英語を武器にする方法や、勉強の本質的な心構えをお届けします。

【素朴な疑問】「マクロにはCtrl+Zが使えないぞ」問題

 

 

長年Excelを使ってきて、以前からずっと思ってたんだけど、

 

 

マクロで操作すると、Undo機能(=「元に戻す」機能。またの名を「Ctrl+Z」。)が使えない。

 

それって何故だろうってずっと素朴な疑問として思ってた。

 

ニーズはあると思うんだよなぁ。

 

 

というわけで、ChatGPTにそれを質問。

 

さすがAIだけあって、この手の内容はお手のもの。

 

ある意味、一番の専門分野だからね。

 

 

 

そしたら、こんな答えを返してくれた。

 

 

 

 

(僕の質問)

 

何故Excel開発者たちはマクロでもUudoを有効にしなかったのかな。 ニーズはあると思うのだけれど。

 

 

(ChatGPTの答え)

 

あるあるな疑問だよね。ざっくり言うと、技術的・安全性・歴史的な理由で「VBAの処理まで標準Undoに載せる」のは難しすぎるから、です。

 

何でもできすぎる=可逆性を保証できない

VBAは値・数式・書式・行列操作に加えて、別ブック・外部ファイル・印刷・クリップボード・他アプリ操作・レジストリ設定まで触れます。これらを完全に巻き戻すための“逆操作”をExcel側が自動生成するのはほぼ不可能で、壊れ方も多様。なので安全策としてUndo履歴を消す設計になってます。一般に「マクロが書き込みを行ったらUndoは消える」と説明されます。

simplesheets.co

 

スナップショット方式は重すぎる

「変更前を丸ごと保存→戻すとき貼り戻し」という方式なら理論上は可能ですが、数十MB〜数百MBのブックで多段管理するとメモリも速度も現実的でない。途中で計算やイベントも走るので一貫性を保つのも難題。

 

UIのUndoは“トランザクション前提”、VBAは“自由度最優先”

Excel標準の操作は内部コマンドで粒度が管理され、Undo/Redoが定義済み。一方VBAは任意順序で命令を混在でき、トランザクション境界を推定できない。だから「VBAが変更したら履歴破棄」というシンプルなルールにしている、という背景。

YouTube

 

後方互換の重み

Excelは90年代からの資産とアドインが山ほど動いています。Undoモデルを根本から変えると互換性リスクが大きい。

 

落としどころとしてのAPI

それでもニーズがあるので、Excelは**Application.OnUndo**で「押したら自前の“戻し処理”を走らせる」仕組みを用意しています(Redo相当はOnRepeat)。=擬似Undoは作れるけど、標準Undoに“自動で積まれる”わけではない、という位置づけ。

Microsoft Learn

wellsr.com

 

(補足:WordにはUndoRecordという“Undoの束ね”APIがあり、Office内でもアプリごとに対応が違います。Excelでは基本はOnUndo方式です。)

 

結論

ニーズはあるが、全自動で安全なUndoを保証するにはVBAの自由度が高すぎる。そのためExcelは「マクロが書いたらUndo履歴を消す」を仕様にしつつ、**開発者が必要な範囲だけ自前でUndoを用意できる道(OnUndo)**を提供している、という理解が実情に近いです。

 

 

 

ということらしい。

 

なるほど、そういうことか。

 

ちょっと専門的で分からないところもあったけど、だいたい理解。

 

 

 

以上、春日部アカデミーから福地がお届けしました。