Hide Row, если значение в данной строке существует в другой таблице - PullRequest
0 голосов
/ 04 мая 2018

У меня есть таблица с продуктами, и я хочу скрыть строку, если указанный продукт можно найти в другой таблице. Поэтому для каждой строки таблицы 1 проверьте, можно ли найти значение в столбце A в столбце A таблицы 2, и, если да, скройте эту строку в таблице 1.

У меня есть этот код, который я использую в качестве базы, но мне еще предстоит выяснить, как обратиться к второй колонке таблицы 1 для проверки.

For Each row In myTable.DataBodyRange.Rows
    If row.Cells(1, 1).Value = 'can be found in column A table 2 Then
       row.Hidden = True
    End If
Next

EDIT:

Мой окончательный рабочий код, предоставленный @Vityata для всех, кто заинтересован:

Public Sub TestMe()

    Dim tbl1 As ListObject
    Set tbl1 = ActiveSheet.ListObjects("Table1")

    Dim tbl2 As ListObject
    Set tbl2 = ActiveSheet.ListObjects("Table2")

    Dim myRow As Range

    For Each myRow In tbl1.DataBodyRange.Rows
        If Not myRow.Cells(1, 1).EntireRow.Hidden Then
        Dim hideMe As Variant
        hideMe = Application.Match(myRow.Cells(1, 3).Value2, tbl2.Range.Columns(1).Cells, 0)
        If IsError(hideMe) Then hideMe = False
        myRow.Cells(1, 1).EntireRow.Hidden = hideMe
        End If
    Next myRow

End Sub

Ответы [ 2 ]

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

Вы также можете отфильтровать таблицу в столбце «Продукт» в таблице на листе 1, используя значения из столбца «Продукт» на листе 2. Мне потребовалось больше времени для отладки, поэтому я видел только некоторые элементы, похожие на уже полученный ответ

Option Explicit

Public Sub test()
    Dim rng As Range
    Dim lookupRange As Range
    Dim loopRange As Range
    Dim found As Variant
    Set loopRange = ThisWorkbook.Worksheets("Sheet1").ListObjects("Table2").DataBodyRange.Columns(1)
    Set lookupRange = ThisWorkbook.Worksheets("Sheet2").ListObjects("Table1").DataBodyRange.Columns(1)

    Dim arr()
    ReDim arr(loopRange.Count)

    With ThisWorkbook.Worksheets("Sheet1").ListObjects("Table2").Range
        .AutoFilter
        For Each rng In loopRange.Cells
            found = Application.Match(rng.Value, lookupRange, 0)
            If IsError(found) Then
                arr(counter) = rng.Value
                counter = counter + 1
            End If
        Next rng
        .AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
    End With
End Sub
0 голосов
/ 04 мая 2018

Вот, пожалуйста:

Public Sub TestMe()

    Dim tbl1 As ListObject
    Set tbl1 = ActiveSheet.ListObjects("Table1")

    Dim tbl2 As ListObject
    Set tbl2 = ActiveSheet.ListObjects("Table2")

    Dim myRow As Range

    For Each myRow In tbl1.Range.Rows
        Dim hideMe As Variant
        hideMe = Application.Match(myRow.Cells(1, 1).Value2, tbl2.Range.Columns(1).Cells, 0)
        If IsError(hideMe) Then hideMe = False
        myRow.Cells(1, 1).EntireRow.Hidden = hideMe
    Next myRow

End Sub

  • Код перебирает каждую строку tbl1.Range.Rows;
  • Назначает «логическое» значение True до hideMe, если ячейка найдена через Application.Match;
  • Если ячейка не найдена, выдается ошибка, которая переводится в False;
  • myRow.Cells(1,1).EntireRow.Hidden = hideMe скрывает строку;
  • Если вы хотите исключить Header таблицы из поиска, измените цикл на:

    For Each myRow In tbl1.DataBodyRange.Rows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...