Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

excel

vba

I need to find if a cell is visible on the screen.

By visible, I don't mean hidden. I am specifically trying to find if a cell is currently displayed in the active sheet, or if it is not displayed, ie: it has been scrolled off of the visible active sheet.

I have looked online, and can only find the following code which doesn't seem to work for me:

Private Sub CommandButton1_Click()
    With Worksheets(1).Cells(10, 10)
        'MsgBox "Value: " & .Value & ", Top: " & .Top & ", Left: " & .Left
        Dim visibleCells As Range
        Set visibleCells = Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible)
        If Intersect(Worksheets(1).Cells(10, 10), visibleCells) Is Nothing Then
            MsgBox "This cell is not visible."
        End If
    End With
End Sub

Thanks in advance for your help,

Marwan

like image 289
Marwan مروان Avatar asked Aug 13 '12 22:08

Marwan مروان


People also ask

How can you identify the active cell in Excel VBA?

We can access an active cell in VBA by using the application. property method with the keyword active cell. Understanding the concept of range object and cell properties in VBA. In VBA concepts, cells are also the same, no different from normal excel cells.

Can VBA read hidden cells?

VBA Cannot find in if cells are hidden.

How do I make worksheets visible in VBA?

To unhide a sheet, point to Sheet on the Format menu, and then click Unhide. Select the appropriate sheet and then click OK. You cannot hide module sheets because they appear in the Visual Basic Editor.


2 Answers

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
like image 62
Doug Glancy Avatar answered Sep 24 '22 17:09

Doug Glancy


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
like image 45
ChrisB Avatar answered Sep 24 '22 17:09

ChrisB