Hello guys, I made a class called Utility_Move. Please give me some suggestions. If there is a better, cleaner, more performance way than mine, please tell me, thank you.
'Motive: Sometimes it is eaiser to debug when you use ActiveCell as current data record or parameter.
' When the macro stopped by exception or stop sign, you can determine the running progress by ActiveCell.
' And it is easier to say Up(5) instead of offset the row index, for me at least.
'Summary: The Utility_Move class introduce 3 sets of functions.
'First set, Up-Down-Right-Left simulate the key stroke of arrow keys.
' Additionally, Steps parameter allows you to repeat number of seps to that direction.
' Negative steps also means that you are stepping backward.
' The SkipHidden parameter skips hidden cells. When true, it acts like arrow keys that
' skips hidden rows by filter. When false, it will not skip hidden rows and select hidden cells.
'Second set, UpEnd-DownEnd-RightEnd-LeftEnd simulate arrow keys pressed after the End key.
' It offers same parameters as the first set, and behave the same.
'Third set, UpMost-DownMost-RightMost-LeftMost will locate the
' very last non-empty cell in that direction. Spaces are treated as non-empty cell.
' Features SkipHidden feature, when true, only select the visible last cell.
Public Enum emMove
eUp = -1
eDown = 1
eLeft = -2
eRight = 2
eUpEnd = -4
eDownEnd = 4
eLeftEnd = -8
eRightEnd = 8
eUpMost = -16
eDownMost = 16
eLeftMost = -32
eRightMost = 32
End Enum
' =============================Move Cell============================
Function Move(Direction As emMove, Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
Select Case Direction
Case emMove.eUp
Move = Up(Steps, SkipHidden)
Case emMove.eDown
Move = Down(Steps, SkipHidden)
Case emMove.eRight
Move = Right(Steps, SkipHidden)
Case emMove.eLeft
Move = Left(Steps, SkipHidden)
Case emMove.eUpEnd
Move = UpEnd(Steps, SkipHidden)
Case emMove.eDownEnd
Move = DownEnd(Steps, SkipHidden)
Case emMove.eRightEnd
Move = RightEnd(Steps, SkipHidden)
Case emMove.eLeftEnd
Move = LeftEnd(Steps, SkipHidden)
Case emMove.eUpMost
Move = UpMost(SkipHidden)
Case emMove.eDownMost
Move = DownMost(SkipHidden)
Case emMove.eRightMost
Move = RightMost(SkipHidden)
Case emMove.eLeftMost
Move = LeftMost(SkipHidden)
End Select
End Function
'=============================================================================
' Move To Direction
Private Function OneStep(Direction As emMove, Optional SkipHidden As Boolean = False) As Boolean
OneStep = False
On Error GoTo Error
Do
Select Case Direction
Case emMove.eUp
ActiveCell.Offset(-1, 0).Range("A1").Select
Case emMove.eDown
ActiveCell.Offset(1, 0).Range("A1").Select
Case Else
Exit Do
End Select
Loop Until SkipHidden = False Or ActiveCell.EntireRow.Hidden = False
Do
Select Case Direction
Case emMove.eRight
ActiveCell.Offset(0, 1).Range("A1").Select
Case emMove.eLeft
ActiveCell.Offset(0, -1).Range("A1").Select
Case Else
Exit Do
End Select
Loop Until SkipHidden = False Or ActiveCell.EntireColumn.Hidden = False
OneStep = True
Exit Function
Error:
OneStep = False
End Function
Private Function MoreSteps(Direction As emMove, Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
If Steps < 0 Then Direction = Direction * -1: Steps = Steps * -1
For i = 1 To Steps
If OneStep(Direction, SkipHidden) = False Then MoreSteps = False: Exit Function
Next
MoreSteps = True
End Function
Function Up(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
Up = MoreSteps(eUp, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
Function Down(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
Down = MoreSteps(eDown, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
Function Left(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
Left = MoreSteps(eLeft, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
Function Right(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
Right = MoreSteps(eRight, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
'=============================================================================
' Move To Direction End
Private Function OneStepEnd(Direction As emMove, Optional SkipHidden As Boolean = False) As Boolean
OneStepEnd = True
Do
Select Case Direction
Case emMove.eUpEnd
If ActiveCell.Row = 1 Then OneStepEnd = False: Exit Function
Selection.End(xlUp).Select
Case emMove.eDownEnd
If ActiveCell.Row = Rows.Count Then OneStepEnd = False: Exit Function
Selection.End(xlDown).Select
Case Else
Exit Do
End Select
Loop Until SkipHidden = False Or ActiveCell.EntireRow.Hidden = False
Do
Select Case Direction
Case emMove.eLeftEnd
If ActiveCell.Column = 1 Then OneStepEnd = False: Exit Function
Selection.End(xlToLeft).Select
Case emMove.eRightEnd
If ActiveCell.Column = Columns.Count Then OneStepEnd = False: Exit Function
Selection.End(xlToRight).Select
Case Else
Exit Do
End Select
Loop Until SkipHidden = False Or ActiveCell.EntireColumn.Hidden = False
End Function
Private Function MoreStepsEnd(Direction As emMove, Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
If Steps < 0 Then Direction = Direction * -1: Steps = Steps * -1
For i = 1 To Steps
If OneStep(Direction, SkipHidden) = False Then MoreStepsEnd = False: Exit Function
Next
MoreStepsEnd = True
End Function
Function UpEnd(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
UpEnd = MoreStepsEnd(eUpEnd, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
Function DownEnd(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
DownEnd = MoreStepsEnd(eDownEnd, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
Function LeftEnd(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
LeftEnd = MoreStepsEnd(eLeftEnd, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
Function RightEnd(Optional Steps As Long = 1, Optional SkipHidden As Boolean = False) As Boolean
RightEnd = MoreStepsEnd(eRightEnd, Steps:=Steps, SkipHidden:=SkipHidden)
End Function
'=============================================================================
' Move To Direction Most
Private Function OneStepMost(Direction As emMove, Optional SkipHidden As Boolean = False) As Boolean
OneStepMost = False
Select Case Direction
Case emMove.eUpMost
Cells(1, ActiveCell.Column).Select
Case emMove.eDownMost
Cells(Rows.Count, ActiveCell.Column).Select
Case emMove.eLeftMost
Cells(ActiveCell.Row, 1).Select
Case emMove.eRightMost
Cells(ActiveCell.Row, Columns.Count).Select
Case Else
Exit Function
End Select
If ActiveCell.FormulaR1C1 = "" Then OneStepEnd Direction, SkipHidden:=SkipHidden
If ActiveCell.FormulaR1C1 = "" Then
If Direction = eUpMost Then Cells(1, ActiveCell.Column).Select
If Direction = eLeftMost Then Cells(ActiveCell.Row, 1).Select
OneStepMost = False
Else
OneStepMost = True
End If
End Function
Function UpMost(Optional SkipHidden As Boolean = False) As Boolean
UpMost = OneStepMost(eUpMost, SkipHidden:=SkipHidden)
End Function
Function DownMost(Optional SkipHidden As Boolean = False) As Boolean
DownMost = OneStepMost(eDownMost, SkipHidden:=SkipHidden)
End Function
Function LeftMost(Optional SkipHidden As Boolean = False) As Boolean
LeftMost = OneStepMost(eLeftMost, SkipHidden:=SkipHidden)
End Function
Function RightMost(Optional SkipHidden As Boolean = False) As Boolean
RightMost = OneStepMost(eRightMost, SkipHidden:=SkipHidden)
End Function