PR

【Excel VBA】指定したセルに画面表示位置をジャンプする方法(Gotoメソッド、ScrollRow・ScrollColumnプロパティ)

VBA

特定のセルを画面左上に表示(ジャンプ)させたいときに使用するVBAコードについてご紹介します。
Range(“A1”).Select や Range(“A1”).activate で指定したセルを選択やアクティブにしてもウィンドウの表示位置は変わってくれません。

複数人で使用するExcelブックなどで、前に編集保存した人がアクティブにしたセルが左上に表示されてしまって、毎回シートの左上まで戻す作業が発生したりしますが、そんな時に仕込んでおくと便利なコードです。

ScrollRow・ScrollColumnプロパティを使用して特定の行・列や最終行や最終列まで画面の表示位置をジャンプさせたい場合に使用できるコードも紹介していますので、知りたいところの見出しをクリックしてご覧ください。

スポンサーリンク

マクロ実行前と実行後のイメージ

例えば、↓のようにExcelのシートでY列の94行目が左上に表示されている状態だったとします。

ExcelVBA-画面左上が中途半端な位置の状態

マクロを実行すると↓のようにA1セルを左上に表示させます。

ExcelVBA-画面左上が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にしたときに動くように書きます。

ExcelVBA-Sheet1オブジェクトにマクロを記入するイメージ
Private Sub Worksheet_Activate()

  Application.Goto Reference:=Range("A1"), Scroll:=True

End Sub

こうしておくとこのシートを表示したときに毎回A1セルが左上に表示されるようになります。

kufuuさん
kufuuさん

簡単なようで意外と知られていないコードなのかなと思います。
複数人で編集するファイルなどには便利ですね。

スポンサーリンク

指定位置まで行をスクロールする方法(最終行)

ScrollRowプロパティの仕組みをもう少し丁寧に説明してみます。
例えばA1セルが選択されている状態でScrollRowプロパティを使用して行のスクロールをしてみます。

▽実行前の状態
 A1セルが選択されています。

ExcelVBA-画面左上がA1セルになっている状態

ScrollRowメソッドを使用して「50」を指定して実行します。

Sub Sample_3()
    
   '指定位置まで行をスクロールする
   ActiveWindow.ScrollRow = 50
    
End Sub

▽実行後の状態
50行目までスクロールされました。
このコードは指定した行数分下にスクロールされるという訳ではなく、指定した行位置までスクロールするものなので、最初に50行目が表示されていた場合はそこから動かない、という結果になります。

ExcelVBA-A50セルがウィンドウの左上にある状態

次は「100」を指定して実行してみます。

Sub Sample_3()
    
   '指定位置まで行をスクロールする
   ActiveWindow.ScrollRow = 100
    
End Sub

表の最終行の100行目までスクロールされ、先頭に表示されました。

ExcelVBA-A100セルまでスクロールされた状態

最終行を自動的に取得して表示させるにはどうしたらよいでしょうか。

その場合はセルの最終行をカウントして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セルが選択されています。

ExcelVBA-A1セルがウィンドウの左上にある状態

ScrollColumnプロパティを使用して「10」を指定して実行します。

Sub Sample_4()
    
   '指定位置まで列をスクロールする
   ActiveWindow.ScrollColumn = 10
    
End Sub

▽実行後の状態
10列目(J列)まで画面がスクロールされました。

ExcelVBA-10列分右にスクロールされた状態

行の場合と同様に最終列を表示させたい場合は以下のように指定します。
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列目まで画面がスクロールされました。

ExcelVBA-最終列まで画面がスクロールされた状態

いかがでしたでしょうか。このように最終行や最終列まで画面をジャンプ(スクロール)させたいという使い方は実務の場面でも出てくると思いますのでぜひ使ってみてください。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。
・記事の内容は適宜変更することがありますのでご了承ください。

タイトルとURLをコピーしました