ワークシートをスクロールする


アクティブセルを移動するのは、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