#vba #ms-access #combobox #ms-access-2007 #vba7
#vba #ms-access #Список со списком #ms-access-2007 #vba7
Вопрос:
У меня есть два списка со списком от: 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
Или вы можете сделать это графически из конструктора запросов с исходным кодом строки. Ниже приведены шаги.
- Список со списком
txtKategorie
исправлен. Отлично! - Для второго списка со списком
txtTyp
выполните следующие действия. - Выберите выпадающий список
txtTyp
. В окне свойств выберите,Row Source
затем нажмите на конструктор запросов...
с тремя маленькими точками. Смотрите скриншот. - В окне 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, когда подчиненная форма открыта в основной форме.