特定のセルを画面左上に表示(ジャンプ)させたいときに使用するVBAコードについてご紹介します。
Range(“A1”).Select や Range(“A1”).activate で指定したセルを選択やアクティブにしてもウィンドウの表示位置は変わってくれません。
複数人で使用するExcelブックなどで、前に編集保存した人がアクティブにしたセルが左上に表示されてしまって、毎回シートの左上まで戻す作業が発生したりしますが、そんな時に仕込んでおくと便利なコードです。
ScrollRow・ScrollColumnプロパティを使用して特定の行・列や最終行や最終列まで画面の表示位置をジャンプさせたい場合に使用できるコードも紹介していますので、知りたいところの見出しをクリックしてご覧ください。
マクロ実行前と実行後のイメージ
例えば、↓のようにExcelのシートでY列の94行目が左上に表示されている状態だったとします。
マクロを実行すると↓のようにA1セルを左上に表示させます。
VBAコードの書き方
VBAコードは2通りの方法をご紹介します。
1つめは指定したセルをセレクト(選択)して、ScrollRowプロパティ、ScrollColumnプロパティを使用して指定する方法。
Sub Sample_1()
'A1セルを選択する
Range("A1").Select
'選択した(アクティブな)セルに行と列を合わせる
With ActiveWindow
.ScrollRow = ActiveCell.Row
.ScrollColumn = ActiveCell.Column
End With
End Sub
2つめはGotoメソッドを使用して、指定したセル位置を指定する方法です。
Gotoメソッドでセルを指定するとそのセルをアクティブにしますが、画面位置は元のセル位置のままです。うしろに「, Scroll:=True」を足すことで指定したセルまで画面をスクロールすることができます。
Sub Sample_2()
'A1セルまでスクロールする
Application.Goto Reference:=Range("A1"), Scroll:=True
End Sub
「A1」の部分を任意のセル位置に変更すれば好きな位置を指定できます。
使い方の例:シートをアクティブにしたときに常にA1セルを左上に表示させる
使い方の例としては、人がシートをアクティブにしたときに毎回自動でA1セルを左上に表示させるように、シートのモジュールに書いておく方法が便利だと思います。
シートのモジュールを開いて、WorksheetをActivateにしたときに動くように書きます。
Private Sub Worksheet_Activate()
Application.Goto Reference:=Range("A1"), Scroll:=True
End Sub
こうしておくとこのシートを表示したときに毎回A1セルが左上に表示されるようになります。
簡単なようで意外と知られていないコードなのかなと思います。
複数人で編集するファイルなどには便利ですね。
指定位置まで行をスクロールする方法(最終行)
ScrollRowプロパティの仕組みをもう少し丁寧に説明してみます。
例えばA1セルが選択されている状態でScrollRowプロパティを使用して行のスクロールをしてみます。
▽実行前の状態
A1セルが選択されています。
ScrollRowメソッドを使用して「50」を指定して実行します。
Sub Sample_3()
'指定位置まで行をスクロールする
ActiveWindow.ScrollRow = 50
End Sub
▽実行後の状態
50行目までスクロールされました。
このコードは指定した行数分下にスクロールされるという訳ではなく、指定した行位置までスクロールするものなので、最初に50行目が表示されていた場合はそこから動かない、という結果になります。
次は「100」を指定して実行してみます。
Sub Sample_3()
'指定位置まで行をスクロールする
ActiveWindow.ScrollRow = 100
End Sub
表の最終行の100行目までスクロールされ、先頭に表示されました。
最終行を自動的に取得して表示させるにはどうしたらよいでしょうか。
その場合はセルの最終行をカウントしてScrollRowプロパティを使用してスクロールさせます。
「Cells(Rows.Count, 1).End(xlUp).Row」の部分で最終行を取得しています。
シートの1番下から、上にシフトし「xlUp」値がある列を最終行と判定します。
Sub Sample_5()
'最終行まで行をスクロールする
ActiveWindow.ScrollRow = Cells(Rows.Count, 1).End(xlUp).Row
End Sub
指定位置まで列をスクロールする方法(最終列)
ScrollRowプロパティと同様にScrollColumnプロパティを使用して列位置を移動させてみます。
▽実行前の状態
A1セルが選択されています。
ScrollColumnプロパティを使用して「10」を指定して実行します。
Sub Sample_4()
'指定位置まで列をスクロールする
ActiveWindow.ScrollColumn = 10
End Sub
▽実行後の状態
10列目(J列)まで画面がスクロールされました。
行の場合と同様に最終列を表示させたい場合は以下のように指定します。
VBAでシートの最終列を調べてScrollColumnプロパティでスクロールさせています。
「Cells(1, Columns.Count).End(xlToLeft).Column」の部分で最終列を取得しています。
シートの1番右端から、左にシフトし「xlToLeft」値がある列を最終列と判定します。
Sub Sample_6()
'最終列まで列をスクロールする
ActiveWindow.ScrollColumn = Cells(1, Columns.Count).End(xlToLeft).Column
End Sub
▽実行後の状態
最終列の26列目まで画面がスクロールされました。
いかがでしたでしょうか。このように最終行や最終列まで画面をジャンプ(スクロール)させたいという使い方は実務の場面でも出てくると思いますのでぜひ使ってみてください。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。
・記事の内容は適宜変更することがありますのでご了承ください。