You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:30:04