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で制御するとより柔軟に操作できます!
コメント
コメントを投稿