【ExcelVBA】指定した範囲だけスクロールさせる【イベントの基本】

みなさん、こんにちはケンケンです。

 

今回は、VBAで少し特殊な処理ができるイベントについて解説していきます。

新しい概念ですが、習得するとできることの幅が広がるのでがんばっていきましょう。

 

 

イベントって何だろう?

イベントというとどんなイメージがありますか。

 

 

旅行、正月、クリスマス、花見、ハロウィンなどなど、

いろいろあると思います。

 

実は、エクセルVBAでもイベントと呼ばれる機能があります。

エクセルのイベントは何かきっかけとなる動作(イベント)があったときに自動的に発動するプログラムのことです。

 

例えば、

  • ワークシートをアクティブ状態にした時に発生するActivateイベント
  • セルの内容が変更された際に発生するChangeイベント
  • ファイルを保存する前に発生するBeforeSaveイベント

などがあります。

 

イベント処理ができるようになると、入力してはいけないセルをクリックした場合に警告を出す、なども可能になるので業務改善や管理という面でも役に立ち便利です。

 

今回は、基本となる概念をご紹介します。

 

モジュールには種類がある

 

今までは、標準モジュールのみを使用してきましたが、モジュールには複数の種類があります。

イベントを実行するには

  • シートモジュール
  • ブックモジュール

を使います。

 

VBEを起動してください。

Microsoft Excel Objectsの直下にある

  • 「Sheet1(Sheet1)」がシートモジュール
  • 「ThisWorkbook」がブックモジュール

です。

 

シートモジュールにはワークシートに対するプロシージャを記述し、ブックモジュールにはファイルに対するプロシージャを記述します。

 

まずは、シートモジュールを選択し、Activateイベントのプロシージャを作成してみましょう

以下ご覧ください。

 

 

なお、デフォルトで「Worksheet_SelectionChange」イベント用のプロシージャが作成されてしまうので、削除してしまいましょう。

消してしまって問題ありません。

 

なお、イベントプロシージャを作成する際は、左右のトップダウンリストより選択しましょう。

直接記述するとエラーがでることがあるそうです。僕は、エラーになったことはないですが、念のため推奨された方法で進めることをおススメしておきます。

 

なお、ブックモジュールからプロシージャを作成する方法も、シートモジュールと同様です。

 

■Activateイベントを実行してみよう

それでは、実際にイベントを使ってみましょう。

Activateイベントを使って、Sheet1がアクティブになる度にセルA1の値を+1する、という処理をしてみましょう。

 

 

上記のようにシートモジュール「Sheet1」を選択し、Activateイベントプロシージャを作成します。

そこに、Range(“A1”).Value = Range(“A1”).Value + 1と記述してください。

すると、他のシートと行き来する度にセルA1の値が1ずつ増えていきますね。

 

これが、イベントになります。

ボタンを作って押したり、VBEから直接実行しなくても、発動条件を満たすと実行されます。

 

ちなみに、コードを見ていただくと、Rangeオブジェクトの前にシートを指定する記述がありませんが、この場合は、Sheet1シートで起こることが確定しているため指定する必要はありません。

 

■Openイベントを実行してみよう

今度は、ブックモジュールを使ったイベントを見ていきます。

ブックを開くと実行されるOpenイベントを使ってみましょう。

ブックを開いたときに現在時刻が表示されるようにします。

 

 

ブックモジュール「ThisWorkbook」を選択して、ドロップダウンリストからOpenイベントを選択してください。

 

プロシージャを作れたら、その中に「MsgBox “今の時刻は” & Now」と記述してください。

そこまでできたら、一度ファイルを閉じてからまた開いてください。

 

どうですか。ブックを開いたときの時刻が表示されたら成功です。

 

これを応用して、ファイルを開いた日時をシートに記述して記録することなんかも可能ですね。

余裕があったらチャレンジしてみてください。

 

 

指定した部分だけスクロール可能にしよう

もう少し、イベントについてご紹介します。

 

エクセル2016では最大100万行以上あります。

ほとんどの場合は、そのすべての行を使うことはないですね。

そして、シート上を移動しているうちに迷子になってしまい目的のデータにたどり着けなくなってしまうことはありませんか?

 

そんな時に、少し工夫をしてスクロールできる範囲を限定し、データを見やすくする方法をご紹介します。

今回はActivateイベントを使います。

まずは、セル範囲を直接指定する方法で試してみましょう。

 

シートモジュールからActivateイベントを選択しプロシージャを作成して、以下のコードを書きましょう。

 

Me.ScrollArea = “A1:J100”

Meは自分自身、つまりSheet1を意味します

 

ScrollAreaはWorksheetオブジェクトのプロパティで、スクロール可能なセル範囲を設定します。

 

そして、 “A1:J100”ではセルA1からJ100まで指定しています。

 

ここまで出来たらSheet1に移動してスクロールしてみましょう。

スクロール範囲が上記のように限定されていれば成功です。

 

次に、データが入っている範囲を自動で調べて、その範囲までスクロール可能にする方法をご紹介します。以下のコードを書いてみましょう。

 

UsedRange.Addressでデータが入っている範囲のセル番地を調べて結果を返すことができます。

 

上記のようにA1からS40までデータが入っているシートを用意します。

一度別シートに移動して再度Sheet1に戻るとA1からS40までしかスクロールできなくなっています。

 

セル範囲をいろいろ変えて実行してみてください。

 

この方法を使えば、シート上であちこち移動しなくて済むようになり、利便性とストレス軽減につながります。

 

まとめ

イベント処理の基本を紹介しました。

ここまで勉強してきたみなさんでしたらハードルは高くないと思います。

 

イベントはご紹介したもの以外にもたくさんありますので、いろいろ試してみてください。

応用編も近々ご紹介できるよう企画していますので、お楽しみに。

 

それでは、ご覧いただきありがとうございました。

 

ここまでご覧いただいた方におススメの記事はこちら

【エクセルVBA入門編①】VBAで何ができるのだろうか?

【エクセルVBA入門編②】めんどうな仕事はForNext構文で解決

【エクセルVBA入門編③】繰り返し作業はFor Next構文で完全自動化!

【エクセルVBA入門編④】自動記録を使ってみよう

【エクセルVBA入門編⑤】If Then構文で条件分岐をマスター

【エクセルVBA入門編⑥】手順に沿って請求書を作成してみよう【請求書作成自動化】

【エクセルVBA番外編】実務で使えるテクニック紹介します