※タイトルは釣りです (2018/12/07時点)
こんにちは、小池です。
OBを交えた設計審査会が今週末日曜に迫っていて大変忙しいです。
今日はコスト審査対策で使用する、マクロの拡張について、最近考えていることを書きます。
Excelのマクロって、実行して表に書き込んだりすると、普通はもとに戻せなくなるので、実行前に保存しておくことが一般的には推奨されています。
そこで、ユーザにお願いするのではなく、マクロの関数開始にActiveWorkbook.saveを実行して強制的に上書きしておく工夫などもあるようです。
ただ、ユーザ側からすると、誤ってマクロを実行してしまった際に、再度開き直さないともとに戻せず、またマクロ開始前の履歴も消えてしまうので、やり直したい部分がもっと前だったときに自分で削除などして戻す必要があり、大変な手間です。
そんなわけで、ヒストリーを独自に実装してマクロでの実行履歴を残そうと思います。
ただ、まだ実装が終わっておらず、アイデアにとどまっているので、間違っていることを書いているかもしれません。
アイデアは非常に単純で、ヒストリー保存に用いる配列変数を用意し、マクロ実行時にその変更を完全に特定できる情報を書き込み、戻すときにはそれを読み込み、対応する復元用のマクロ関数を実行するだけです。
例えば、スタッククラスを配列などを用いて簡単に実装し、マクロ実行時にpushし、マクロを戻す用のショートカットキーにpopを割り当てることでマクロのundoが再現できます。
その後にredoするには、pop時にデータを消すのではなく、ポインタやインデックスのみを下げればいいですね。
以上を実装してショートカットキーを割り当てれば、マクロを実行した後にundo, redoができるようになります。
ただ、ひとたびマクロを実行すると、Excelが自動的に保存してくれている履歴がリセットされてしまうので、Ctrl-Zで戻れなくなります。
そこで、Excelが背後で保存してくれているような普通の操作によるシートの変更も、スタックに積むことが考えられます。
その上で、そのスタックの操作関数にCtrl-Z, Ctrl-Yをオーバーロードして割り当てることで、完全なヒストリーが再現できます(多分)
実際には、罫線を設定したりシートを増やしたりするイベントも履歴に含めるためにはそれもイベントとして捕らえる必要も出てきて、Worksheet_Changeだけでは済まなくなると予想されます。
なので、汎用的に実現するのは大変そうですが、ユーザの操作が十分限られていると想定されるコストレポート記入には、うまくいけるんじゃないかなと。
最悪、SendKeys関数で書いた文字はCtrl-Zで戻せるので、そうなってしまうかもしれません。
ただそれだと、場合によってはひとつのマクロによる変更に何回もCtrl-Zしないと戻せないかもしれませんが。
コードもない粗末な投稿になってしまいましたが、進捗があったら追記・更新します。