Работа через отфильтрованный набор в VBA - PullRequest
0 голосов
/ 29 мая 2018

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

У меня есть кнопки вверх и вниз в форме VBA, которые должны показывать данные из отфильтрованного набора.Я выяснил, что я могу применить фильтр, используя этот код:

Dim LR As Long
LR = Range("A" & rows.Count).End(xlUp).Row
Range("A3:AM" & LR).SpecialCells(xlCellTypeVisible).Select

, и это хорошо работает.

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

Я знаю, что могу использовать цикл For, подобный следующему:

For Each Row In Range("A1", Cells(rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeVisible)
   GWEPId = Cells(Row.Row, 1)
   Grip5Status = Cells(Row.Row, 4)
Next Row

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

Если я нажму вниз, я хочу перейти к следующей отфильтрованной строке, а если я нажму вверх, я хочу вернуться к предыдущемуотфильтрованная строка.

Нужно ли поместить все данные в массив, а затем идти вверх и вниз из массива?Есть ли более простой способ?

1 Ответ

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

Я не уверен, что я действительно полностью понимаю ваш вопрос, но вот моя попытка со следующими предположениями:

  • У вас есть действительный фильтр, примененный к первой строке
  • Вы выбрали фактическую строку в вашей базе данных

Тогда вот фрагмент кода, который получит значения из более высокого ряда

Sub GetDataMinus()
'Assign code to your button to get values one row higher

Dim FR As Long, LR As Long, X As Long

FR = ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1).Row
LR = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

If ActiveCell.Row > FR Then
    For X = ActiveCell.Row - 1 To FR Step -1
        If Not Cells(X, 1).Rows.Hidden Then
            ActiveSheet.Rows(X).Select
            Debug.Print Cells(X, 1).Value 'Link the value to where you want to store it, e.g. on your userform
            Debug.Print Cells(X, 4).Value 'Link the value to where you want to store it, e.g. on your userform
            Exit Sub
        End If
    Next X
End If

End Sub

А вот фрагменткод, который даст вам значения на строку ниже:

Sub GetDataPlus()
'Assign code to your button to get values one row lower

Dim FR As Long, LR As Long, X As Long

FR = ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1).Row
LR = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row

If ActiveCell.Row < LR Then
    For X = ActiveCell.Row + 1 To LR
        If Not Cells(X, 1).Rows.Hidden Then
            ActiveSheet.Rows(X).Select
            Debug.Print Cells(X, 1).Value 'Link the value to where you want to store it, e.g. on your userform
            Debug.Print Cells(X, 4).Value 'Link the value to where you want to store it, e.g. on your userform
            Exit Sub
        End If
    Next X
End If

End Sub

Я хочу сделать несколько замечаний:

  • Код можно сделать более элегантным, есть (длинный)способ извлечь последнюю видимую строку в отфильтрованном диапазоне.Я просто не применил его здесь, так как чувствую, что он не добавляет ничего особенного.
  • Я не тестировал этот код на пользовательской форме, но уверен, что вы сможете внести коррективы там, где это необходимо..
  • В коде я предполагаю, что вы выбрали строку в базе данных.Однако вы также можете сохранить последнюю использованную строку в вашей пользовательской форме и использовать ее в качестве входных данных.Идея?
  • Больше путей в Рим, так что, возможно, есть и лучшие способы сделать это, но это была моя попытка:)

Удачи с этим.

...