Я разрабатываю приложение в Excel, которое позволяет пользователю настраивать конфигурацию ввода / вывода ПЛК, выбирая из большого списка различных модулей ПЛК. Модули выбираются путем выбора в порядке Производитель, Семейство устройств, Тип устройства и Имя модуля. Каждый выбор атрибутов соответствует отдельному элементу управления ListBox. ListFillRange каждого ListBox управляется предыдущим ListBox. Например, когда я щелкаю первый ListBox, чтобы выбрать моего производителя, мой код VBA очищает предыдущее семейство устройств ListFillRange и заполняет его всеми семействами устройств от вновь выбранного производителя. Кроме того, каждый ListBox использует определенный диапазон, так как это ListFillRange. Возможно, я могу заполнить каждый список выбора ListBox более непосредственно с помощью VBA, но я не смог понять, как это сделать. Каждый ListBox использует событие ListBox_Click () для запуска своего кода. Проблемы у меня следующие.
Похоже, что когда один ListBox очищает ListFillRange следующего ListBox, он запускает код следующего ListBox для запуска, и это часто вызывает «Ошибка времени выполнения» 1004: сбой при очистке метода класса Range . "
Когда код не выдает ошибку, он часто изменяет размер следующего ListBox до такой степени, что его невозможно прочитать.
Ниже приведен пример кода, запускаемого при нажатии на ListBox семейства устройств. Он очистит диапазон заполнения списка типов модулей и снова заполнит его всеми типами модулей из вновь выбранного семейства устройств.
Private Sub ListBox2_Click()
Dim row As Integer
row = 2
Dim totalRows As Integer
Dim ModuleTypes(30) As Variant
Dim ArrayIndex As Integer
ArrayIndex = 0
totalRows = ThisWorkbook.Sheets("Tables").Cells(2, 5).Value
'Clear the Module Type selection list on the PLC Module Data Sheet.
'ThisWorkbook.Sheets("PLC Module Data").Range("C2:C500").Clear
'Clear the Table Name search result list on the PLC Module Data Sheet.
ThisWorkbook.Sheets("PLC Module Data").Range("I2:L500").Clear
'Search the Table Name sheet for all entries fromm the selected MFG and with the selected Family and paste them onto the PLC Module Data Sheet.
For i = 2 To totalRows
If (ThisWorkbook.Sheets("Tables").Cells(i, 2).Value = ListBox1.Value) And (ThisWorkbook.Sheets("Tables").Cells(i, 3).Value = ListBox2.Value) Then
ThisWorkbook.Sheets("PLC Module Data").Cells(row, 9).Value = ThisWorkbook.Sheets("Tables").Cells(i, 1).Value
ThisWorkbook.Sheets("PLC Module Data").Cells(row, 10).Value = ThisWorkbook.Sheets("Tables").Cells(i, 2).Value
ThisWorkbook.Sheets("PLC Module Data").Cells(row, 11).Value = ThisWorkbook.Sheets("Tables").Cells(i, 3).Value
ThisWorkbook.Sheets("PLC Module Data").Cells(row, 12).Value = ThisWorkbook.Sheets("Tables").Cells(i, 4).Value
row = row + 1
End If
Next I
'Form an array of all unique Module Types within the Table search results list.
For i = 2 To ThisWorkbook.Sheets("PLC Module Data").Cells(2, 13).Value
If ArrayTest(ModuleTypes, ThisWorkbook.Sheets("PLC Module Data").Cells(i, 12).Value) Then
ModuleTypes(ArrayIndex) = ThisWorkbook.Sheets("PLC Module Data").Cells(i, 12).Value
ArrayIndex = ArrayIndex + 1
End If
Next i
'Copy the ModuleTypes Array into the Module Type selection list on the PLC Module Data Sheet.
For i = 0 To UBound(ModuleTypes)
ThisWorkbook.Sheets("PLC Module Data").Cells(2 + i, 3).Value = ModuleTypes(i)
Next i
'Clear the Temp search result list on the PLC Module Data Sheet.
ThisWorkbook.Sheets("PLC Module Data").Range("U2:X500").Clear
Если кто-нибудь знает, как я могу обойти проблемы, перечисленные выше, и заставить набор ListBoxes работать без проблем, было бы очень признательно. спасибо.