![選択したセルを Excel 画面の下部から離れた位置に保つことは可能ですか。つまり、下部に到達する前に自動スクロールするということです。](https://rvso.com/image/1595527/%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%82%BB%E3%83%AB%E3%82%92%20Excel%20%E7%94%BB%E9%9D%A2%E3%81%AE%E4%B8%8B%E9%83%A8%E3%81%8B%E3%82%89%E9%9B%A2%E3%82%8C%E3%81%9F%E4%BD%8D%E7%BD%AE%E3%81%AB%E4%BF%9D%E3%81%A4%E3%81%93%E3%81%A8%E3%81%AF%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%81%8B%E3%80%82%E3%81%A4%E3%81%BE%E3%82%8A%E3%80%81%E4%B8%8B%E9%83%A8%E3%81%AB%E5%88%B0%E9%81%94%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E8%87%AA%E5%8B%95%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82.png)
これを説明するのは難しいです。Excel で、下矢印キーを押して行を下に移動していると想像してください。画面の一番下まで移動したら、もう一度下矢印キーを押すと、スプレッドシートが 1 行ずつ下にスクロールし、選択したセルが表示範囲外にならないようにします。
奇妙なことに、私が望んでいるのは、下から 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