2018年4月27日金曜日

エラー回避してみる

Mainフォームにデータソースを設定して、移動ボタンとかで、
カレントレコードが変わったら起こるイベントに、コードを書いた。
UserIdをココに入れなさい。と。
Mainフォームで普通にカレントレコードを移動させてれば、問題なく動く。
よしよし(*゚-゚)

しかし、ボタンから別フォームを呼び出し、その別フォーム側から、
(close時に)MainフォームをRequeryしたら、

『実行時エラー '2113' このフィールドに入力した値が正しくありません。』

が出た。
とりあえず切り分けのため、Debug.Print RecordSet!UserId してみたら、

『実行時エラー  '3021'カレントレコードがありません。』

なんですと!?

そんなわけで、Record数、EOF、BOFを表示してみる。
RecordSet.RecordCount → 7(正常
RecordSet.EOF →False(EOFではない
RecordSet.BOF →False(BOFではない

…正常すぎじゃん( ゚-゚)~゚

こりゃ判断出来ないわってんで、エラー拾ってスルーするようにしました。

Private Sub Form_Current()
  '子フォームでRequeryされたとき、カレントレコードが取得できないので回避させる。
  On Error Resume Next
  Cmb_UserId.Value = Me.Recordset!UserId
  Select Case Err.Number
    Case 0      '正常
    Case 2113 'このフィールドに入力した値が正しくありません。
    Case 3021 'カレントレコードがありません。
    Case Else
      Debug.Print ("ERROR:" & Err.Number)
  End Select
  
  On Error GoTo 0
End Sub

ミソは、まず、On Error Resume Next で、『エラーが置きても次へ進む』指定と、
Select文でErr.Numberで、通していいエラー番号ダケをCaseに書き、
それ以外はエラー処理をするコト。
最後に、On Error GoTo 0 で、
『エラーを普通に拾ってくれるモード』に戻さないと楽しいコトになります( ゚-゚)~゚

ただスルーするのはキケンだし、
個人的にイヤ(コッチが重要)なのでこうしました( ゚-゚)~゚

通しちゃダメなその他エラーは、Msgboxで表示させるのが親切かも。
エラーコードからエラー内容を引っ張れるなら、エラーダイヤログと同じよーな動きさせるのも可能かもしれません。めんどちいのでやらないけど(ぇ

追記:
しまった。正常時のエラーコード0のcase書くのを忘れてた(*゚-゚)


0 件のコメント:

コメントを投稿