Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal hwnd As LongPtr, ByVal nIDEvent As Long) As Long
#Else
Private Enum LongPtr: [_]:End Enum
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
Dim rgCheck As Range, lStartRow&, tRows&
Function HideRow(RangeCheck As Range, startRow&, Optional totalRows& = 100)
Set rgCheck = RangeCheck(1, 1): lStartRow = startRow: tRows = totalRows
HideRow = vbNullString
SetTimer Application.hwnd, 0, 10, AddressOf ProcTimer_HideRow
End Function
Private Sub ProcTimer_HideRow(ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal idEvent As Long, ByVal dwTime As LongPtr)
On Error Resume Next
KillTimer hwnd, idEvent
If rgCheck Is Nothing Then Exit Sub
Dim v, sh: v = rgCheck.Value
Set sh = rgCheck.Parent:
If tRows = 0 Then tRows = sh.UsedRange.Rows.Count - lStartRow + 1
If tRows < 0 Then tRows = sh.Rows.Count - lStartRow + 1
sh.Range(lStartRow & ":" & CStr(lStartRow + tRows - 1)).EntireRow.Hidden = False
If v = Empty Or Not IsNumeric(v) Then
Else
If v < tRows Then sh.Range(CStr(lStartRow + v) & ":" & CStr(lStartRow + tRows - 1)).EntireRow.Hidden = True
End If
Set rgCheck = Nothing
End Sub