使一系列Excel Listbox控件无缝协同工作

时间:2019-03-26 12:39:59

标签: excel vba listbox-control

我正在用Excel开发一个应用程序,允许用户通过从一大堆不同的PLC模块中进行选择来设置其PLC IO配置。通过依次选择制造商,设备系列,设备类型和模块名称来选择模块。每个属性选择都对应于一个不同的ListBox控件。每个列表框的ListFillRange由上一个列表框控制。例如,当我单击第一个列表框以选择我的制造商时,我的VBA代码清除了以前的设备系列ListFillRange,并用新选择的制造商的所有设备系列重新填充了它。另外,每个ListBox都使用特定范围作为ListFillRange。可能是这样的情况,我可以使用VBA更直接地填充每个ListBox选择列表,但我一直无法弄清楚该怎么做。每个ListBox使用ListBox_Click()事件运行其代码。我遇到的问题如下。

  • 似乎当一个ListBox清除下一个ListBox的ListFillRange时,它触发下一个ListBox的代码运行,并且这通常会导致“运行时错误'1004':Range类的Clear方法失败。”

  • 当代码没有出错时,它通常会将下一个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组无缝地协同工作,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

谢谢大家的反馈。我让他们使用注释中提到的标志方法工作。