使用 VBA 通过所选单元格值的组合过滤 table - 语法错误

filter a table by combination of selected cell values using VBA - syntax error

你能帮我看看下面的代码吗,我一直收到 语法错误

宏的objective是通过同一列下的多行选择来过滤的。

我遇到语法错误的行是:

sColumn(n) = sColumn(n) & _
If(sColumn(n) vbNullString, ",", "") & oCell.Text


If sColumn(n) vbNullString Then

完整代码如下:

Sub combinationFilter()

Dim oRange As Range
Dim oArea As Range
Dim oCell As Range
Dim oLO As ListObject
Dim sColumn() As Variant
Dim n As Long

' Create Filter
Set oLO = Selection.ListObject

If Not oLO Is Nothing Then

    ReDim sColumn(1 To oLO.ListColumns.Count)

    Set oRange = Intersect(Selection, oLO.DataBodyRange)

    For Each oArea In oRange.Areas
        For Each oCell In oArea.Cells
            n = oCell.Column - oLO.Range.Column + 1
            sColumn(n) = sColumn(n) & _
            IIf(sColumn(n) vbNullString, ",", "") & oCell.Text
        Next oCell
    Next oArea

    ' Apply Filter
    For n = LBound(sColumn) To UBound(sColumn)
        If sColumn(n) like vbNullString Then
            oLO.Range.AutoFilter _
            Field:=n, _
            Criteria1:=Split(sColumn(n), ","), _
            Operator:=xlFilterValues
        End If
    Next n

End If

End Sub

我还在以下行中收到不匹配错误:

If sColumn(n) like vbNullString Then
oLO.Range.AutoFilter _
Field:=n, _
Criteria1:=Split(sColumn(n), ","), _
Operator:=xlFilterValues

提前谢谢你。

您需要 IIF function,而不是 IF。

sColumn(n) = sColumn(n) & _
  IIF(CBool(Len(sColumn(n))), ",", vbNullString) & oCell.Text

此外,您的 sColumn 数组可能是 null/vbnullstring/empty 字符串。如果 sColumn(n) 中有内容,您只想尝试 Range.AutoFilter Method,如果没有则不尝试。

' Apply Filter
For n = LBound(sColumn) To UBound(sColumn)
    If sColumn(n) <> vbNullString Then
        oLO.Range.AutoFilter _
        Field:=n, _
        Criteria1:=Split(sColumn(n), ","), _
        Operator:=xlFilterValues
    End If
Next n

您不能将空数组元素(例如 vbNullString)拆分为任何内容,因此您会收到错误 13:类型不匹配。

根据您的情况,正确的语法可能如下所示:

sColumn(n) = sColumn(n) & IIf(IsNull(sColumn(n)), "", ",") & oCell.Text

或者,正如成员@Jeeped 所指出的,使用 Like 运算符而不是 Is(或使用等号 "="):

sColumn(n) = sColumn(n) & IIf(sColumn(n) Like vbNullString, "", ",") & oCell.Text

希望这可能有所帮助。