0

フォームに2つのコンボボックスがあります。ComboIDComboName

ComboIDには、1001、1002、1003、1004などのアイテムが含まれています。ComboNameには、John、Matt、David、Lukeなどのアイテムが含まれています。

このデータを含むテーブルがあります:1001、John 1002、Matt 1003、David 1004、Luke

から選択したときにComboID表示したい。また、を選択すると「1002」が表示されます。1001JohnComboNameComboNameMatt

いつでも新しい名前またはIDを選択し、他のコンボボックスで対応する値を更新できるようにする必要があります。

私はこれを機能させることに固執していて、それを実現するのと同じくらい難しいことはありません。私はまだVBAコードを学んでいます。何か助けてください?

4

2 に答える 2

3

First Glance Solution(非推奨)

それは何でしたか

この問題に対する私の最初の反応は、変更イベントを試して使用することでした。その場合、他のコンボボックスの値を変更するために各コンボボックスにサブルーチンを設定することが解決策でした。

なぜあなたはそれを使うべきではないのですか

ただし、Access vba変更イベントのドキュメント(上記のリンク)には、次のように明確に記載されています。

「相互に影響する変更イベントを持つ2つ以上のコントロールを作成しないでください。たとえば、相互に更新する2つのテキストボックス」(msdn access vba change event

残念ながら、これは、変更イベントソリューションを使用して(テキストボックスの代わりにコンボボックスを使用して)実行することとまったく同じです。この例では、ComboIDコンボボックスの変更により、ComboNameコンボボックスの適切な変更がトリガーされますが、ComboNameコンボボックスの変更により、ComboIDの変更が試行され、このループが続行される可能性があります。したがって、これはあなたの問題に対する良い答えではありません。

より良い解決策

この場合、 AfterUpdateイベントを使用するのがより適切なアプローチのようです。

問題のあるループがトリガーされない理由

AfterUpdateのドキュメントに記載されているように:

Visual BasicまたはSetValueアクションを含むマクロを使用してコントロールのデータを変更しても、コントロールのこれらのイベントはトリガーされません。

したがって、AfterUpdateイベント(おそらくSetValueを使用)は、はるかに優れたアプローチである必要があります。

変更イベントの方法のエラーを指摘し、AfterUpdateイベントに注意を向けてくれた@Remouに感謝します。

于 2013-01-03T19:18:13.863 に答える
2

変更イベントがコードに適していることはめったにありません。たとえば、コンボボックスを使用すると、ユーザーはアイテムを入力するだけでなく選択することもできるため、入力された1文字ごとにchangeイベントが発生します。そのイベントに連鎖しているイベントと同様に、恐ろしい合併症の可能性につながります。

このようにコンボボックスを設定して、なぜこれをやりたいのかは少し謎だと思いました。現在のイベントでは、それらの同期を維持する必要がある場合があります。コンボがコントロールソースにバインドされているかどうかについては言及されていないため、ここには含めていません。

ComboID

RowSource: SELECT ID, [Name] FROM Table ORDER BY ID
BoundColumn: 1 
ColumnCount: 2
ColumnWidths: 2cm;0cm ''The second column is hidden,
                      ''the first column is any width

Private Sub ComboID_AfterUpdate()
    Me.ComboName = Me.ComboID
End Sub

ComboName

RowSource: SELECT ID, [Name] FROM Table ORDER BY [Name]
BoundColumn: 1
ColumnCount: 2
ColumnWidths: 0cm;2cm ''The first column is hidden, 
                      ''the second column is any width

Private Sub ComboName_AfterUpdate()
    Me.ComboID = Me.ComboName
End Sub
于 2013-01-04T00:21:07.970 に答える