2012-08-13 21 views
9

Necesito encontrar si una celda está visible en la pantalla.¿Cómo determinar si una celda de la hoja de trabajo es visible/mostrada en VBA?

Por visible, no me refiero a oculto. Estoy tratando específicamente de encontrar si una celda se muestra actualmente en la hoja activa, o si no se muestra, es decir: se ha desplazado de la hoja activa visible.

He mirado en línea, y sólo puedo encontrar el código siguiente que no parece funcionar para mí:

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 

Gracias de antemano por su ayuda,

Marwan

+0

Sólo por curiosidad ... ¿Qué pasa si dicen la celda A4 se oculta y se puede ver hasta el decir filas 41. ¿consideraría la celda A4 visibles u ocultos? Además, ¿qué dirías para las células que son parcialmente visibles? –

+0

@SiddharthRout - Considero que la celda A4 es visible. Algunos antecedentes sobre lo que estoy tratando de lograr, necesito encontrar el IZQUIERDO y el TOP de una celda en particular. Así que necesito iterar a través de las celdas hacia la izquierda y a través de las celdas que están encima. Necesito comprobar si esas celdas son visibles, y si lo son, necesito sumar su ancho (o altura). El problema con el que me estoy encontrando ahora es que algunas de las celdas están congeladas y no aparecen como parte del rango visible. No estoy seguro de cómo lidiar con eso. ¿Alguna ayuda o sugerencia? –

+1

@SiddharthRout - Descubrí cómo verificar si la celda está "congelada" o no, usando el siguiente código: 'Función CellIsInFrozenRange (celda Como rango)' 'Dim inRow As Boolean' ' Dim inColumn As Boolean' 'If (ActiveWindow.SplitRow> 0) Then' ' inRow = No Intersecar (celda, Rango (Celdas (1, 1), ' ' Celdas (ActiveWindow.SplitRow, 1) .End (xlEnd))) No es nada ' ' End If' 'If (ActiveWindow.SplitColumn> 0) Then' ' inColumn = No Intersecta (celda, Rango (Celdas (1, 1), Celdas (1, ActiveWindow.SplitColumn) .End (xlDown))) Es Nothing' 'End If' ' CellIsInFrozenRange = (inRow or inColumn) ' ' End Function' –

Respuesta

14

Aquí está una función que hace lo que quiere:

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

Al menos creo que sí. Hasta ahora no había tenido conocimiento de la propiedad VisibleRange.

llamar así:

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

+ 1 Uso esta y otra variación para verificar la visibilidad de la celda. –

+0

@DougGlancy - Muchas gracias. Eso funciona genial –

+1

@SiddharthRout - ¿Cuál es la otra variación que usa? –

Cuestiones relacionadas