🐶

VBA:ボタンキャプションを利用して処理を分岐する

2020/10/19に公開

はじめに

ボタンにどのプロシージャを割り当てたか、ワケわかんなくなりませんか?

僕はなります。頭の中はコレ。

図1.殺伐としたアレ

先にコードを示してから、初心者向けの解説を記載します。

基本のコード

以下のコードを標準モジュールにコピペすれば、誰でも使えます。

キャプションを取得するプロシージャ

Function CapFBtn()
    'ボタン名取得
    NmFBtn = Application.Caller
    'キャプション取得
    With ActiveSheet
        CapFBtn = .DrawingObjects(NmFBtn).Characters.Text
    End With
End Function

ボタンに登録するプロシージャ

Sub DoCap()
    '-----共通処理があれば


    '-----共通処理ここまで
    'ボタンのキャプション取得
    TgtProc = CapFBtn
    'キャプション名のプロシージャ実行
    Application.Run TgtProc
    '-----共通処理があれば


    '-----共通処理ここまで
End Sub

DoCapマクロをボタンに登録すれば、キャプションと同一名のプロシージャを実行できます。

何が便利なのか

キャプションをプロシージャ名と同一にすることで、処理を分岐できるため

  • コードに一定の視認性と保守性を保てる。
  • 共通の処理を行ってから個別処理に分岐する複数のボタンがあるときにシンプル。

ここから先は読みたい人だけ読んでください。

解説

ざっくりと用語解説をしながら、サンプルボタンの作り方を解説します。

①通常のやり方

まずは文頭の基本のコードを使わない方法で、2種類のサンプルボタンを実装してみましょう。

1)ボタンの作成

まず、ボタンを2つ作りましょう。ボタンはフォームコントロールと記載のある方(ActiveXではない方)を使用してください。
図2.使用するコントロール

ボタンキャプションとは、ボタンを右クリックして「テキストの編集」で変更できるテキストのことを指します。図3のようにReport_PDFReport_CSVと書き換えましょう。

図3.ボタンキャプション

ちなむと、ボタン名はボタンキャプションとは異なります。ボタンを右クリックすると、左上の名前ボックスに表示されるオブジェクト名です。これはそのままで構いません。

図4.ボタン名

一応説明はしましたが、ボタン名については今回は取り上げません。

2)サンプルプロシージャの作成

実験のために、以下のようなサンプルプロシージャを書いてみましょう。
Subの後ろに付ける名前、Report_PDFReport_CSVがプロシージャ名です。

サンプルプロシージャ

'Report_PDFプロシージャ
Sub Report_PDF()
    '印刷
    ActiveSheet.PrintOut
    'PDF出力
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:="C:\test\test.pdf"
End Sub

'Report_CSVプロシージャ
Sub Report_CSV()
    '印刷
    ActiveSheet.PrintOut
    'CSV出力
    ActiveWorkbook.SaveAs Filename:="C:\test\test.csv", FileFormat:=xlCSV
End Sub

ボタンキャプションとプロシージャ名は一致の必要はありませんが、コードの視認性が高まるのでそうしています。本記事の②では名前の一致を利用して、ボタンキャプションで処理を分岐させます。

3)ボタンにマクロを割り当てる

先程のサンプルプロシージャをボタンに登録してみましょう。

  1. 「Report_PDF」と書かれたボタンを右クリックする。
  2. コンテキストメニューから「マクロの登録」を選んで、「Report_PDF」プロシージャを登録。
  3. 同様に「Report_CSV」には「Report_CSV」プロシージャを登録します。

図5.マクロの登録

ここまでが、通常のサンプルボタンの実装方法です。

「Report_PDF」と書かれたボタンを押せば「Report_PDF」プロシージャが、「Report_CSV」と書かれたボタンを押せば「Report_CSV」プロシージャが正しく動作するはずです。

②ボタンキャプションで処理を分岐させるやり方

では、基本のコードを使って、2つのサンプルボタンを実装してみましょう。

1)基本のコードを書く。

まずは基本のコードを2つ書きます。

キャプションを取得するプロシージャ

Function CapFBtn()
    'ボタン名取得
    NmFBtn = Application.Caller
    'キャプション取得
    With ActiveSheet
        CapFBtn = .DrawingObjects(NmFBtn).Characters.Text
    End With
End Function

記事冒頭とまったく同じコードです。そのまま書いてみましょう。

ボタンに登録するプロシージャ

Sub DoCap()
    '-----共通処理があれば
    '印刷
    ActiveSheet.PrintOut
    '-----共通処理ここまで
    'ボタンのキャプション取得
    TgtProc = CapFBtn
    'キャプション名のプロシージャ実行
    Application.Run TgtProc
    '-----共通処理があれば

    '-----共通処理ここまで
End Sub

サンプルプロシージャ(Report_PDF、Report_CSV)では、個別処理の前にかならず共通処理としてPrintOutを行います。そこで今回は、ボタンに登録するプロシージャ(DoCap)の共通処理部分にPrintOutの処理を足してみましょう。

2)サンプルプロシージャを書く。

1)で共通処理はボタンに登録するプロシージャ(DoCap)に書いたので、個々のサンプルプロシージャにはPrintOut処理は不要です。

サンプルプロシージャ

'Report_PDFプロシージャ
Sub Report_PDF()
    'PDF出力
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, fileName:="C:\test\test.pdf"
End Sub

'Report_CSVプロシージャ
Sub Report_CSV()
    'CSV出力
    ActiveWorkbook.SaveAs Filename:="C:\test\test.csv", FileFormat:=xlCSV
End Sub

3)ボタンにマクロを割り当てる

サンプルプロシージャをボタンに登録してみましょう。

  1. 「Report_PDF」と書かれたボタンを右クリックする。
  2. コンテキストメニューから「マクロの登録」を選んで、「DoCap」プロシージャを登録。
  3. 同様に「Report_CSV」にも「DoCap」プロシージャを登録します。

これで、①と同じ処理を2種類のサンプルボタンに実装できました。
好き好きではありますが、ツールの性質によっては使い出があります。

殺伐としたアレに例える

感覚的に理解したい方はこちらをどうぞ。

ポチに芸をさせるルール

  1. 柴犬の名前をポチとします。
  2. 「ぱんだ」や「インド象」などの芸があります。
  3. ポチには絶対に「ニャーン!」と言わせてから、芸をさせなければなりません。

命令の例

  • 「ポチ、ニャーン!って言ってから、ぱんだやって!」
  • 「ポチ、ニャーン!って言ってから、インド象やって!」

図1.殺伐としたアレ

いや、やりたいこと「ぱんだ」なんだから、お前の名前はどうでもええやろ。しかも「ニャーン!」の部分、いちいち命令させんなや。

僕は「ぱんだ」「インド象」と書いてあるボタンを押すだけで、ポチに正しく命令したいんです。

…あ、余計分かりづらかった?

SATUBATU
画像をお借りしました。

Discussion