長年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が変更したら履歴破棄」というシンプルなルールにしている、という背景。
後方互換の重み
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)**を提供している、という理解が実情に近いです。
ということらしい。
なるほど、そういうことか。
ちょっと専門的で分からないところもあったけど、だいたい理解。
以上、春日部アカデミーから福地がお届けしました。