Получение видимых данных из отфильтрованной таблицы - PullRequest
0 голосов
/ 12 апреля 2020

Мне нужно отфильтровать некоторые данные из длинного объекта таблицы Excel. Я извлек один объект таблицы из Worksheets.ListObjects и отфильтровал его так:

    tbl.Range.AutoFilter Field:=5, Criteria1:="Foo"
    tbl.Range.AutoFilter Field:=8, Criteria1:="Bar"

Таблица на рабочем листе Excel теперь отображается как отфильтрованная правильно, но если я пытаюсь получить доступ к ее данным, вся сфера возвращается. Например, эта функция

tbl.Range.SpecialCells(xlCellTypeVisible).Cells(2, 1) 

возвращает ячейку из первой строки таблицы вместо первой видимой строки.

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

проблема в том, что диапазон, начинающийся с SpecialCells(), является (почти всегда) прерывистым, поэтому вы должны перебирать его Areas и его столбцы, чтобы получить желаемый результат

Function GetAreaRangeItem(areaRng, rowIndex As Long, colIndex As Long)
    Dim iArea As Long, nRows As Long

    With areaRng
        Do
            iArea = iArea + 1
            nRows = nRows + .Areas(iArea).Rows.Count
        Loop While rowIndex > nRows And iArea < .Areas.Count

        If iArea <= .Areas.Count Then
            With .Areas(iArea)
                If colIndex <= .Columns.Count Then
                    GetAreaRangeItem = .Item(colIndex)
                Else
                    MsgBox "column index out of range!"
                End If
            End With
        Else
            MsgBox "row index out of range!"
        End If
    End With

End Function

например:

MsgBox GetAreaRangeItem(tbl.Range.SpecialCells(xlCellTypeVisible), 2, 10)
0 голосов
/ 13 апреля 2020

Я перебрал таблицу и проверил на .Row Height, затем скопировал каждую строку в sheet2.

j = 1
Sheet2.Cells(1, 1).Resize(tbl.ListRows.Count, tbl.ListColumns.Count).ClearContents
tbl.Range.AutoFilter Field:=5, Criteria1:="Foo"
tbl.Range.AutoFilter Field:=8, Criteria1:="Bar"
  For i = 1 To tbl.ListRows.Count
    If tbl.ListRows(i).Range.RowHeight > 0 Then
         Sheet2.Cells(j, 1).Resize(, tbl.ListColumns.Count) = tbl.ListRows(i).Range.Value
        j = j + 1
    End If
  Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...