Можно ли сделать так, чтобы выбранная ячейка находилась дальше от низа экрана Excel, т.е. чтобы она автоматически прокручивалась до того, как вы достигнете низа?

Можно ли сделать так, чтобы выбранная ячейка находилась дальше от низа экрана Excel, т.е. чтобы она автоматически прокручивалась до того, как вы достигнете низа?

Трудно объяснить это. Представьте, что вы в Excel и нажимаете клавишу вниз, чтобы перемещаться по строкам. Как только вы доберетесь до низа экрана, повторное нажатие клавиши вниз заставит электронную таблицу прокручиваться вниз по строке за раз, так что выбранная вами ячейка никогда не выйдет за пределы видимого диапазона.

Странно, но я хотел бы, чтобы это поведение происходило, когда я (скажем) нахожусь в 20 строках снизу. Так что всегда будет 20 видимых строк под моей выбранной ячейкой.

Я не первый, кто хочет такого поведения. Кто-нибудь знает, возможно ли это, и если да, то как? Что-либо(в значительной степени) возможно в VBA, но я бы предпочел решение без скриптов, если это возможно - спасибо!

решение1

Это вполне понятно тому, кто имел дело с z/OS...

Помимо VBA, я знаю Scroll Lock, который не позволяет изменять выделение во время перемещения, и Page Up/Down, которые сохраняют то же визуальное положение курсора, но при этом перемещают столько строк, сколько показано на экране; ни один из них не подходит.

Я разработал особый случай этого — он сохраняет выбор постоянно центрированным, по крайней мере, когда размеры ячеек фиксированы (иначе вычисления будут грязными, как уже было сказано, и, вероятно, медленнее). Отображаемый диапазон, т. е. размер экрана + масштаб, может быть определен динамически с небольшими дополнительными затратами. Также не обрабатывал выбор диапазона — будет центрироваться в соответствии с верхней левой ячейкой, а не центрироваться или игнорироваться, и не будет динамически добавлять события в новые листы.

'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

Добавление ограничения по краю в 20% - 80% должно быть относительно простым (нужно ввести концепцию «импульса», а затем проверить, является ли выбранная строка - видимая верхняя строка > 0,8 * строк экрана и т. д.); однако надежное решение выходит за рамки моей компетенции.

решение2

Щелкните правой кнопкой мыши по имени листа и выберите просмотр кода, вставьте этот код. Должно быть хорошо.

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

Связанный контент