0

ComboBoxコントロールの値に応じてコントロールを有効/無効にしたいフォームがあります。このComboBoxコントロールは、フォーム内の他のすべてのコントロールと同様に、テーブルにリンクされています。ComboBoxのChangeイベント内に、他のコントロールを有効/無効にするコードを配置しました。

私が抱えている問題は、フォームを開いたときに、コントロールが有効/無効になっていないことです。他のすべてのコントロールを有効または無効にするには、ComboBox値を再選択する必要があります。

私が気づいたことの1つは、ComboBox内のRecordSetコントロールが、ComboBoxのvalueプロパティに示されている値に変更されないことが多いことです。

使ってみ
combobox.recordset.filter = "Key = " & combobox.value
ましたがエラーになります
Operation is not supported for this type of object.


アップデート

私の問題は、combobox.recordsetの値にアクセスする方法にもっと関係があると思います。私はcombobox.recordsetがテーブルから受け取った値を保持しているという印象を受けました。しかし、それはレコードソースからの最初のレコードを保持しているようです。

別のレコードセットオブジェクトを使用して、必要な値を検索する必要があると思います。

4

5 に答える 5

2

ほとんどのアクセス制御イベントは、コントロールへのプログラムによる変更によってはトリガーされません。フォームのロード イベントからコントロールを有効にするコードを呼び出すことができます。

使用している Access のバージョンについては言及していませんが、どのバージョンにもコンボボックスの Recordset プロパティがあるとは思いません。

コンボボックスを特定の値に設定しますか?

于 2008-11-07T12:13:01.023 に答える
1

コメントの中で、lamcroは、コームボックスボックスにレコードセットがあるかどうかの問題について観察しています。

フォームのVBコードに侵入し、CBコントロールを「ウォッチを追加」すると、レコードセットプロパティがそこにあります。私はそれ自身の特性を入力して見ることさえできます。

ウォッチリストを設定すると表示されますが、コンボボックスのレコードセットにアクセスしたり、コードで変更したりすることはできません。コンボボックスをフィルタリングするには、そのRowsourceを操作する必要があります。

これは、次の2つの方法のいずれかで実行できます。

  1. イベントを使用して、その場でコンボボックスに新しいRowsourceを割り当てる、または
  2. 他のコンボボックスのRowsourceのWHERE句で、値をフィルタリングするコントロールへの参照を使用します。

cmbComboBox1があり、その中の値を選択するときに、cmbCombBox2にリストされている値を、cmbComboBox1で選択された値に従ってフィルター処理するとします。方法1の場合、最初のコンボボックスのAfterUpdateを使用して、2番目の行ソースを設定します。

  Private Sub cmbComboBox1_AfterUpdate()
    Dim strRowsource As String

    strRowsource  = "SELECT * FROM MyTable"
    If Not IsNull(Me!cmbComboBox1) Then
       strRowsource  = strRowsource & " WHERE MyField = " & Me!cmbComboBox1
    End If
    Me!cmbComboBox2.Rowsource = strRowsource
  End Sub

2番目の方法を使用するには、代わりに、最初の値のテストに基づく2番目のコンボボックスのRowsourceを定義します。

SELECT * FROM MyTable 
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1] 
        AND IsNull([Forms]![MyForm]![cmbComboBox1])=False) 
   OR IsNull([Forms]![MyForm]![cmbComboBox1])=True

これは、最初のコンボボックスに値がある場合は行ソースをフィルタリングし、値がある場合フィルタリングしません。つまり、最初のコンボボックスに値が選択されるまで、フィルタリングされていないリストが表示されます。

次に、cmbComboBox1のAfterupdateイベントで、2番目のコンボボックスを再クエリします。

  Private Sub cmbComboBox1_AfterUpdate()
    Me!cmbComboBox2.Requery
  End Sub

フォームコントロールへの参照が適切に解決されるようにするために、パラメーターを定義することもおそらく良い考えです。したがって、Rowsourceは次のようになります。

PARAMETERS [Forms]![MyForm]![cmbComboBox1] Long;
SELECT * FROM MyTable 
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1] 
        AND IsNull([Forms]![MyForm]![cmbComboBox1])=False) 
   OR IsNull([Forms]![MyForm]![cmbComboBox1])=True

(自動番号PKでフィルタリングしていると仮定すると、データ型が異なる場合は、もちろん、異なるデータ型を使用します)

動的なRowsource割り当てを使用する傾向があります。これは、Accessのさまざまなバージョン間で問題が少ないことがわかったためです(つまり、フォーム上のコントロールへの参照は、Accessのすべてのバージョンで同じように解決されるわけではありません)。

于 2008-11-08T03:18:41.600 に答える
1

ここで試みていることを行う 1 つの方法は、combobox.change() を form.current() メソッド内に配置することです。

これは、フォームが起動して実行されるとすぐに、コンボボックスが変更されたかのように機能します。

以前にこれに似たようなことをしたことがありますが、現時点では目の前にコードがありません。詳細がわかり次第、ここに投稿しますが、頭のてっぺんから、これが私がやった方法だと思います。

于 2008-11-07T12:09:29.423 に答える
0

あなたが持っているコンボボックスの種類と、何をしたいのか説明してもらえますか? たとえば、フォームのレコードを検索するために使用されるバインドされていないコンボ ボックスや、テーブル内のフィールドを更新するために使用されるバインドされたコンボ ボックスがありますか? これは、RowSource および ControlSource プロパティによって制御されます。コンボボックスには、レコードセット プロパティがありません。バインドされていないコンボボックスは、フォームを開いたときに値を持たず、レコードからレコードに移動しても値が変化しませんが、現在のイベントを使用して値を簡単に割り当てることができます。

編集私はあなたが何をしたいのかまだはっきりしていません。コメントに従って、オプションが選択されたときにコントロールを変更する際に問題がありますか、それともフォームが開いたときにコンボの値を設定する際に問題がありますか? おそらく、元の投稿で暗示されているように、コンボの RowSource を変更しますか?

于 2008-11-07T13:48:14.140 に答える
0

'フォームのプロパティでキー プレビューを確認します

'combobox.value のここでデバッグ (デバッグ ウィンドウの場合は Ctrl+G )

Debug.print コンボボックス.値

me.filter = "キー = " & コンボボックス.値

'ms アクセス バージョンに応じて、me.reload または me.refresh の可能性があります

于 2008-11-07T17:43:57.423 に答える