![是否可以將選取的儲存格保持在距離 Excel 螢幕底部更遠的位置 - 即在到達底部之前自動捲動](https://rvso.com/image/1595527/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%B0%87%E9%81%B8%E5%8F%96%E7%9A%84%E5%84%B2%E5%AD%98%E6%A0%BC%E4%BF%9D%E6%8C%81%E5%9C%A8%E8%B7%9D%E9%9B%A2%20Excel%20%E8%9E%A2%E5%B9%95%E5%BA%95%E9%83%A8%E6%9B%B4%E9%81%A0%E7%9A%84%E4%BD%8D%E7%BD%AE%20-%20%E5%8D%B3%E5%9C%A8%E5%88%B0%E9%81%94%E5%BA%95%E9%83%A8%E4%B9%8B%E5%89%8D%E8%87%AA%E5%8B%95%E6%8D%B2%E5%8B%95.png)
這個很難解釋。想像一下您在 Excel 中,按向下鍵在行中向下移動。到達螢幕底部後,再次按向下鍵將使電子表格一次向下捲動一行,以便您選擇的儲存格永遠不會超出可見範圍。
奇怪的是,我希望這種行為發生在距離底部(比如說)20 行的地方。因此,我選擇的單元格下方始終有 20 個可見行。
我不會是第一個想要這種行為的人 - 有誰知道這是否可能,如果可能的話如何? 任何事物(幾乎)在 VBA 中是可能的,但如果可能的話,我更喜歡非腳本解決方案 - 謝謝!
答案1
對於涉足 z/OS 的人來說這是很容易理解的...
在vba之外,我知道滾動鎖定可以防止選擇在移動時發生變化,向上/向下翻頁可以保持相同的視覺遊標位置,但也可以移動螢幕上顯示的盡可能多的行;兩者都不符合要求。
我設計了一個特殊情況 - 它使選擇永久居中,至少當單元格大小固定時(否則計算會很混亂,正如所指出的,並且可能會更慢)。顯示範圍,即螢幕尺寸+縮放,可以動態確定,只需很少的額外成本。也沒有處理範圍選擇 - 將根據左上角的儲存格居中,而不是居中或忽略,也沒有將事件動態新增到新工作表中。
'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