VBAでセル移動しても表示位置を常に左上端に設定する

ウィンドウの操作 画面の操作
ウィンドウの操作
スポンサーリンク

ユーザーフォームに配置したコマンドボタンを押したら、指定したセルに瞬間移動(ジャンプ)させる事ありませんか?

イメージではセルA1の位置(画面左上端)にジャンプしたセルがこの位置にくれば、移動先の表やリストが見やすくなるはずなのに、中途半端な位置で表示されてしまった経験ありませんか?

Excel-VBAを使う方はひとつのシートをちょっとだけ使うのではなく、かなり広範囲を使う方が多いはずなので、ジャンプ先のセルが常に画面左上端に正確に移動させましょう。

スポンサーリンク

ScrollRowとScrollColumnを使う

Excel-VBAを使う前までは、セルの移動といえばスクロールバーをマウスで操作するので、おおよそ表示画面の範囲内のセルを使用するのが一般的ですね。

Excel-VBAでコマンドボタンを使えば、セルの移動も一発でジャンプしてくれるのでひとつのシートを、セル列番号A~ZどころかA~EZまで使うなど広範囲で使うことが容易になりますね。

初心者の頃のジャンプ失敗例

エクセルVBAを覚えたての頃によくやりがちな失敗例として、例えば、セルBH100へジャンプさせるのに書いたVBAコードをこのように書いていませんか?

セル番号だけのジャンプするVBAコード

Private Sub CommandButton1_Click()
Range(“BH100”).Select
End Sub

VBA解説
  1. コマンドボタン1が押されたら
  2. セルBH100を選択する
  3. マクロ記録終了

移動させたい気持ちはよくわかるVBAコードですよね。

これでは、ただ単にBH100へ移動するだけなので、イメージでは画面左上端に移動させたつもりですが、大体の場合は画面中央になることが多いですよね。

セル番号だけのジャンプ
セル番号だけでは画面左上には表示されない

確かにセルBH100を選択されていますが、それ以上のVBAコードがないので画面左上を選択するなんて無理なんです。

行番号と列番号を付け加えると解決するが・・・

選択するセル番号に加えて、シート名やセルの元々の位置や行番号・列番号など、細かな情報をVBAコードで付け加えてみるとこのようになりました。

細かく付け加えたVBAコード

Private Sub CommandButton1_Click()
シート名 = “sheet2”
Worksheets(シート名).Activate
Range(“A1”).Select
行番号 = 100
ActiveWindow.ScrollRow = 行番号
列番号 = 60
ActiveWindow.ScrollColumn = 列番号
Sheets(“sheet2”).Select
Range(“BH100”).Select
End Sub

VBA解説
  1. コマンドボタン1を押されたら
  2. シートはsheet2を選ぶ
  3. セルA1を選ぶ
  4. 100行移動する
  5. 60列移動する
  6. sheet2を選択する
  7. セルBH100を選択する
  8. マクロ終了

ここまで細かくVBAコードを書いたら、問題なく画面左上端にジャンプできるようになりましたが・・・

現在は使えない!

このVBAコードでエクセル2007を使っている時は、なんの問題もなかったのですがエクセル2010以降は使えなくなった。

もちろん動作確認しているエクセル2016でも使えません。

コンバイルエラー
コンバイルエラー

エクセル2010が発売された当時は、当然ながらほとんどのエクセルファイルは2007で作成されているので、エラーのオンパレードでした。

エクセル2010以降のジャンプ方法

そしてすぐには解決方法もわからず、苦労しましたのでいろいろ試してみたのが、通常日本語使うときは「”日本語”」ってコード書いているのに、ここでは””がないからと思って、日本語の部分に””つけてみましたがダメでした。

しばらくすると同じようなエラーで悩む人が多くなり、解決方法が分かってきたのが、下記のように日本語表記をしないコードです。

日本語表示をしないVBAコード

Private Sub CommandButton1_Click()
Sheets(“sheet2”).Select
Range(“A1”).Select
With ActiveWindow
.ScrollRow = 100
.ScrollColumn = 60
End With
Sheets(“sheet2”).Select
Range(“BH100”).Select
End Sub

日本語の代わりにWithステートメントを使う事で代用できることが分かりましたので、この方法で解決しています。