VBA筛选数组填充ComboBox时触发Run-time error 13(类型不匹配)
解决VBA类型不匹配错误(Run-time error 13)
错误原因
你的代码里header_arr = ws.Range(...).Value2得到的是二维数组(即使只有一行,VBA也会返回(1 to 行数, 1 to 列数)格式的二维数组),但Filter函数要求输入一维数组,因此触发类型不匹配错误。
修复方案:两种可行写法
方案1:先将二维表头数组转为一维,再用Filter筛选
通过循环把二维数组的表头值提取到一维数组,再用Filter函数筛选:
Private Sub UserForm_Initialize() Dim header_arr() As Variant Dim filtered_arr() As Variant Dim ws As Worksheet Dim colCount As Integer Dim i As Integer Set ws = ThisWorkbook.ActiveSheet colCount = ws.Cells(1, 1).End(xlToRight).Column ' 初始化一维数组 ReDim header_arr(1 To colCount) For i = 1 To colCount header_arr(i) = ws.Cells(1, i).Value2 Next i ' 筛选含"price"的表头(默认不区分大小写,要区分的话加参数vbBinaryCompare) filtered_arr = Filter(header_arr, "price", True, vbTextCompare) ' 填充下拉框 For Each item In filtered_arr Me.ComboBox1.AddItem item Next End Sub
方案2:直接遍历表头单元格,筛选后添加到下拉框(更高效简洁)
跳过数组转换步骤,直接遍历第一行的每个表头单元格,判断是否包含"price",符合条件就直接添加到ComboBox:
Private Sub UserForm_Initialize() Dim ws As Worksheet Dim cell As Range Set ws = ThisWorkbook.ActiveSheet ' 遍历第一行从A列到最后一个有值的单元格 For Each cell In ws.Range(ws.Cells(1, 1), ws.Cells(1, 1).End(xlToRight)) ' 判断单元格值是否包含"price"(不区分大小写,要区分则用InStr(1, cell.Value, "price", vbBinaryCompare) > 0) If InStr(1, cell.Value, "price", vbTextCompare) > 0 Then Me.ComboBox1.AddItem cell.Value End If Next cell End Sub
补充说明
- 方案2不需要额外处理数组,代码更简洁,对于上百列的场景性能足够,推荐使用。
- 如果需要区分大小写筛选"price",把
vbTextCompare改成vbBinaryCompare即可。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

