Как мне использовать Dlookup для нескольких критериев для создания динамического списка

#vba #ms-access #combobox #ms-access-2007 #vba7

#vba #ms-access #Список со списком #ms-access-2007 #vba7

Вопрос:

Таблица: tblNomenklatur У меня есть два списка со списком от: txtKategorie и txtTyp. Значения для первого списка со списком (txtKategorie) исправлены! Я хочу, чтобы значения второго списка со списком (txtTyp) изменялись в соответствии с тем, что пользователь выбирает в первом. Если пользователь выбирает «Datalogger», второй список со списком должен содержать только «Base Layer Classic» и «Base Layer Plus», как видно на изображении. Та же идея верна для «Акселерометра».

Я поместил свой код в событие AfterUpdate первого выпадающего списка:

  If txtKategorie.Value = "Datalogger" And txtTyp.ListCount = 0 Then   
    i = 1
    Do While txtTyp.ListCount < DCount("ID", "tblNomenklatur", "[Kat] = 'K'")
    txtTyp.AddItem DLookup("[Typ]", "tblNomenklatur", "[ID] =" amp; i And "[Kat] = 'K'")
    'And "[Kat] = 'K'"
    i = i   1
    Loop
  

Когда форма открывается, только первый выпадающий список «txtKategorie» имеет значения. Когда пользователь выбирает Datalogger, код проверяет, сколько записей в таблице имеют [Kat] = «K», чтобы определить, как долго будет выполняться оператор Do While. Затем «txtTyp.AddItem»-Инструкция должна добавить «Base Layer Classic» и «Base Layer Plus» в поле со списком «txtTyp». Но, к сожалению, код не работает. Существует проблема с Dlookup-Statement, содержащим критерии tow. Если я удалю любой из двух критериев, код сработает, но, очевидно, выдаст неправильные результаты для второго выпадающего списка. Если я оставлю это так, второй список со списком останется пустым.
Кто-нибудь знает, что я делаю не так?

Комментарии:

1. Вам не нужен цикл. Вы можете достичь этого простым способом. Для txtTyp списка со списком создайте запрос к Row Source и задайте критерии для Kategorie столбца вашего первого списка со списком, подобного Forms![FormName]![txtKategorie] . И в After Update случае просто запросите второй список со списком.

2. Я не уверен, что вы имеете в виду: установите критерии для столбца категории вашего первого списка, подобного формам! [formName]! [txtKategorie]. Не могли бы вы, пожалуйста, объяснить? Спасибо.

3. Смотрите мой ответ. Вы должны изменить Form1 и Table1 имя с вашей базой данных Form и Table именем.

4. Большое спасибо за ваш подробный ответ, я попробую его и свяжусь с вами!

Ответ №1:

Вы можете сделать это легко с помощью приведенного ниже кода. Измените имя таблицы на свое имя таблицы.

 Private Sub txtKategorie_AfterUpdate()
    Me.txtTyp.RowSource = "SELECT DISTINCT Table1.Typ FROM Table1 WHERE Table1.Kategorie='" amp; Me.txtKategorie amp; "'"
    Me.txtTyp.Requery
End Sub
  

Или вы можете сделать это графически из конструктора запросов с исходным кодом строки. Ниже приведены шаги.

  1. Список со списком txtKategorie исправлен. Отлично!
  2. Для второго списка со списком txtTyp выполните следующие действия.
  3. Выберите выпадающий список txtTyp . В окне свойств выберите, Row Source затем нажмите на конструктор запросов ... с тремя маленькими точками. Смотрите скриншот.
  4. В окне query Builder создайте запрос из вашей таблицы данных, как скриншот, и задайте критерии для Kategorie столбца, чтобы [Forms]![Form1]![txtKategorie] сохранить и закрыть окно query bulder.

введите описание изображения здесь

Теперь для Combobox txtKategorie в After Update случае напишите ниже строку для запроса txtTyp . Готово!

 Private Sub txtKategorie_AfterUpdate()
    Me.txtTyp.Requery
End Sub
  

Комментарии:

1. Вы гений, решение Query Builder сработало для меня сразу. Я часто использую VBA для решения проблемы, потому что у меня мало знаний о построителе запросов access. Ваше решение показывает, что вам не всегда нужен VBA или очень мало. Большое спасибо!

2. Возможно, еще один вопрос: как эта часть [Формирует]! [Form1]! [txtKategorie] должен посмотреть, находятся ли списки со списком в подчиненной форме?

3. Затем используйте SubForm name вместо родительской формы, например [Forms]![subFrm]![txtKategorie]

4. Я пробовал это, но это работает только тогда, когда я открываю ТОЛЬКО вложенный файл. В нем говорится «Введите значение параметра», когда я нажимаю на поле со списком txtTyp, когда подчиненная форма открыта в основной форме.