2016-05-14 2 views
0

表示可能な行のリストに基づいて、アクティブセルの次または前のセルを取得します。目に見えない行を避けてアクティブセルの次または前を取得する方法

と私はその

最初のアプローチを行うに牽引アプローチをテストした。このような目に見える行の
GET範囲を。

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

最後に、私は第2のアプローチとその意志を使って良い解決策を見つけました。
私のコードがあります。

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

正直なところ、最初のものは2番目のものだけで引用されています –

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 
関連する問題