かばくん
完成したマクロはどうやって動かすのですか?
そのつどVBEを起動して、実行するのですか?
へびせんせい
VBEは開発者用のツールなので、一般ユーザーは使えませんよね。
ユーザーがマクロを実行するには、大きく分けて3つの方法があります。
開発タブのマクロから実行する方法
ユーザーにExcelシート上で実行してもらう方法です。
- 開発タブ → マクロ をクリック
- 動かしたいマクロを選択 → 実行 をクリック
しかし、開発者でないユーザーは、開発タブを表示していないことが多いです。
マクロを実行する方法として直感的には分かりにくいかもしれません。
シート上にボタンを配置して、マクロを実行する方法
この方法は、開発者が事前にボタンを作成しておき、それをユーザーに押してもらうことでマクロの実行を行います。
ボタンの表示テキストも変更できるので、ユーザー側にもわかりやすい設計が可能です。
- 開発タブ → 挿入 → フォームコントロールのボタン をクリック
-
シート上でドラッグすると、ボタンに登録するマクロを選択できます
マクロを選択 → OK をクリック - ボタンを左クリックするとマクロが実行されます
- ボタンを右クリックすると、ボタンのテキストを編集できます
*ボタンを右クリックでドラッグすると、ボタンの位置を変更できます
ただし、開発者が意図しないタイミングで押してエラーが出ることや、ボタンを何度も押す必要があって手間になる可能性もあります。
マクロを設計する時点でどういう方法で実行してもらうかは考えておくことが重要です。
ActiveXコントロールのボタンってなに?
フォームコントロールのボタンを選択するときに、下のActiveXコントロールが気になった方もいるのではないでしょうか。
ActiveXコントロールを使っても、同じようにマクロを実行することが可能です。
少し難しい話になるのですが、ActiveXコントロールは、VBAでオブジェクトとして扱うことが可能なのです。要するに、プログラム上でボタン等のコンポーネントを操作することができるようになります。
やや高度なので今は使う必要はありませんが、ユーザーフォームという自由にデザインできるオリジナルの入力フォームを作るときに使われることが多いです。
ユーザーフォームの例
ある動作(イベント)により、マクロを実行する方法
ユーザーのなんらかの操作をきっかけ(イベント)にして、マクロを動かすことも可能です。
例えば、「セルを変更したときに、マクロを動かす」や「sheet1を選択したときに、マクロを動かす」といった設定のことです。
このイベントはたくさんありますので、今回はよく使う「セルを変更したとき」について取り上げます。
Worksheetのイベントプロシージャーの設定方法
- プロジェクトエクスプローラのシートをダブルクリック
- オブジェクトリストからWorksheetを選択
- プロシージャリストからChangeを選択
- SelectionChangeプロシージャーのコードは消してよい
マクロを設定したいシートを選択すること
デフォルトでSelectionChangeプロシージャーが選択される
ここの一覧がイベントプロシージャーの一覧となる。
「セルを変更したとき」をイベントにするには「Change」を選択する。
WorksheetのChangeプロシージャの使い方
まずは、セルを変更したら、「セルが変更されました!」とメッセージボックスを出してみます。
Worksheet_Changeイベント サンプルコード
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "セルが変更されました!"
End Sub
今までのSubプロシージャと異なり、プロシージャ名を自分で付けることはできません。
これは、Worksheet_Changeというイベント名があらかじめプログラム側で決められているからです。
そのため、Worksheet_Change(ByVal Target As Range)の箇所は変更できません。
プログラムの実行方法もVBEでF5キーを押すのではなく、実際にsheet1を変更する(イベントを起こす)必要があります。
※sheet1にイベントを設定したため、sheet2を変更してもマクロは動作しません。
変更したセルの情報を取得するTargetについて
変更したセルの番地も表示できるようにしてみます。
例えば、「(2, 2)のセルが変更されました!」のように表示したいとします。
この場合はどうすればよいでしょうか?
このWorksheet_ChangeプロシージャはTargetというRangeオブジェクトの引数をもちます。
それが、(ByVal Target As Range)のコマンドで表されています。
Worksheet_Changeプロシージャが動くたび、Targetという引数に変更したセルの情報が値渡しで送られるのです。
Targetという引数はRangeオブジェクトなので、Rangeオブジェクトが扱えるプロパティやメソッドを使うことができます。
RowプロパティとColumnプロパティを使って、Targetのセルの番地を表示してみます。
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "(" & Target.Row & ", " & Target.Column & ")" & "セルが変更されました!"
End Sub
変更したセルの番地を表示することが可能となりました。
このTargetという引数を使ったイベントは他にもありますので、使い方を覚えておきましょう。
Worksheetのイベントプロシージャの一覧
Worksheetのイベントプロシージャの一覧表を下に示します。
プロシージャ名とイベントの発生方法をまとめてます。
もちろん覚える必要はありません。
イベントプロシージャ名 | イベントのトリガー |
---|---|
Activate | ブック、ワークシート、グラフ シート、または埋め込みグラフがアクティブになったとき |
BeforeDoubleClick | 既定のダブルクリックの操作の前に、ワークシートをダブルクリックしたとき |
BeforeRightClick | 既定の右クリックの操作の前に、ワークシートを右クリックしたとき |
Calculate | ワークシートを再計算した後に Worksheet オブジェクトで発生 |
Change | ワークシートのセルがユーザーまたは外部リンクにより変更されたとき |
Deactivate | グラフ、ワークシート、またはブックが非アクティブになったとき |
FollowHyperlink | ワークシートのハイパーリンクをクリックしたとき |
PivotTableAfterValueChange | ピボットテーブル内のセルまたはセル範囲が編集または再計算された後 |
PivotTableBeforeAllocateChanges | ピボットテーブルに変更が適用される前 |
PivotTableBeforeCommitChanges | ピボットテーブルのOLAPデータソースに対する変更が適用される前 |
PivotTableBeforeDiscardChanges | ピボットテーブルに対する変更が破棄される前 |
PivotTableChangeSync | ピボットテーブルが変更された後 |
PivotTableUpdate | ピボットテーブル レポートがワークシート上で更新された後 |
SelectionChange | ワークシートで選択範囲を変更したとき |
BeforeDelete | ワークシートが削除される前 |
LensGalleryRenderComplete | 引き出し線ギャラリーのアイコン (動的および静的) の表示が完了したとき |
TableUpdate | データモデルに接続されたクエリテーブルがワークシートで更新された後 |
プロパティ・メソッドについての練習問題
へびせんせい
Worksheet_Changeプロシージャを使って、セルが変更されたとき、
MsgBoxで「(2, 4)セルの値が~に変更されました!」と表示されるようにしなさい。
上述のサンプルコードを編集して、~にはセルの値が入るように追加しなさい。
*セルの値は、Target.Value に格納されている
へびせんせい
上の演習問題のプログラムでは、セルをDeleteしたときも動作してMsgBoxが出てしまう。
セルをDeleteしたときは、動作しないように書き換えなさい。
【ヒント】 もしも(If)、セルを消したとき(Target.Value="")は、マクロを終了する(Exit Sub)