マクロの実行方法

かばくん

完成したマクロはどうやって動かすのですか?
そのつどVBEを起動して、実行するのですか?

へびせんせい

VBEは開発者用のツールなので、一般ユーザーは使えませんよね。
ユーザーがマクロを実行するには、大きく分けて3つの方法があります。

マクロの実行方法の3パターン

開発タブのマクロから実行する方法

ユーザーにExcelシート上で実行してもらう方法です。

  1. 開発タブ → マクロ をクリック
  2. マクロの実行方法1
  3. 動かしたいマクロを選択 → 実行 をクリック
  4. マクロの実行方法1
VBEを起動せずに、マクロを実行するもっとも簡単な方法です。
しかし、開発者でないユーザーは、開発タブを表示していないことが多いです。
マクロを実行する方法として直感的には分かりにくいかもしれません。

シート上にボタンを配置して、マクロを実行する方法

この方法は、開発者が事前にボタンを作成しておき、それをユーザーに押してもらうことでマクロの実行を行います。
ボタンの表示テキストも変更できるので、ユーザー側にもわかりやすい設計が可能です。

  1. 開発タブ → 挿入 → フォームコントロールのボタン をクリック
  2. マクロの実行方法2(ボタンを押す方法)
  3. シート上でドラッグすると、ボタンに登録するマクロを選択できます
    マクロを選択 → OK をクリック
  4. マクロの実行方法2(ボタンを押す方法)
  5. ボタンを左クリックするとマクロが実行されます
  6. *ボタンを右クリックでドラッグすると、ボタンの位置を変更できます

    マクロの実行方法2(ボタンを押す方法)
  7. ボタンを右クリックすると、ボタンのテキストを編集できます
  8. マクロの実行方法2(ボタンを押す方法)
事前にボタンを設置しておくと、どんなユーザーにもわかりやすく、親切な設計といえるでしょう。
ただし、開発者が意図しないタイミングで押してエラーが出ることや、ボタンを何度も押す必要があって手間になる可能性もあります。
マクロを設計する時点でどういう方法で実行してもらうかは考えておくことが重要です。

ActiveXコントロールのボタンってなに?

フォームコントロールのボタンを選択するときに、下のActiveXコントロールが気になった方もいるのではないでしょうか。
ActiveXコントロールを使っても、同じようにマクロを実行することが可能です。
少し難しい話になるのですが、ActiveXコントロールは、VBAでオブジェクトとして扱うことが可能なのです。要するに、プログラム上でボタン等のコンポーネントを操作することができるようになります。
やや高度なので今は使う必要はありませんが、ユーザーフォームという自由にデザインできるオリジナルの入力フォームを作るときに使われることが多いです。

ユーザーフォームの例

マクロの実行方法2(ボタンを押す方法)
ActiveXコントロールは、ユーザーフォームを作成するときに使うもの

ある動作(イベント)により、マクロを実行する方法

ユーザーのなんらかの操作をきっかけ(イベント)にして、マクロを動かすことも可能です。
例えば、「セルを変更したときに、マクロを動かす」や「sheet1を選択したときに、マクロを動かす」といった設定のことです。
このイベントはたくさんありますので、今回はよく使う「セルを変更したとき」について取り上げます。

Worksheetのイベントプロシージャーの設定方法

  1. プロジェクトエクスプローラのシートをダブルクリック
  2. マクロを設定したいシートを選択すること

    イベントプロシージャーの設定方法
  3. オブジェクトリストからWorksheetを選択
  4. デフォルトでSelectionChangeプロシージャーが選択される

    イベントプロシージャーの設定方法
  5. プロシージャリストからChangeを選択
  6. ここの一覧がイベントプロシージャーの一覧となる。
    「セルを変更したとき」をイベントにするには「Change」を選択する。

    イベントプロシージャーの設定方法
  7. SelectionChangeプロシージャーのコードは消してよい
  8. イベントプロシージャーの設定方法

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を変更してもマクロは動作しません。

Worksheetのchangeプロシージャの使い方

変更したセルの情報を取得するTargetについて

変更したセルの番地も表示できるようにしてみます。
例えば、「(2, 2)のセルが変更されました!」のように表示したいとします。
この場合はどうすればよいでしょうか?

変更したセルの情報は Target という引数に入る

この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
Worksheetのchangeプロシージャの使い方

変更したセルの番地を表示することが可能となりました。

このTargetという引数を使ったイベントは他にもありますので、使い方を覚えておきましょう。

Worksheetのイベントプロシージャの一覧

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 に格納されている

解答はコチラ

Excelを開いて、コードを確認してください

Download

へびせんせい

上の演習問題のプログラムでは、セルをDeleteしたときも動作してMsgBoxが出てしまう。
セルをDeleteしたときは、動作しないように書き換えなさい。
【ヒント】 もしも(If)、セルを消したとき(Target.Value="")は、マクロを終了する(Exit Sub)

解答はコチラ

Excelを開いて、コードを確認してください

Download