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