それわVBA案件ですね

エクセルVBAネタを書いています

ActiveX コントロールはコワくない

仕事の忙しさがひと段落してクリスマス、年末ムードが一気に押し寄せてきているあてくしです。

こんちくわ |ω・)ノ

さて今回はノンプロ研のアドベントカレンダーイベント(なんかイベントプロシージャ的な響きw)で、13日目を担当することになりましたので、久々の更新に合わせて記事を書こうと思います。

本日はなんだか謎めいていて、なんとなく扱うのがコワかったActiveXコントロールを必要に迫られて恐る恐るいじってみたら・・

あれ? なにこれそういうことだったのね・ω・)

と、あっさり理解できたので、皆さんにも共有しましょう!

な、お話です。



でわいきます ̄▽ ̄)




目次


突然ですが!

ActiveXコントロールって謎めいていると思いませんか?

私はエクセルのリボンの開発タブにひっついている、なんか訳の分からない謎のコントロールだと思っていました。


だって、"ActiveX" って、"" ですよ!!

なんかコワくないですか?


だいたい普通っぽいコントロールもちゃーんと準備されているのに、なんでわざわざ Ⅹなモノがすぐ下にひっついているのか・・・

f:id:FukuCyndiP:20191208234254p:plain:w200



VBAの神様も

一生触らなくて良い

って、言ってるんですよ。


bookmeter.com

なんかコワくないですか?(2度目)



だったのですが、データ解析用のワークブックに使える気がしたので、恐る恐るいじってみたら・・


あれ?なんだ簡単ぢゃん!

とあっさり、理解してしまったのでした。


ActiveXコントロールってナニ?

ハイ、一言でいうと、

ユーザーフォームで使う各種コントロールをワークシート上に埋め込むためのものです

ActiveX コントロールをいじってみたら、プロパティの設定、コードの書き方や内容がユーザーフォームと同じなことにすぐに気がついちゃったんですねw 

ユーザーフォーム:
コントロールが埋め込まれた専用の枠(?)を呼び出して使う

f:id:FukuCyndiP:20191212211339g:plain:w300
f:id:FukuCyndiP:20191212212646p:plain:w400
コードはフォームモジュールに書きます


ActiveXコントロール
コントロールをワークシートに埋め込んで使う

f:id:FukuCyndiP:20191212211907g:plain:w300

f:id:FukuCyndiP:20191212212903p:plain:w400
コードはシートモジュールに書きます

ね。どこに作るか以外はおんなじでしょw




フォームコントロールとの違いはナニ?

フォームコントロールが簡易的なもので、ActixeX コントロールは発展応用版ですね


以下両社の違いなどを簡単にまとめてみました

フォームコントロール ActiveXコントロール
機能 クリックに合わせて指定のマクロを発動する(コマンドボタン)
ワークシートの指定の場所に数値などを表示する(チェックボックス、コンボボックスなど)
クリックに合わせて指定のマクロを発動する(コマンドボタン)
チェック状態や、選択された値などをメモリに格納する(他のコントロールに付随したマクロと自由に受け渡し可能)
見た目のコントロール フォント、色など、ピクチャ系のコントロール フォント、色など、ピクチャ系のコントロール
数値入力時やマウスオーバーなどアクションに応じた見た目の変化
ピクチャの設定や、背景の透明化など
他のコントロールオブジェクトとの連携 ワークシートへの出力値を通じて連携 ボタンの状態、入力値やイベントトリガーなどを通じて自由に連携
イベントマクロの設定 コントロールのクリックに合わせて発動するのみ クリック、ダブルクリック、テキスト入力、マウスオーバー等の複数のイベントに合わせてマクロを実行可能
コードを書く場所 標準モジュール コントロールを埋め込んだシートモジュール
その他 テキストボックスは選択できない




どうやって使うの?

ActiveXコントロールの存在を知っている方はすでにご存じのことかと思いますが、リボンの開発タブ→挿入をクリックすると出てきます。

f:id:FukuCyndiP:20191208235619p:plain:w250


そこで埋め込みたいコントロールをクリックして、ワークシート上の設置したい場所をクリックして、好きな大きさにびろーんとすれば作れます。
見た目の変更など、各種プロパティを変更したいときは、デザインモードをONにした状態で、プロパティ部分クリックして設定します。 ONにしておかないと、移動も消去もできないのでご注意ください。

f:id:FukuCyndiP:20191208235956p:plain:w250


因みにあてくしはこのことを知らなかったため、一度くっつけると剥がせなくなる恐ろしいモノ と勝手に思い込んでおりました -ω-)


で、肝心のコーディングはどうするかというと・・・、
ここでは説明しきれないので、また次の機会にしますね。




ぶっちゃけフォームコントロールとどうなの?

例えば、ワークシートに埋め込むコントロールの使いどころとしては


  1. コマンドボタンをクリック → 設定したマクロを動かす
  2. チェックボックスやコンボボックスでパラメータを設定 → 設定に合わせてワークシート上の関数の引数を変更
  3. コマンドボタンクリック → チェックボックスやコンボボックスで設定したパラメータを使ったマクロを動かす

といったことでしょうか。



このような操作ならばどちらを使っても実現可能ですので、複数のプロシージャを組みわせることになるActiveX コントロールをあえて使わなくてもいいかなと思います。

もしフォームコントロールで使いにくい部分があるとすると、2.、 3.のケースかなと思います。何が気になるのかというと、コントロールで設定するパラメータを利用するためには、初期値や変更した後のパラメータ値をワークシートのどこかに書いておかなければいけないということですね。それはつまり、例えば何も知らないユーザーがうっかり初期値を記入しているセルをいじってしまうなど、ユーザーによる干渉が原因となって、プログラムが正常に動作しないリスクを残すということになるのです。

ワークシートを作って使ってもらう側に立つと、エラーによるプログラム停止でユーザーに不都合がないようにしたいですからねw

 


ActiveXコントロールならではのことってナニ?

先ほど書いた観点に立つと、ActiveXコントロールは初期値や設定値は変数に代入してメモリ上でプロフグラムを動かすことができるので、より安定的にプログラムを動かすことができます(いわゆる堅牢性ですね)

また、下記の様な様々な操作をきっかけにしたマクロ発動ができることでしょうか。

  • (ダブル)クリック
  • 内容の変更
  • ドロップダウン表示/非表示
  • キーボードのキーを押す/離す
  • コントロール(テキストボックスなど)を選択する

    など


このような機能を使うと、例えば、


  • テキストボックスにデフォルト値を設定 → 書き換えたいときにクリックするとデフォルト値を消去して、入力Readyにする(GetFocusイベント)
  • あるコントロール都道府県名を入力したら、それに応じた名産品一覧を別のコントロールに表示(Chaneイベント)
  • 選択しているボックスの色を変える(GetFocusイベント)
  • ユーザーによる特定のキーの使用を制限する(KeyPress, KeyUp, KeyDownイベント)
  • 必須項目の入力が終わるまで次の操作を制限する(LostFocusイベント)


などなど、ユーザーフレンドリーや安定的運用(プログラム製作者の意図から外れないようにユーザーの操作を導くといった)のための工夫を存分に設定できるかと思います。




ActiveX Controlで気を付けること

私も体験したことですが、ボタンやテキストボックスの大きさがでっかくなったりちっちゃくなったりすることがあります。

エクセル2016とWindows10との組み合わせによるバグだそうですが、外部モニターやプロジェクタに接続した際の画面解像度の変化と関係しているようです。

回避策として、コントロールを埋め込んだワークシートを起動とするのと同時に、埋め込んでいる全てのコントロールの大きさをちょっとだけいじる(Worksheet_Activateイベント案件)。ということがブログで紹介されていましたので(https://shimpokikaku.at.webry.info/201707/article_1.html)、絶賛利用させていただいています。

いまのところ不具合は発生していませんが、バグを確実に再現する方法がわからないため、十分に検証できていない状況です。なので、エクセル2016+Windows10の方はご注意くださいませ(Office365ではバグの報告はなさそうです)。




まとめ

今回の記事はActiveX コントロールについて、

  • ただのユーザーフォームのコントロールをワークシートに埋め込むためのものだった。
  • 大まかにはフォームコントロールとできることは同じ
  • ワークシートをよりユーザーフレンドリーに、より安定的に使うための細かい設定ができる発展版

ですよーということをお伝えしました。
実際に使うための細かい設定やコーディングについては別の機会とさせていただきましたが、今後ちょこちょこと紹介していこうかなと思います。

また、われらがノンプロ研のブログにも紹介されていますので、ご興味がある方は一度ご覧になっていただけるといいかと思います。  

tonari-it.com


それにしてもなんだか謎だったので、ムリに使わんでもいいや~と突っ込むのを 遠慮 避けていたActiveXコントロールでしたが、分かってしまえば何のことはなく、ワークシートの便利な使い方がわーっと目の前に広がった感じがしますね。

しかしたまたま勉強する気になったから良かったものの、もしその気になっていなかったなら、この知識を得る機会が果たしてあったのかと思うと・・・食わず嫌いは良くないを改めて実感ました。
徹底的にやることで、苦手を得意に転じてきた経験は過去にもありますが、苦手だから、なんだかよくわからないから避けるのではなく、逆にどんどん突っ込んでいった方が確実に得するんですよね。このことを忘れず年末年始、さらには2020年に凸入していこうと思います。

でわまた~ ̄▽ ̄)ノシ