- ベストアンサー
Excelマクロでundoのボタンを作成
Excel2013使用です。 現在、アクティブなセルに日付を入力する為に日付入力ボタン(DateButton)を作成しています。 内容は下記の通りです。 Private Sub DateButton_Click() ActiveCell.Value = Date End Sub ですが、間違ってボタンを押した場合に元に戻す事が出来ません。 日付入力undoボタンを作成し、間違ってボタンを押した場合に元に戻す機能を追加したいと思います。 どうかご教授ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 ' ' /// Private Sub DateButton_Click() If TypeName(Selection) <> "Range" Then Exit Sub If Selection.Count > 1 Then Exit Sub ' ActiveCell.Activate Application.SendKeys "^:{ENTER}" End Sub Private Sub UndoButton_Click() ' ActiveCell.Activate On Error Resume Next Application.Undo End Sub ' ' /// UnDoを前提に考えると、入力方法を.SendKeysにするのが 一番簡単かな、と思います。 「ボタン」には、 フォームコントロールのボタンと ActiveXコントロールのコマンドボタン がありますが、後者の場合は、 ・プロパティを開いて、[TakeFocusOnClick]をfalseに指定しておくか、 ・ActiveCell.Activateのコメントブロックを外してください。 差し当たり、もしうまく動作しないケースが目につくようでしたら、 両方のプロシ' ActiveCell.Activate の次の行に DoEvents: DoEvents を書き加えてください。 尚、 今回の課題事態にも言えることですが、 マクロの実行によってExcel配下のプロパティを変更した場合は、 ExcelはUnDoする候補の記録を破棄します。 (Worksheet_SelectionChangeなど使う場合は処理内容に注意) つまり、一旦マクロを実行してしまえば、 UnDoマクロは機能しなくなりますが、この点は、 VBAではどうにもできないExcelの仕様によるものです。 考え方を変えれば、すべての処理内容をExcelに頼らず、 VBA側で記録しておいてひとつ前の状況を再現させることも 出来なくはないです。 ただ、その場合は細か~い条件のひとつひとつを確認しながら、 細か~く書き上げることになると思いますので、 現在のような情報のやり取りから こちらが導くのは現実的に不可能ですから、自力でお願いします。 結局のところ、.SendKeysをお奨めするのが、 現実的で、簡易な方法、ということになりますが、 .SendKeysが潜在的に抱えている不確かさ、ということも 知っておいてください。 でもまぁ、Excelを使う時には、他のアプリケーションを動かさない、 ということだけでも、看過できる不確かさ、にはなると思いますので。 上記の Private UndoButton_Click() については、ボタンでなくとも、 [Ctrl]+[Z}など、普通にExcel側の操作で [元に戻す]処理をするのと同じです。 以上です。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
参考までに Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Application.Undo End Sub をやってみてください。 元に戻すためダブルクリックするもの。 ・そのシートの全セルを考えて、セルについて1回前に戻ると思います。 しかし ・直後に気が付かないと使い物にならない。 ・VBAで値を変えるとこの働きは聞かない。 ・VBAで値をセットした後に実行するとエラーになるようだ。 ・シートのダブルクリックイベントを、他のことに使いたい場合は都合が悪い したがって普通の場合では使い物にならない。 === 日付設定に限るなら、「カレンダーコントロール」を使うとか 操作本日日付に限るなら、コマンドボタン1つ専用に使い、アクチブセルの列やセル範囲限定をそのイベントプロシに入れれば、誤り入力はほとんど起こらないのでは。
お礼
回答いただきありがとうございます。 カレンダーコントロールも試してみます。ありがとうございました。
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
#1です。訂正です。 誤) Application.SendKeys "^:{ENTER}" 正) Application.SendKeys "^;{ENTER}" 以上のように訂正をお願いします。 「日付」と「時刻」を取り違えていました。 失礼しました。
お礼
回答いただきありがとうございます。 期待したとおりの結果を得る事が出来ました。 初めてExcelのマクロに挑戦しているのですが、この機会にどんどん勉強します。