How to determine if a worksheet Cell is Visible/Displayed in VBA?

Here's a function that does what you want:

Function CellIsInVisibleRange(cell As Range)
CellIsInVisibleRange = Not Intersect(ActiveWindow.VisibleRange, cell) Is Nothing
End Function

At least I think it does. I hadn't been aware of the VisibleRange property until now.

Call it like:

If CellIsInVisibleRange(ActiveSheet.Range("A35")) Then
    MsgBox "Cell is visible"
Else
    MsgBox "Cell isn't visible"
End If

The function from @DougGlancy will work in most instances but it fails if the Range has a row height or column width set to zero. This function adds logic to deal with that plus some error handling.

Function Range_IsVisibleInWindow(ByVal target As Excel.Range) As Boolean
' Returns TRUE if any cell in TARGET (Range) is visible in the Excel window.
'
'   Visible means (1) not hidden, (2) does not have row height or column width of
'   zero, (3) the view is scrolled so that the Range can be seen by the user at
'   that moment.
'
'   A partially visible cell will also return TRUE.

    If target Is Nothing Then
        ' Parameter is invalid.  Raise error.
        Err.Raise 3672, _
                  "Range_IsVisibleInWindow()", _
                  "Invalid parameter in procedure 'Range_IsVisible'."

    Else
        ' Parameter is valid.  Check if the Range is visible.
        Dim visibleWinLarge As Excel.Range
        Dim visibleWinActual As Excel.Range

        On Error Resume Next
        Set visibleWinLarge = Excel.ActiveWindow.VisibleRange ' active window range -INCLUDING- areas with zero column width/height
        Set visibleWinActual = visibleWinLarge.SpecialCells(xlCellTypeVisible) ' active window range -EXCLUDING- areas with zero column width/height
        Range_IsVisibleInWindow = Not Intersect(target, visibleWinActual) Is Nothing ' returns TRUE if at least one cell in TARGET is currently visible on screen
        On Error GoTo 0

    End If
End Function

Tags:

Excel

Vba