¿Es posible mantener la celda seleccionada más lejos de la parte inferior de la pantalla de Excel, es decir, desplazarse automáticamente antes de llegar al final?

¿Es posible mantener la celda seleccionada más lejos de la parte inferior de la pantalla de Excel, es decir, desplazarse automáticamente antes de llegar al final?

Es difícil explicar esto. Imagina que estás en Excel, presionando la tecla hacia abajo para moverte hacia abajo por las filas. Una vez que llegue al final de la pantalla, presionar la tecla hacia abajo nuevamente hará que la hoja de cálculo se desplace hacia abajo una fila a la vez, de modo que la celda seleccionada nunca esté fuera del rango visible.

Curiosamente, lo que me gustaría es que este comportamiento ocurra cuando esté (digamos) a 20 filas del final. Entonces siempre hay 20 filas visibles debajo de mi celda seleccionada.

No seré el primero en querer este comportamiento. ¿Alguien sabe si es posible y, de ser así, cómo? Cualquier cosa(prácticamente) es posible en VBA, pero preferiría una solución sin script, si es posible, ¡gracias!

Respuesta1

Es bastante comprensible para alguien que haya incursionado en z/OS...

Fuera de vba, conozco el bloqueo de desplazamiento que evita que la selección cambie mientras se mueve, y el avance o avance de página que mantiene la misma posición visual del cursor, pero también mueve tantas líneas como se muestran en la pantalla; Ninguno de los cuales encajaba a la perfección.

He diseñado un caso especial de esto: mantiene la selección centrada permanentemente, al menos cuando los tamaños de celda son fijos (de lo contrario, el cálculo es complicado, como se señaló, y probablemente más lento). El rango mostrado, es decir, tamaño de pantalla + zoom, se puede determinar dinámicamente con un coste adicional mínimo. Tampoco he manejado la selección de rango: se centrará de acuerdo con la celda superior izquierda en lugar de centrar o ignorar, ni agregará los eventos dinámicamente a hojas nuevas.

'Const SCRROWS = 24 ' Example screen size.
'Const SCRCOLS = 21
Global Pscrr As Long
Global Pscrc As Long

Function GetScreen() As Long()
Dim vret(2) As Long
If ActiveWindow.VisibleRange.Rows.Row + _
    ActiveWindow.VisibleRange.Rows.Count >= Rows.Count _
or ActiveWindow.VisibleRange.Columns.Column + _
    ActiveWindow.VisibleRange.Columns.Count >= Columns.Count Then
    vret(0) = Pscrr
    vret(1) = Pscrc
Else
    vret(0) = ActiveWindow.VisibleRange.Rows.Count
    vret(1) = ActiveWindow.VisibleRange.Columns.Count
    Pscrr = vret(0)
    Pscrc = vret(1)
End If
GetScreen = vret
End Function

Sub CenterScroll(slrow As Long, slcol As Long)
Dim nscrr As Long
Dim nscrc As Long
Dim scrsize() As Long
scrsize = GetScreen
nscrr = slrow - Int(scrsize(0) / 2)
If nscrr < 1 Then
    nscrr = 1
End If
nscrc = slcol - Int(scrsize(1) / 2)
If nscrc < 1 Then
    nscrc = 1
End If
ActiveWindow.ScrollRow = nscrr
ActiveWindow.ScrollColumn = nscrc
End Sub

Sub Button2_Click()
CenterScroll ActiveCell.Row, ActiveCell.Column
End Sub

'------Put this on the sheet which uses the scroll method------'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
CenterScroll Target.Row, Target.Column
End Sub

Agregar una limitación de borde del 20% al 80% debería ser relativamente sencillo (es necesario introducir un concepto de "impulso", luego verificar si la fila seleccionada - fila superior visible > 0,8 * filas de la pantalla, etc.); sin embargo, una solución sólida está más allá de mi alcance.

Respuesta2

Haga clic derecho en el nombre de la hoja y seleccione ver código, pegue este código. Debería estar bien para ir

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.CountLarge > 1 Then Exit Sub
    Dim w As Window:    Set w = ActiveWindow
    Dim r As Range:     Set r = w.VisibleRange
    If Target.Row = r(1, 1).Row Then w.SmallScroll up:=1
    If Target.Row = r(1, 1).Offset(r.Rows.Count).Row - 20 Then w.SmallScroll down:=1
End Sub

información relacionada