2016-05-14 2 views
0

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

и я тестировал буксировочный подход, чтобы сделать это

первый подход:
ПОЛУЧИТЬ диапазон видимых строк, как это.

Public rng_arr As Range 

Public Sub UserForm_Activate() 
Set rng_arr = Range(ActiveCell, Cells(ActiveCell.End(xlDown).Row, 1)).Rows.SpecialCells(xlCellTypeVisible) 
End Sub 

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


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

Public Function NextVisibleCell(Range As Range) As Range 
Application.Volatile 
Dim i As Long 
Set Range = Range.Cells(Range.Rows.Count, Range.Columns.Count) 
For i = 1 To Rows.Count - Range.Row 
    If Not Range.Offset(i).EntireRow.Hidden Then 
    Set NextVisibleCell = Range.Offset(i) 
    Exit Function 
    End If 
Next i 
End Function 

ответ

0

Наконец-то я нашел хорошее решение, используя второй подход и его работу.
есть мой код.

Public Function NextVisibleCell(Range As Range) As Range 

Dim i As Long 
Set Range = Range.Cells(Range.Rows.Count, Range.Columns.Count) 
For i = 1 To Rows.Count - Range.Row 
If Not Range.Offset(i).EntireRow.Hidden Then 
    Set NextVisibleCell = Range.Offset(i) 
    Exit Function 
End If 
Next i 
End Function 

Public Function PrevVisibleCell(Range As Range) As Range 
Dim isvisble As Boolean 
isvisble = False 
Dim i As Long 
i = 1 
Do Until isvisble = True 
If Not Range.Offset(-i, 0).EntireRow.Hidden Then 
isvisble = True 
Set PrevVisibleCell = Range.Offset(-i, 0) 
End If 
i = i + 1 
Loop 
End Function 

и я могу назвать ни одного из них, как следующий

NextVisibleCell(ActiveCell).Select 

PrevVisibleCell(ActiveCell).Select 
+0

Почему 'Application.Volatile', если не используется как UDF? –

+0

Честно говоря, первый из них цитируется только вторым - это моя мысль –

0

В другое решение, которое может сделать немного больше, попробуйте это:

Option Explicit 

Public Function nVC(rng As Range, goDir As XlDirection) As Range 
    Set rng = rng.Resize(1, 1) 

    If (goDir = xlDown Or goDir = xlUp) Then 
    If rng.Width = 0 Then Exit Function 
    If goDir = xlDown Then Set rng = rng.Offset(1, 0) Else Set rng = rng.Offset(-1, 0) 

    While rng.Row > 1 And rng.Row < Rows.Count And rng.Height = 0 
     If goDir = xlDown Then Set rng = rng.Offset(1, 0) Else Set rng = rng.Offset(-1, 0) 
    Wend 

    If rng.Height > 0 Then Set nVC = rng 

    ElseIf (goDir = xlToRight Or goDir = xlToLeft) Then 

    If rng.Height = 0 Then Exit Function 
    If goDir = xlToRight Then Set rng = rng.Offset(0, 1) Else Set rng = rng.Offset(0, -1) 

    While rng.Column > 1 And rng.Column < Rows.Count And rng.Width = 0 
     If goDir = xlToRight Then Set rng = rng.Offset(0, 1) Else Set rng = rng.Offset(0, -1) 
    Wend 

    If rng.Width > 0 Then Set nVC = rng 

    End If 
End Function