Как получить значение видимой ячейки в таблице после фильтрации - работает только для 1-го значения - PullRequest
0 голосов
/ 14 октября 2019

Я хочу получить значение ячейки в отфильтрованной таблице. Кажется, он работает только для первого значения, но оттуда он также подсчитывает скрытые значения.

Я пытаюсь получить дополнительную информацию о конкретных значениях в таблице. Это своего рода пошаговый процесс фильтрации для некоторых запросов. Поле со списком используется для выбора конкретной области интереса, которая затем показывает «заголовок» всех значений в этой области в ListBox. Затем должно быть возможно увидеть подробное описание запроса, который выбран в ListBox.

Когда запрос выбран в ListBox, он использует номер индекса, чтобы найти нужную строку в таблице иполучить описание оттуда.

Private Sub ListBox1_Click()

    Dim tbl As ListObject
    Dim IndexNmr As Integer

    ComboValue = ComboBox1.Value

   'Store Table Object to a variable and clear all filters
    Set tbl = Worksheets("Data").ListObjects("Tabel1")
    tbl.AutoFilter.ShowAllData

    'Filter Table Object based on ComboValue
    tbl.Range.AutoFilter Field:=8, Criteria1:= _
        ComboValue

    'Find selected index in List Box
     For x = 0 To ListBox1.ListCount - 1
         If ListBox1.Selected(x) = True Then
             IndexNmr = x + 1
         End If
     Next x

     'Find Caption in Table based on the index number
     CaptionString = tbl.DataBodyRange.Columns(10).SpecialCells(xlCellTypeVisible).Cells(IndexNmr).Value
     Label1.Caption = CaptionString

End Sub

Кажется, он работает только для первого видимого значения, которое я могу получить:

`CaptionString = tbl.DataBodyRange.Columns(10).SpecialCells(xlCellTypeVisible).Cells(1).Value`

Но когда IndexNmr - ex. 2, он просто занимает следующую строку ниже первой видимой, даже если она скрыта.

Пример данных таблицы и фильтрации

1 Ответ

1 голос
/ 15 октября 2019

На самом деле, как вы уже видели, SpecialCells работает не так (жалко, кажется, что должно)

Вам нужно будет найти другой способ доступа к n-й видимой строке,Вот демо в одну сторону

Sub Demo()
    Dim lo As ListObject
    Dim lr As ListRow

    Set lo = ActiveSheet.ListObjects(1)

    Set lr = FindNthVisibleRow(lo, 2)

    If Not lr Is Nothing Then Debug.Print lr.Range.Address

End Sub

Function FindNthVisibleRow(lo As ListObject, Idx As Long) As ListRow
    Dim RwCnt As Long
    Dim lr As ListRow

    If Idx <= 0 Then Exit Function    
    For Each lr In lo.ListRows
        If lr.Range.EntireRow.Hidden = False Then
            RwCnt = RwCnt + 1
            If Idx = RwCnt Then
                Set FindNthVisibleRow = lr
                Exit For
            End If
        End If
    Next
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...