プロが教えるわが家の防犯対策術!

Access 2000 を使用しています。
フィールド名 データ型
Code     テキスト型(フィールドサイズ=8)
Name     テキスト型(フィールドサイズ=50)
というテーブルがあり、このテーブルを元に帳票フォームを作成しました。このフォームは参照用として使用したいので、
AllowEdits/更新の許可
AllowDeletions/削除の許可
AllowAdditions/追加の許可
のプロパティは全て「いいえ」にしてあります。
このフォームのフッタ部分に txtFilter というテキストボックスと cmdFilter というコマンドボタンを置き、フィルターの動作をさせるため、
Private Sub cmdFilter_Click()
  If IsNull(txtFilter.Value) Then
    FilterOn = False
  Else
    Filter = "Code LIKE """ & txtFilter.Value & "*"""
    FilterOn = True
  End If
End Sub
としました。(見やすくするため全角空白を使用しています。)
さらに、txtFilter に 8文字 ( Code フィールドのフィールドサイズ ) 以上は入力できないようにしようと思い、
Private Sub txtFilter_KeyPress(KeyAscii As Integer)
  If KeyAscii <> 8 Then
    'Delete 以外の場合
    If Len(txtFilter.Text) = 8 Then
      KeyAscii = 0
    End If
  End If
End Sub
としましたが、ここで問題が起きました。
・FilterOn = False
あるいは、
・FilterOn = True でも何レコードが表示されている状態(該当レコードが存在する文字が txtFilter に入力されている)
という場合は良いのですが、該当レコードが存在しない場合、 txtFilter に入力されている文字を変更しようとすると、
txtFilter_KeyPress() 中の
If Len(txtFilter.Text) = 8 Then
のところで「実行時エラー'2185' コントロールがフォーカスを取得していないときに、コントロールのプロパティまたはメソッドを参照することはできません。」となってしまいます。
入力中のコントロールですから、「そんな馬鹿な!?」という感じなんですが、
If Len(txtFilter.Text) = 8 Then
の前に
txtFilter.SetFocus
を入れても状況は同じでした。
フォームの「AllowAdditions/追加の許可」プロパティを「はい」にすれば、上記のようなエラーは発生しないのですが(なぜ、「AllowAdditions/追加の許可」プロパティの違いでそのようなことになるのかは理解できませんが)、ユーザーにデータの変更や追加、削除はさせたくないテーブルなので、追加を許すわけにもいきません。
何かいい回避方法はありませんでしょうか。
よろしくお願いします。

A 回答 (2件)

フォームのプロパティではなく、


テーブルのレコードのテキストボックスのプロパティで、
データのタブの下の方にある、使用可能を「いいえ」、
編集ロックを「はい」にすればいいと思われます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど、そういう手がありましたね。思いつきませんでした。

お礼日時:2007/08/09 23:39

accessでは


If Len(txtFilter.Text) = 8 Then

If Len(txtFilter.Value) = 8 Then
にするとできるのではなかったかな?
なぜだか詳しく追求したことはありません。

この回答への補足

質問文に誤りがありましたので訂正いたします。

>AllowEdits/更新の許可
>AllowDeletions/削除の許可
>AllowAdditions/追加の許可
>のプロパティは全て「いいえ」にしてあります。

と書いていましたが、AllowEdits/更新の許可は「はい」になっていました。(AllowEdits/更新の許可を「いいえ」にすると、フッタに配置してある txtFilter テキストボックスまでも入力不可になってしまうので。)

補足日時:2007/08/09 23:28
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かに、
If Len(txtFilter.Text) = 8 Then

If Len(txtFilter.Value) = 8 Then
に変更しますと、実行時エラーは発生しなくなりますが、目的の動作にはなりません。

例えば、
(1) txtFilter に ABCDEFGH と入力
(2) cmdFilter クリック ( Filter がセットされ、該当レコードなしになる )
(3) txtFilter の ABCDEFGH を削除 ( Delete または BackSpace で削除 )
(4) txtFilter に AAA を入力
という操作をする場合ですと、
(3) ~ (4) の KeyPress イベント中は、
txtFilter.Value = "ABCDEFGH"
になっていますので、(4) で 何か文字を入力しようとしてもできなくなってしまいます。

お礼日時:2007/08/09 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す