• ベストアンサー

Excelマクロでundoのボタンを作成

Excel2013使用です。 現在、アクティブなセルに日付を入力する為に日付入力ボタン(DateButton)を作成しています。 内容は下記の通りです。 Private Sub DateButton_Click() ActiveCell.Value = Date End Sub ですが、間違ってボタンを押した場合に元に戻す事が出来ません。 日付入力undoボタンを作成し、間違ってボタンを押した場合に元に戻す機能を追加したいと思います。 どうかご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 ' ' /// 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側の操作で [元に戻す]処理をするのと同じです。 以上です。

okuma-ya
質問者

お礼

回答いただきありがとうございます。 期待したとおりの結果を得る事が出来ました。 初めてExcelのマクロに挑戦しているのですが、この機会にどんどん勉強します。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

参考までに Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Application.Undo End Sub をやってみてください。 元に戻すためダブルクリックするもの。 ・そのシートの全セルを考えて、セルについて1回前に戻ると思います。 しかし ・直後に気が付かないと使い物にならない。 ・VBAで値を変えるとこの働きは聞かない。 ・VBAで値をセットした後に実行するとエラーになるようだ。 ・シートのダブルクリックイベントを、他のことに使いたい場合は都合が悪い したがって普通の場合では使い物にならない。 === 日付設定に限るなら、「カレンダーコントロール」を使うとか 操作本日日付に限るなら、コマンドボタン1つ専用に使い、アクチブセルの列やセル範囲限定をそのイベントプロシに入れれば、誤り入力はほとんど起こらないのでは。

okuma-ya
質問者

お礼

回答いただきありがとうございます。 カレンダーコントロールも試してみます。ありがとうございました。

回答No.2

#1です。訂正です。 誤)   Application.SendKeys "^:{ENTER}" 正)   Application.SendKeys "^;{ENTER}" 以上のように訂正をお願いします。 「日付」と「時刻」を取り違えていました。 失礼しました。

関連するQ&A

  • VBAプログラムについて

    VBAプログラムを本を見ながら作成していますが、はっきりいって素人です。 本に載っていないこととなるとちんぷんかんぷんで、いくつかあるプロシージャのどのプロシージャ内に記入したら良いのか分からないし、新しいプロシージャをどこに記入して良いのか分かりません。 例えば、 ----------------------------------------------------------- Private Sub CommandButton1_Click() ActiveCell.Value = TextBox1.Value ActiveCell.Offset(0, 1).Value = TextBox2.Value ActiveCell.Offset(0, 2).Value = TextBox3.Value ActiveCell.Offset(0, 3).Value = TextBox4.Value ActiveCell.Offset(0, 4).Value = TextBox5.Value ActiveCell.Offset(0, 5).Value = TextBox6.Value ActiveCell.Offset(0, 6).Value = TextBox7.Value ActiveCell.Offset(0, 7).Value = TextBox8.Value ActiveCell.Offset(0, 8).Value = TextBox9.Value ActiveCell.Offset(1, 0).Activate End Sub Private Sub CommandButton2_Click() Unload Me End Sub Private Sub Label1_Click() End Sub Private Sub UserForm_Click() End Sub Private Sub UserForm_Initialize() Range("A2").Activate End Sub ---------------------------------------------------------- テキスト入力フォームをいくつか作っており、コマンドボタン1とコマンドボタン2で入力ボタンと閉じるボタンにしています。   このプログラムでは、入力ボタンをクリックすることでデータが入力されて、入力された列のすぐ次の列の最初のセルがアクティブな状態になります。 (1)データ入力済みのエクセルシートにおいて、アクティブな状態にしたセルや列を削除したい場合、どこにどのように書けば良いのでしょうか? (2)データ入力が一度に終わらない時、途中の任意の列から入力を始めたい場合はどこにどのように書けば良いのでしょうか? 本に書かれていることは丸写しできますが、ちょっとでも違うと壁にぶつかってしまいます。 独学で勉強する時に良いと思われる方法はどんな方法なのでしょうか? おこがましいですが素人も分かりやすい説明をして頂けると助かります。 宜しくお願いします。

  • VBA コマンドボタン 頭に0がでない

    各ボタンに以下を入れる Private Sub CommandButton1_Click() Selection.Value = Selection.Value & "1" End Sub Private Sub CommandButton2_Click() Selection.Value = Selection.Value & "2" End Sub . . Private Sub CommandButton10_Click() Selection.Value = Selection.Value & "0" End Sub Private Sub CommandButton11_Click() Selection.Value = Selection.Value & "." End Sub 0.1と入力しても0.1が表示できなく、1となってしまいます。 また.1と入力しても0.1でなく、1になってしまいます。 どうすれば良いでしょうか?

  • Excel VBAフォーム 登録ボタンの作成方法

    いつもお世話になっています。 初めて、Excelのフォームで入力画面を作りました。 複数の項目があって、それを最後に[登録]ボタンをクリックで 表に入れたいのですが、一度にまとめて実行する方法が分かりません。 アドバイスよろしくお願いいたします。 Private Sub cmd_1() Dim i As String If man.Value = True Then ActiveCell = man.Caption End If If woman.Value = True Then ActiveCell = woman.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_2() Dim i As String If man.Value = True Then ActiveCell = Yes.Caption End If If woman.Value = True Then ActiveCell = No.Caption End If ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_downlist() Dim ListNo As Long ListNo = group.ListIndex ActiveCell.Value = group.List(ListNo, i) ActiveCell.Offset(0, 1).Select End Sub Private Sub cmd_comment() ActiveCell = comment.Text ActiveCell.Offset(1, -3).Select End Sub

  • マクロでカレンダーから選択したセルに日付を入力したい

    こんばんは。最近VBAの勉強を始め参考書を見ながら下記プログラミングを使い、選択したセルにカレンダーから日付をダブルクリックで入力したいのですが、記述が分かりません(○○○部分)。入力するセルは行や列を一行毎ずらしたりせず、自由に選択してダブルクリック入力したいのです。今の記述だと、1つのセルだけ入力した後、次のセル選択が出来ず困っています。ご指導宜しくお願い致します。 Private Sub Calendar1_Click() ActiveCell.Value = Calendar1.Value  ○○○○ End Sub ----------- Private Sub UserForm_Initialize() Calendar1.Value = Data End Sub ----------- Private Sub Sheet1_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column <> 1 Then Exit Sub UserForm1.Show Cancel = True End Sub

  • エクセル マクロ 出力と移動

    Private Sub CommandButton1_Click() Range("B8").Value = 1856 Range("B9").Value = "abc" Range("B11:D13").Value = "abc" End Sub (1)シート1にボタンを作成して出力できるようにしたのですがシート2に出力したい (2)(1)の続きでボタンを押した時、文字が入力後にそのシートに飛ぶようにしたいのですが どうすればいいでしょうか?

  • マクロで作ったボタンのサイズが小さくなる

    エクセルにて、以下の2種類のボタンを作成しました。 1、ボタンを押すとプリントアウトへ進む (Private Sub ×△□_Click() Application.Dialogs(xlDialogPrint).Show End Sub) 2、ボタンを押すとあるセルの数値をインクリメントする (Private Sub inc_Click() Sheets("○×△").Select Cells(6, 13) = Cells(6, 13) + 1 End Sub ) これらのマクロを作成しテストした際は、全く問題なく動作しました。 しかし、同エクセル内の別シートに参照となるデータを加えながら 普段使っているのですが、たまにボタンを押して操作すると、 ボタンのサイズが少し小さくなってしまうのです。 (ボタンとは、自分で作成したコマンドボタンです) プリントアウトやインクリメントを繰り返していくと、 どんどんボタンが小さくなり、クリックできないくらいのサイズに なってしまいます。なぜこのような事が起こるのでしょうか。 自分でいろいろ試してみたつもりなのですが、 上記現象が再現する場合と再現しない場合があり、 どういう時に再現しているのかも掴めません。 もし、心当たりのある何かがございましたら、 ぜひ教えてください。 宜しくお願いします。

  • エクセル マクロ 特定の文字の色を変更

    Private Sub CommandButton6_Click() MsgBox Mid(ActiveCell, InStrRev(ActiveCell, "⇒") + 1) End Sub このようなマクロがあり 選択しているセルの最後から⇒まで部分をMsgboxで表示してくれますが この文字の色を変更したい場合はどうすればいいでしょうか?

  • エクセル コードを教えてください。

    シート内にいくつかのボタンを用意しています。 各ボタンに文字を入力していますが、ボタンを押したときに、その文字をセル内に入力するコードを教えていただきたいのです。 いま、現在は、下記のようにしています。 これだと、コードをボタンの分だけ作らなければなりません。 もし、ボタンに入力されているものを入力するコードなら一つだけでいいと思いますが、どのように変更すればよいでしょうか? よろしくおねがいします。 Sub 角丸四角形2_Click() ActiveCell.Value = "あいうえお" End Sub

  • マクロでエラー

    Excelのチェックボックスについて ご質問致します。 デザインの都合上、 チェックボックスで「いずれか1つを選べる」ように マクロを作成しています。 1つの質問に対して3つの選択肢があります。 ・Aボタンをチェックしたら、BとCのチェックを外してセルの名前「質問1」に0を入力 ・Bボタンをチェックしたら、AとCのチェックを外してセルの名前「質問1」に1を入力 ・Cボタンをチェックしたら、AとBのチェックを外してセルの名前「質問1」に3を入力 ということをしたいです これが12問ぐらいあります。 例えば質問1はこんな感じで作成しましたが エラーで、Excelが終了してしまいます。 どの辺がおかしいのかご指摘頂けると嬉しいです Private Sub Q1_A_Click() ActiveSheet.Q1_A.Value = True ActiveSheet.Q1_B.Value = False ActiveSheet.Q1_C.Value = False ActiveSheet.Range("質問1").FormulaR1C1 = 0 End Sub Private Sub Q1_B_Click() ActiveSheet.Q1_A.Value = False ActiveSheet.Q1_B.Value = True ActiveSheet.Q1_C.Value = False ActiveSheet.Range("質問1").FormulaR1C1 = 1 End Sub Private Sub Q1_C_Click() ActiveSheet.Q1_A.Value = False ActiveSheet.Q1_B.Value = False ActiveSheet.Q1_C.Value = True ActiveSheet.Range("質問1").FormulaR1C1 = 3 End Sub

  • (VB初心者) VB起動時既に起動されているExcelの情報

    VisualBasic 6.0 初心者です。 既に起動しているExcelの後にVisualBasicを立ち上げた場合、 既に起動しているExcelの情報を得ることが出来るのでしょうか? やりたい事は Excel起動⇒VB起動⇒Excelのセルを選択⇒そのセルに入力されている値 を取得。 VB起動⇒Excel起動の場合はActiveCellの値を取得出来たのですが 既に起動しているExcelの場合 エラー になってしまいます。 お手数ですが、ご教授願います。 Private Sub コマンド1_Click() MsgBox ActiveCell End Sub 'Form_Load時にこれを実行しないと開いたExcelのアクティブセル値を得られない?? Private Sub Form_Load() MsgBox ActiveCell End Sub