まず、次のようなフォームとプログラムがあるとします。

Private Sub cbo都道府県_BeforeUpdate(Cancel As Integer)
'常にキャンセル
Cancel = True
End Sub
ここでは、あくまでも無理やりの例ではありますが、「都道府県」のデータは変更不可となります。このフォームを動かしてみると次のような動作をします。
- 初期状態(都道府県はすでにテーブルに保存済みの値が初期表示される)

- 都道府県のコンボボックスのドロップダウンリストから別の都道府県を選択します

- それによって見た目はいったん選択後の都道府県に変わります

- この時点ではまだコンボボックスの状態は”編集中”です。このあとEnterキーを押したりマウスで他のコントロールへ移動しようとしたりした時点で”更新”されようとしますが、「BeforeUpdate/更新前処理」イベントプロシージャの処理が実行されそれがキャンセルされますので、次へフォーカスを移動させることはできません。
さらに、入力がキャンセルされたといってもコンボボックスの選択値は元に戻るわけではありません。選択後の値が表示されたままになります。
このような場面で、「BeforeUpdate/更新前処理」イベントプロシージャで更新操作がキャンセルされたとき、コンボボックスの選択値を強制的に元の値に戻す方法です。
それには、そのイベントプロシージャを次のようにします。
Private Sub cbo都道府県_BeforeUpdate(Cancel As Integer)
If Me!cbo都道府県 <> "千葉県" Then
'千葉県以外は更新をキャンセル
Cancel = True
'コンボボックスの選択値を元に戻す
Me!cbo都道府県.Undo
End If
End Sub
この例では、選択された値が”千葉県”以外のときは更新をキャンセルするとともに、コンボボックスの選択値を変更前の値に戻しています。”千葉県”であるときはキャンセルしないでその値を受け入れます。
実行例:
- 初期状態(”東京都”が表示されている)

- ドロップダウンリストから”埼玉県”を選択します

- キャンセルされ、コンボボックスは”東京都”のままになっています

- 今度は”千葉県”を選択します

- ”千葉県”が選択された状態になります
|