category name  »  page title date

セル選択だけのスイッチ

ワークシートのセルを選択しただけで所定のマクロを起動する、というページを作ってみました。これを表紙のメニューとして使うと、それはそれでいろいろと便利なことがあります。
たとえば、次の例のような感じ。

ワークシートの Worksheet_SelectionCHange イベントを拾って、標準モジュールの ButtonAction に飛んでいますが、そこで選択されたセルの内容に応じた処理なり、マクロの呼び出しなりを行います。この時、セルの内容を一時的に書き換えて別のボタンに変身させるようなことも簡単にできるのがメッケモノです。

この例は、イラストレーターの町割り線の中に凡例の記号を描画するというプロジェクトの例です。そのこと自体に意味はありません。ただ、こういった表紙の中には、ボタン代わりのセルだけでなく、データそのものやマクロを登録した画像などが混在しているはずで、ここでも「circle」を選択したリスト入力セルや、「データ」と記載したワークシート切替のボタンなどが一緒に存在しています。そこで、マクロを呼び出すボタンの範囲に“ButtonRange”という名前をつけて、その中のセルを選択したときだけ ButtonAction を実行するようにしています。

「描画開始」のところでいくつか例示していますが、フラグを上げたり下げたり、マクロ実行中にボタン名を「中止」としたり(つまり、描画開始した後にこのボタンを選択すると中止の処理が行われることになります)できます。
それぞれの処理は連携しているはずですので、この Select ブロックの中で一括して記載しておくと、見通しがよくなる・・・・こともあります。

ここでは表示していませんが、たとえばまだファイルを開いていなくてファイルオブジェクトが存在しない時には、「描画開始」「描画消去」「凡例マークの名称」などは意味を持ちませんので、その部分を覆うような半透明の図形を用意しておいて、その Visible プロパティを切り替えることでボタン機能を無効にすることもできます。ボタンはうっすら見えるけど、押しても何も起こらない、という状態です。こうしておくと親切ですね。

ワークシート

Private Sub Worksheet_SelectionChange(ByVal target As Range)
      ButtonAction target
End Sub

標準モジュール       ButtonAction()

'----- 描画中止のためのフラグ
Private cancelFlag As Boolean
'----- ボタンを選択した後の処理
Public Sub ButtonAction(target)
      '複数セルの選択は受け付けない
      If target.CountLarge > 1 Then Exit Sub
      'ボタン領域以外の選択は受け付けない
      If Intersect(target, Range("ButtonRange")) Is Nothing Then Exit Sub
      Select Case target.value
            Case "ファイルを開く": getTargetFile
            Case "描画開始":
                  'ボタンの表示を切り替える
                  target.value = "中止"
                  cancelFlag = False
                  drawMarks
                  'ボタンの表示を元に戻す
                  target.value = "描画開始"
            Case "中止": cancelFlag = True
            Case "描画消去": deleteMarks
            Case "詳細設定": showSettingForm
      End Select
      '処理が終わった後は、左上の隠れたセルを選択しておく
      Cells(1, 1).Select
End Sub
'----- 各ボタンに対応した実行マクロ
Private Sub getTargetFile()
    ・・・・・
End Sub
Private Sub drawMarks()
    ・・・・・
End Sub
Private Sub deleteMarks()
    ・・・・・
End Sub
Private Sub showSettingForm()
    ・・・・・
End Sub