Фильтр массива Excel - PullRequest
       5

Фильтр массива Excel

0 голосов
/ 20 мая 2018

У меня есть данные в четырех столбцах в Excel.Третий столбец («C») содержит строку с названием страны, например «Название страны - Китай».Строка не стандартизирована, поэтому я не могу использовать строковые функции, такие как left / right / mid.Я создаю макрос для фильтрации шести стран (Египет, США, Китай, Россия, Япония и Уганда).Пока я могу получить две страны, используя следующий макрос:

Sub Countries ()
   Activesheet.Range("A1:D1000").Autofilter Field:=3, Criteria1:=Array("*Japan*","*China*"),Operator:=xlFilterValues
End Sub

Это работает, и я могу отфильтровать две страны.Однако, когда я добавляю больше стран, Excel не отображает страны и не возвращает строк.Я не уверен, что я делаю не правильно, и я надеюсь, что кто-то может мне помочь, пожалуйста

1 Ответ

0 голосов
/ 20 мая 2018

Вы можете пройти через страны:

Option Explicit

Sub main()
    Dim filter As Variant
    Dim countriesRng As Range

    Set countriesRng = Range("A1") ' initial dummy range to use Union() without checking for 'countriesRng' being 'Nothing'
    With Range("A1:D" & cells(Rows.Count, "C").End(xlUp).row) ' reference columns A:D from row 1 down to column C last not empty row
        For Each filter In Array("Egypt", "USA", "China", "Russia", "Japan", "Uganda") ' loop through countries
            .AutoFilter Field:=3, Criteria1:="*" & filter & "*" ' filter current country
            If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then Set countriesRng = Union(countriesRng, .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)) ' if any filtered cells other than header then add them to 'countriesRng'
        Next
       .parent.AutoFilterMode = False

        Set countriesRng = Intersect(countriesRng, Range("C:C")) ' get rid of the initial dummy range
        If Not countriesRng Is Nothing Then ' if any filtered country
            .Resize(.Rows.Count - 1).Offset(1).EntireRow.Hidden = True ' hide all records
            countriesRng.EntireRow.Hidden = False ' unhide ones with filtered countries
        End If
    End With
End Sub
...