Не могли бы вы помочь мне с приведенным ниже кодом? Я постоянно получаю синтаксическую ошибку

Целью макроса является фильтрация путем выбора нескольких строк в одном столбце.

Строки, в которых я получаю синтаксическую ошибку:

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

Заранее спасибо.

2
James 17 Апр 2016 в 21:26

2 ответа

Лучший ответ

Вам нужна функция IIF, а не IF.

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

Кроме того, ваш массив sColumn может быть нулевой / vbnullstring / пустой строкой. Вы хотите попробовать Range.AutoFilter Method, только если есть что-то в sColumn (n), а не если его нет.

' 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: Несоответствие типа.

1
17 Апр 2016 в 19:20

В вашем случае правильный синтаксис может быть таким:

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

Или, как указал участник @Jeeped, используя оператор Like вместо Is (или используя знак равенства "="):

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

Надеюсь, это поможет.

2
Alexander Bell 17 Апр 2016 в 19:16