ms access フォーム Undo の動作

 

ms accessのフォームについてですが、


作成したフォームで入力したあと、

undo を行いたいときには


ctrl + zで undoが行われるのでしょうか?


それとも、vbのコードで フォームに対して

キーイベントの処理を追加しなければならないのでしょうか?


ms accessのフォームに対して

キーイベントのリスナは追加できるのでしょうか?



MS Accessのフォームでは、

標準の **Ctrl + Z** で「元に戻す(Undo)」が動作しますが、


その挙動にはいくつかの注意点があります。



### **1. Ctrl + Z による Undo**


- フォームの **テキストボックス** などのコントロールに入力したデータは、 

**確定前であれば Ctrl + Z で元に戻せます**。


- **レコード単位** では、 **Escキーを2回押す** ことで、

そのレコードのすべての編集を元に戻すことができます。


  - **1回目の Esc** 

→ コントロール(入力フィールド)での変更を元に戻す

  

  - **2回目の Esc** 

→ フォーム全体のレコード編集を元に戻す


### **2. VBAで Undo を行う方法**


もし **コードで明示的に「元に戻す」処理を行いたい** 場合は、

以下の方法を使えます。



#### **(1) コントロールの変更を元に戻す**


```vba


Me!テキストボックス名.Undo


```

これは、特定のテキストボックスでの変更をキャンセルします。


#### **(2) レコード全体の変更を元に戻す**


```vba


If Me.Dirty Then


    Me.Undo

End If

```

`Me.Dirty` は、

現在のレコードが変更されたかどうかを判定するプロパティです。


変更されていれば `Me.Undo` でレコード全体を元に戻せます。


---


### **3. VBAでキーイベントのリスナを追加する**


**キーイベント(Ctrl + Zなど)をキャッチして

カスタム処理を追加** したい場合、

`KeyDown` または `KeyPress` イベントを利用できます。


#### **(1) フォームの KeyPreview を有効にする**


フォームの「キーイベント」を取得するには、

**フォームの `KeyPreview` プロパティを 

`True` に設定** する必要があります。



- フォームのプロパティシートから `KeyPreview` を `Yes` に設定する


- または VBAで設定:

  ```vba

  

  Private Sub Form_Open(Cancel As Integer)

      Me.KeyPreview = True

  End Sub

  

  ```


#### **(2) KeyDown イベントで Ctrl + Z を検出**


```vba


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

    ' Ctrl + Z が押されたか確認

    If KeyCode = vbKeyZ And Shift = acCtrlMask Then

        If Me.Dirty Then

            Me.Undo

            MsgBox "変更を元に戻しました。", vbInformation

        End If

    End If

End Sub


```


- `vbKeyZ` は「Zキー」


- `acCtrlMask` は「Ctrlキーの押下」を示す



このコードをフォームの `KeyDown` イベントに設定すれば、

Ctrl + Z を押したときにレコードの変更を元に戻すことができます。


---


### **まとめ**


1. **通常の Ctrl + Z** 

 

   - コントロール(テキストボックスなど)単位では動作する

   

   - レコード単位では **Escキーを2回押す** ことで元に戻せる

   

   

2. **VBAで明示的に Undo したい場合**


   - `Me!テキストボックス名.Undo` → 1つのコントロールの変更を元に戻す

   

   - `Me.Undo` → レコード全体の変更を元に戻す

   

   

3. **キーイベントのリスナを設定して Ctrl + Z をカスタム処理**


   - フォームの `KeyPreview = True` に設定

   

   - `KeyDown` イベントで `Ctrl + Z` を検出して `Me.Undo` を実行



カスタマイズしたい場合は、

VBAで制御するとより柔軟に操作できます!



コメント