VBA 组合框不返回第二个下拉列表

VBA comboBox not returning second drop down list

好吧,不太确定我做错了什么,但是当我 运行 它时,它给了我一个溢出错误。第一个组合框中的下拉列表工作正常,但是当我 select 列表中的“subcat”时,它给了我溢出错误。

有什么线索吗?

Option Explicit
Private Sub ComboBox1_Change()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Detailed")
Dim i As Integer
Dim n As Integer

n = Application.WorksheetFunction.Match(Me.ComboBox1.Value, sh.Range("3:3"), 0)
Me.ComboBox2.Clear
For i = 4 To Application.WorksheetFunction.CountA(sh.Cells(3, n).EntireColumn)
    Me.ComboBox2.AddItem sh.Cells(i, n).Value
Next i

End Sub


Private Sub UserForm_Activate()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Detailed")

Dim i As Integer

Me.ComboBox1.Clear
For i = 1 To Application.WorksheetFunction.CountA(sh.Range("3:3"))
    Me.ComboBox1.AddItem sh.Cells(3, i).Value
    'ComboBox1.Text = "SubCat"
    
Next i

End Sub

将 i 的声明更改为 Long 类型,因为 EntireColumn 中的单元格数量大大超过了 Integeri 的现有类型)。

错误过程中有几个问题ComboBox1_Change():

  • 将所有整数声明为 Long 以避免溢出错误 6, 顺便说一下,对于行值超过 32 767 的正整数限制的情况,这是典型的。
  • 定义数据的 HeaderRow,例如作为常量 Const HeaderRow As Long = 3
  • 通过在HeaderRow前添加行数来扩展循环范围,即HeaderRow - 1:
For i = HeaderRow + 1 To Application.WorksheetFunction.CountA(sh.Cells(HeaderRow, n).EntireColumn) + (HeaderRow - 1)
    ' ...
Next i 

进一步提示

请注意,选择的计算数据行数的方法会忽略空单元格,因此我更喜欢

Dim LastRow as Long
LastRow = sh.Cells(sh.Rows.Count, n).End(xlUp).Row
For i = HeaderRow + 1 To LastRow
    '...
Next i

因为每个元素一个一个相加可以time-consuming,
我宁愿避免蜂窝循环并将整个列数据写入变体数据字段数组和 最终将它们一次性分配给组合框 .List 属性 .

With sh
    Dim data As Variant
    data = .Range(.Cells(HeaderRow+1,n),.Cells(LastRow,n)).Value2
    Me.ComboBox1.List = data
End With

甚至可以缩短到

With sh
    Me.ComboBox1.List = .Range(.Cells(HeaderRow+1,n),.Cells(LastRow,n)).Value2
End With