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 中的单元格数量大大超过了 Integer(i 的现有类型)。
错误过程中有几个问题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
好吧,不太确定我做错了什么,但是当我 运行 它时,它给了我一个溢出错误。第一个组合框中的下拉列表工作正常,但是当我 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 中的单元格数量大大超过了 Integer(i 的现有类型)。
错误过程中有几个问题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