excel 在VBA中筛选数组时出现类型不匹配错误

flvlnr44  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(232)

我在启用宏的Excel文件中有一个简单的用户表单,表单中有一个组合框(下拉框)。我想在Excel工作表中使用特定的标题值(位于第一行)填充组合框选项。在我的例子中,我有一百多个列,我只需要其中几个包含“价格”值的列。下面是我的VBA代码时,用户窗体初始化:

Private Sub UserForm_Initialize()
    Dim header_arr() As Variant
    Dim filtered_arr() As Variant
    Dim ws As Worksheet
    Set ws = ThisWorkbook.ActiveSheet

    header_arr = ws.Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Value2

    filtered_arr = Filter(header_arr, "price") 'I am getting an error here.

    For Each item In filtered_arr 
        Me.ComboBox1.AddItem (item)
    Next
    
End Sub

代码注解:

header_arr是工作表中第一行的数组。
filtered_arr是我的工作表中包含“price”值的第一行的数组。

但是当我运行代码时,我得到运行时错误13(类型missmatch)。任何帮助将不胜感激。

46scxncf

46scxncf1#

使用行填充组合框

Sub PopulateCombobox()

    Const MatchString As String = "price"
     
    Dim ws As Worksheet: Set ws = ThisWorkbook.ActiveSheet ' improve!

    Dim hData():
    hData = ws.Range("A1", ws.Range("A1").End(xlToRight)).Value ' or .Value2
    
    Dim sc As Long, dc As Long, HeaderString As String
    
    For sc = 1 To UBound(hData, 2)
        HeaderString = CStr(hData(1, sc))
        If InStr(1, HeaderString, MatchString, vbTextCompare) > 0 Then
            dc = dc + 1
            hData(1, dc) = hData(1, sc)
        End If
    Next sc
    
    If dc = 0 Then
        MsgBox "No headers containing """ & MatchString & """ found.", _
            vbCritical
        Exit Sub
    End If
    
    If dc < sc - 1 Then
        ReDim Preserve hData(1 To 1, 1 To dc)
    'Else ' all columns contain the match string; do nothing
    End If
    
    With Me.ComboBox1
        ' Populate column:
        .List = Application.Transpose(hData)
        ' or populate row (probably a bad idea):
        '.ColumnCount = dc
        '.List = hData
    End With
    
End Sub
zazmityj

zazmityj2#

正如@VBasic2008所指出的,Filter()需要一个一维数组。因此,您可以通过转置两次将header_arr转换为一维数组。然后,一旦筛选了数组,就可以简单地使用组合框的List属性来分配筛选后的数组。
请注意以下内容。。

  1. filtered_arr已被声明为动态String数组,尽管它可以被声明为Variant。
    1.已指定目标工作表,请相应地更改名称。
    这是密码...
Private Sub UserForm_Initialize()

    Dim header_arr() As Variant
    Dim filtered_arr() As String
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Worksheets("Sheet1") 'change the sheet name accordingly

    header_arr = ws.Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Value2
    
    With Application
        header_arr = .Transpose(.Transpose(header_arr))
    End With

    filtered_arr = Filter(header_arr, "price", True, vbTextCompare)
    
    Me.ComboBox1.List = filtered_arr

End Sub

相关问题