Das ist schwer zu erklären. Stellen Sie sich vor, Sie sind in Excel und drücken die Abwärtstaste, um sich in den Zeilen nach unten zu bewegen. Wenn Sie am unteren Bildschirmrand angekommen sind, bewirkt ein erneutes Drücken der Abwärtstaste, dass die Tabelle zeilenweise nach unten gescrollt wird, sodass die ausgewählte Zelle nie außerhalb des sichtbaren Bereichs liegt.
Seltsamerweise möchte ich, dass dieses Verhalten auftritt, wenn ich (sagen wir) 20 Zeilen vom unteren Rand entfernt bin. Es sind also immer 20 sichtbare Zeilen unter meiner ausgewählten Zelle.
Ich bin nicht der Erste, der dieses Verhalten möchte. Weiß jemand, ob es möglich ist und wenn ja, wie? Irgendetwas(ziemlich viel) ist in VBA möglich, aber ich würde, wenn möglich, eine Lösung ohne Skript bevorzugen – danke!
Antwort1
Für jemanden, der sich bereits mit z/OS beschäftigt hat, ist das durchaus verständlich ...
Außerhalb von VBA kenne ich die Rollen-Taste, die verhindert, dass sich die Auswahl während der Bewegung ändert, und die Bild-auf/Bild-ab-Funktion, bei der die visuelle Cursorposition gleich bleibt, aber auch so viele Zeilen verschoben werden, wie auf dem Bildschirm angezeigt werden. Beides erfüllt nicht den Zweck.
Ich habe einen Sonderfall davon entworfen - er hält die Auswahl dauerhaft zentriert, zumindest wenn die Zellengrößen festgelegt sind (sonst ist die Berechnung, wie erwähnt, chaotisch und wahrscheinlich langsamer). Der angezeigte Bereich, also Bildschirmgröße + Zoom, kann mit geringem Mehraufwand dynamisch bestimmt werden. Auch die Bereichsauswahl wurde nicht behandelt - zentriert wird gemäß der oberen linken Zelle, anstatt zu zentrieren oder zu ignorieren, und fügt die Ereignisse auch nicht dynamisch zu neuen Blättern hinzu.
'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
Das Hinzufügen einer Randbegrenzung von 20 % – 80 % sollte relativ unkompliziert sein (es muss ein „Momentum“-Konzept eingeführt werden, dann muss geprüft werden, ob ausgewählte Zeile – sichtbare oberste Zeile > 0,8 * Bildschirmzeilen usw.); eine robuste Lösung liegt jedoch außerhalb meines Rahmens.
Antwort2
Klicken Sie mit der rechten Maustaste auf den Blattnamen und wählen Sie „Code anzeigen“. Fügen Sie diesen Code ein. Das sollte kein Problem sein.
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