Difícil explicar isso. Imagine que você está no Excel, pressionando a tecla para baixo para descer nas linhas. Quando chegar à parte inferior da tela, pressionar a tecla para baixo novamente fará com que a planilha role para baixo uma linha por vez, para que a célula selecionada nunca fique fora do alcance visível.
Estranhamente, o que eu gostaria é que esse comportamento acontecesse quando eu estivesse (digamos) a 20 linhas da parte inferior. Portanto, sempre há 20 linhas visíveis abaixo da célula selecionada.
Não serei o primeiro a querer esse comportamento - alguém sabe se é possível e, em caso afirmativo, como? Qualquer coisa(praticamente) é possível no VBA, mas eu preferiria uma solução sem script, se possível - obrigado!
Responder1
É bastante compreensível para alguém que se interessou por z/OS...
Fora do vba, conheço o scroll lock, que evita que a seleção mude durante o movimento, e a página para cima/para baixo, que mantém a mesma posição visual do cursor, mas também move quantas linhas são mostradas na tela; nenhum dos quais se encaixa no projeto.
Eu projetei um caso especial disso - ele mantém a seleção permanentemente centralizada, pelo menos quando os tamanhos das células são fixos (caso contrário, o cálculo será confuso, como apontado, e provavelmente mais lento). A faixa exibida, ou seja, tamanho da tela + zoom, pode ser determinada dinamicamente com um pequeno custo extra. Também não manipulou a seleção de intervalo - centralizará de acordo com a célula superior esquerda, em vez de centralizar ou ignorar, nem adicionará os eventos dinamicamente a novas planilhas.
'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
Adicionar limitação de borda de 20% a 80% deve ser relativamente simples (é necessário introduzir um conceito de 'momentum' e, em seguida, verificar se a linha selecionada - linha superior visível> 0,8 * linhas da tela, etc.); no entanto, uma solução robusta está além do meu escopo.
Responder2
Clique com o botão direito no nome da planilha e selecione visualizar código, cole este código. Deveria estar bom 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