2

私は、MS Access の使用を主張する人のためにいくつかの作業を行っています。私は通常それを使用しないので、制御構造全体とベストプラクティスに少し慣れていません。私が達成しようとしているのは、値が入力されると、詳細セクションの行をフィルター処理するフィルター テキスト ボックスをフォームに設定することです。それは簡単なユースケースのようです。最初に、On Change イベントのイベント ハンドラーとして次の動作を試しました。

Private Sub FilterGrid()
    Me.Text32.SetFocus

    If Not IsNull(Me.Text32.Text) And Me.Text32.Text <> "" Then
        Me.Filter = "JobNumber LIKE '*" & Me.Text32.Text & "*'"
        Me.FilterOn = True
    End
    Else
        Me.FilterOn = False
    End If
End Sub

これは、一致する行がないものを入力し、全体がこのエラーで爆発するまで完全に機能しました (フォームを閉じないと回復できませんでした): 実行時エラー '2185': プロパティまたはメソッドを参照できませんコントロールにフォーカスがない限り、コントロールの場合。

私はいくつかの読み物をしましたが、一般的な意見は、.Text を使用すべきではなく、.Value (または単にプロパティのない Text32) を使用する必要があるというものでした。これにより、非常に奇妙な動作が発生しました。はText32.Value常に null です。私はウォッチ ウィンドウを持っており、通常の動作でText32.Textは実際の値を持っていますが、 Text32.ValueNULL であることがわかります。

明らかに私は何か間違ったことをしていますが、それが何であるかを知るのに十分な Access の経験がありません。

余談ですが、もう 1 つの提案は Text32.SetFocus、Text プロパティにアクセスする直前に行うことでした。これは、私が言及したエラーを解決しません。それでもまったく同じエラーがスローされます。

ここで正しい方向に私を向けることができる人はいますか?

4

2 に答える 2

3

お気づきのように、テキストボックスValueはコントロールがフォーカスを失った後にのみ設定されます。
逆に、Textコントロールにフォーカスがある間のみ、プロパティにアクセスできます。

プロパティは、Valueコントロールの既定のメンバーとして定義されます。つまり、 はText32暗黙的に と同じText32.Valueになりますが、コンテキストによっては、Text32値だけでなく、コントロール自体を参照することもあります。

これらすべての不一致は、時には腹立たしいことがあります。

手元の問題に戻ると、フィルタリングを処理するには 2 つの方法があります。

  • フィルタリングするリストが大きい場合は、ユーザーがフィルターを入力し、Enter キーを押して検証する方がよいでしょう。
  • リストが大きすぎない場合は、入力時にフィルターを実装できます。

最初のケースでは、ユーザー入力が ENTER によって検証されるのを待ちます。

フィルタリング テキスト ボックスが呼び出され、フィルタリングtxtFilterするデータシート (または連続フォーム) をサブフォームが表示しているフォーム上にあるとします。

あなたがする必要があるのは、テキストボックスOnKeyDownイベントを次のように配線することだけです:

' We will only perform the filter if the user press the ENTER key
Private Sub txtFilter_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case 13, 9
            KeyCode = 0
            QuickFilter
    End Select
End Sub

' Perform the actual filtering on the subform
Private Sub QuickFilter()
    Dim sql As String
    Dim filter As String
    If txtFilter.Text = vbNullString Then
        ' Reset the filter if the textbox is emtpy
        SubForm.Form.FilterOn = False
    Else
        'Some common substitutions that users may have already inserted as wildchars
        filter = Replace(txtFilter.Text, "%", "*")
        filter = Replace("*" & filter & "*", "**", "*")
        ' We construct the filter SQL
        sql = "([JobNumber ] LIKE """ & filter & """)"
        sql = sql & " OR ([ProjectCode] LIKE """ & filter & """)"
        sql = sql & " OR ([SupplierName] LIKE """ & filter & """)"
        '... Add as many columns to filter on as you want

        ' Assign the filter to the subform
        SubForm.Form.filter = sql
        SubForm.Form.FilterOn = True
    End If
End Sub

2 番目のケースでは、入力時にフィルタリングします

かなり簡単です。上記のソリューションに、ユーザーが入力しているときに変更を追跡する方法を追加するだけです。
これはOnChange、texbox のイベントを通じて行うのが最適です。

Private Sub txtFilter_Change()
    QuickFilter
End Sub

追加する必要があるのはそれだけです。

于 2013-08-16T04:17:05.317 に答える