アクティブセルを移動するのは、Range(アドレス).SelectとかRange(アドレス).Activateのように簡単ですね。移動先のセルが現在のウィンドウ上に表示されていれば、ただアクティブセルが移動するだけですし、移動先がウィンドウに表示されていない場合はワークシートが自動的にスクロールします。こうしたワークシートのスクロールを制御するコマンドもVBAに用意されています。
ワークシートをスクロールさせるときは、一般にスクロールバーを使います。スクロールバーは操作する場所によって、スクロールする量が異なります。スクロールバーは次のようなパーツで構成されています。
昔は、スクロールバーの両端にあるボタンに正式名称はなかったのですが、最近のExcelヘルプなどでは「上向き矢印」「左向き矢印」などと呼んでいるようです。
ワークシートを
行単位または列単位 でスクロールするには、Windowオブジェクトの
SmallScroll メソッドを使います。また、
画面単位 でスクロールするには、Windowオブジェクトの
LargeScroll メソッドを実行します。どちらのメソッドも、方向を示す4種類の引数「Up」「Down」「ToRight」「ToLeft」を指定できます。次のコードは、ワークシートを「1画面下」「2画面右」にスクロールし、続いて「1行上」「2列左」にスクロールします。
Sub Sample1()
ActiveWindow.LargeScroll Down:=1, ToRight:=2
ActiveWindow.SmallScroll Up:=-1, ToLeft:=-2
End Sub
このときアクティブセルは移動しません。
上記のSmallScrolメソッドとLageScrollメソッドは、現在の位置から相対的にスクロールするコマンドです。それに対して「○行目/○列目までスクロールしたい」と
任意の行や列 を指定するには、Windowオブジェクトの
ScrollRow プロパティや
ScrollColumn プロパティに数値を指定します。たとえば、ScrollRowプロパティに「3」を設定すると表示されているワークシートの最上行が3行目になり、ScrollColumnプロパティに「5」を設定すると表示されているワークシートの左端列が5列目(E列)になります。まぁ、実際にやってみればわかるでしょう。このとき一緒に覚えたいのはWindowオブジェクトの
VisibleRange プロパティです。VisibleRangeプロパティは、現在表示されている(見えている)セル範囲を返します。次のコードは、セルG9が左上にくるようにワークシートをスクロールし、現在画面に表示されているセル範囲のアドレスを表示します。
Sub Sample2()
With ActiveWindow
.ScrollRow = 9
.ScrollColumn = 7
MsgBox .VisibleRange.Address
End With
End Sub
私がこうしたワークシートのスクロールを使うのは(ゲームを除いて)、一画面に収まらないようなデータを処理するようなケースです。これもまぁ、実際に動作を見てもらえばわかるでしょう。次のコードは、セル範囲A1:A100に文字列を入力しますが、入力されるセルが常に表示されるようワークシートをスクロールします。
Sub Sample3()
Dim i As Long, LastRow As Long
With ActiveWindow
LastRow = .VisibleRange.Rows.Count / 2
For i = 1 To 100
Cells(i, 1) = Cells(i, 1).Address(0, 0) & "を処理しました"
If i > LastRow Then .ScrollRow = .ScrollRow + 1
Next i
End With
End Sub