VBA入門
第136回.ActiveXコントロール

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-11-16

第136回.ActiveXコントロール


リボンの開発タブにコントロールの挿入があります。
ActiveXコントロールをVBAで扱う場合の解説になります。


ワークシートでActiveXコントロールを扱う事の是非はありそうですが、使用することで便利かつ見栄えの良いシートになる場合もあります。
ただし、過去のバージョンアップで動作に問題が出たこともありますので、使用するときは十分に注意してください。

ワークシートにActiveXコントロールを配置し、その情報を使う場合のマクロVBAについて解説します。

ActiveXコントロールを追加する

VBA マクロ ActiveXコントロール

ワークシート上のActiveXコントロールはOLEObjectになります。
OLEObjectオブジェクトは、
ActiveXコントロール、リンクされたOLEオブジェクト、または埋め込まれているOLEオブジェクトを表します。
したがって、ActiveXコントロールの追加は、OLEObjectのコレクションOLEObjectsへの追加となります。

OLEObjects.Add (ClassType, FileName, Link, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height)

戻り値は追加されたOLEObjectオブジェクトです。
引数の説明
名前 必須
省略
データ型 説明
ClassType 省略可能 Variant ClassTypeまたはFileNameのいずれかを指定する必要があります。
オブジェクトのプログラムIDを含む文字列を指定します。
ClassTypeが指定されている場合、FileNameおよびLink_は無視されます。
FileName 省略可能 Variant ClassTypeまたはFileNameのいずれかを指定する必要があります。
OLEオブジェクトの作成に使用するファイルを示す文字列を指定します。
Link 省略可能 Variant この引数にTrueを指定すると、引数FileNameで指定したファイルで作成された新しいOLEオブジェクトをリンクします。
オブジェクトをリンクしない場合は、オブジェクトはそのファイルのコピーとして作成されます。
既定値は、Falseです。
DisplayAsIcon 省略可能 Variant 新しいOLEオブジェクトをアイコンまたは通常のピクチャで表示するには、Trueを指定します。
この引数がTrueの場合、引数IconFileNameおよび引数IconIndexを使ってアイコンを指定できます。
IconFileName 省略可能 Variant 表示するアイコンのファイルを示す文字列を指定します。
この引数は、DisplayAsIconがTrueの場合にのみ使用されます。
この引数を省略するか、指定したファイルにアイコンがない場合は、OLEクラスの既定のアイコンが使われます。
IconIndex 省略可能 Variant アイコンファイルに含まれるアイコンの番号を指定します。
これは、DisplayAsIconがTrueで、IconFileNameがアイコンを含む有効なファイルを参照している場合にのみ使用されます。
この引数で指定したインデックス番号のアイコンが、引数IconFileNameで指定したファイルに存在しないときは、ファイル内の最初のアイコンが使われます。
IconLabel 省略可能 Variant アイコンの下に表示するタイトルを示す文字列を指定します。
これは、DisplayAsIcon_がTrueの場合にのみ使用されます。
この引数を省略するか空の文字列("")を指定すると、タイトルは表示されません。
Left 省略可能 Variant ワークシートのセルA1の左上隅またはグラフの左上端を基準にして、新しいオブジェクトの初期座標をポイント単位で指定します。
Top 省略可能 Variant ワークシートの1行目の上端またはグラフのグラフエリアの上端を基準にして、新しいオブジェクトの初期座標をポイント単位で指定します。
Width 省略可能 Variant 新しいオブジェクトの初期幅をポイント単位で指定します。
Height オプション Variant 新しいオブジェクトの初期の高さをポイント単位で指定します。

ClassType:ActiveXコントロールの種類


ActiveXコントロール ClassType
コマント ボタン Forms.CommandButton.1
コンボ ボックス Forms.ComboBox.1
チェック ボックス Forms.CheckBox.1
リスト ボックス Forms.ListBox.1
テキスト ボックス Forms.TextBox.1
スクロール バー Forms.ScrollBar.1
スピン ボタン Forms.SpinButton.1
オプション ボタン Forms.OptionButton.1
ラベル Forms.Label.1
イメージ Forms.Image.1
トグル ボタン Forms.ToggleButton.1

ActiveXコントロール追加の使用例
Dim obj As OLEObject
Set obj = ActiveSheet.OLEObjects.Add( _
      ClassType:="Forms.CommandButton.1", _
      Link:=False, DisplayAsIcon:=False, _
      Left:=0, Top:=0, Width:=100, Height:=50)

コマンドボタンをシートの左上に追加しています。
※実行時の注意
ステップイン(F8)で実行すると追加はされますがエラーが発生します。

ActiveXコントロールを削除/編集

図形オートシェイプと同様にShapesとして扱えます

ActiveXコントロールを手動操作する場合は、デザインモードにしてから行います。

VBA マクロ ActiveXコントロール

コントロールの右クリックメニューの「コントロールの書式設定」になります。

VBA マクロ ActiveXコントロール

ActiveXコントロールの削除
ActiveSheet.Shapes(2).Delete
ActiveSheet.Shapes("CommandButton1").Delete

Shapesコレクションのインデックスを指定して削除します。
インデックスは数値または名称で指定できます。

ActiveXコントロールの編集
With ActiveSheet.Shapes(1)
  .Name = "名前"
  .Top = 10
  .Left = 10
  .Width = 100
  .Height = 50
End With

プロパティ・メソッドは多数存在します。
以下を参照してください。
図形(Shape)関連のプロパティ、メソッド一覧
図形(Shape)を構成するオブジェクトには、以下のものがあります。Shapesコレクション…Shapeオブジェクトのコレクション Shapeオブジェクト…オートシェイプ、フリーフォーム、OLEオブジェクト、またはピクチャなど、描画レイヤーのオブジェクトを表します。
ただしActiveXコントロールでは使えないプロパティ・メソッドも多くあります。

ActiveXコントロールとして扱う
コントロールの右クリックメニューの「プロパティ」になります。

VBA マクロ ActiveXコントロール

マクロ VBA サンプル画像

プロパティは、ActiveXコントロールの種類ごとに違ってきます。
この「オブジェクト名」つまりNameプロパティとShapeのNameプロパティは別々のものになります。
Shapeとしての名前と、ActiveXコントロールとしての名前は別だという事です。



With ActiveSheet.OLEObjects(1)
  .Name = "名前"
  .Top = 10
  .Left = 10
  .Width = 100
  .Height = 50
End With

With ActiveSheet.OLEObjects("CommandButton1")
  .Delete
End With

ActiveXコントロールの設定/情報取得

ActiveXコントロールを扱う時は、シートモジュールで扱うと簡単に扱えます。
シートモジュールで、

VBA マクロ ActiveXコントロール

VBA マクロ ActiveXコントロール

このように、Meから順次書き進めると次々と候補表示されます。
ActiveXコントロールは、コントロールごとに扱い方が変わりますので、
ここでは代表としてコンボボックスとチェックボックスについて使用例を掲載します。

コンボボックスをシートモジュールで扱う
Me.ComboBox1.ListFillRange = Me.Range("A1:A10").Address

コンボボックスのリストに、自身のシートのA1:A10を設定しています。

Me.ComboBox1.ListFillRange = Sheet1.Range("A1:A10").Address(external:=True)

他シートの場合は、設定文字列にシート指定(external:=True)が必要になります。

Me.ComboBox1.ListFillRange = ""
Me.ComboBox1.AddItem "A"
Me.ComboBox1.AddItem "B"
Me.ComboBox1.AddItem "C"

リストとして固定値を設定しています。
ListFillRangeに設定済の場合はAddItemがエラーになるので、事前にListFillRangeを消去しておきます。

MsgBox Me.ComboBox1.Value

コンボボックスの値を取得しています。
値の取得は、.Textでも取得できます。

チェックボックスを標準モジュールで扱う
標準モジュールで扱う場合は、少々VBAが面倒になります。

Sub sample1()
  Dim ws As Worksheet
  Set ws = ActiveSheet
  Dim obj As OLEObject
  For Each obj In ws.OLEObjects
    If obj.progID = "Forms.CheckBox.1" Then
      obj.Object.Value = True
    End If
  Next
End Sub

シートのすべてのActiveXコントロールのチェックボックスにチェックを付けています。
OLEObjectsコレクションからOLEObjectオブジェクトを取り出し、
その中のObjectプロパティで取得されるオブジェクトに目的のコントロールが入っています。

イベントプロシージャーの作成

ActiveXコントロールに対するイベントプロシージャーの作り方は、
ワークシートやブックのイベント作成手順と同じになります。
第124回.Workbookのイベントプロシージャー
Workbookのイベントプロシージャーは、ブックに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Workbookのイベントは多数用意されています。
第125回.Worksheetのイベントプロシージャー
Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。
VBA マクロ ActiveXコントロール

左のドロップダウンでオブジェクトを選択します。

VBA マクロ ActiveXコントロール

Changeイベントが自動で入ります。
これはそのままにして勧めてください、不要な場合は後で削除します。
右のドロップダウンでイベントを選択します。

VBA マクロ ActiveXコントロール

Private Sub オブジェクト名_イベント名([引数])
引数が必要な場合はそれも含めて自動的にプロシージャーが追加作成されます。
この追加されたプロシージャーの中に、必要なVBAコードを記述します。

Private Sub ComboBox1_Change()
  If Me.ComboBox1.Value = "" Then
    MsgBox "コンボボックスの値が消去されました。"
  Else
    MsgBox Me.ComboBox1.Value
  End If
End Sub

ActiveXコントロールの最後に

最初にも少し書きましたが、シートでのActiveXコントロールは過去には問題が発生したこともあります。
大抵の場合は、フォームコントロールで対応できますので、まずはそちらで検討してみてください。
リボンの開発タブにコントロールの挿入があります。フォームコントロールをVBAで扱う場合の解説になります。ワークシートでフォームコントロールを扱う事の是非はありそうですが、使用することで便利かつ見栄えの良いシートになる場合もあります。

フォームコントロールではできない、より細かい操作が必要な場合は、むしろユーザーフォームを検討してみてください。
Excelユーザーフォーム入門
エクセル(Excel)マクロ(VBA)をやっていれば、どうしてもユーザーフォームを使いたくなります、使いたくなるというより、使った方が良い場合が出てきます。ただし、ユーザーフォームを使いこなすには、各種コントロールの特性を理解し、イベントについても深い知識が必要になりす。
シートでのActiveXコントロールの扱い方は、ユーザーフォームでのコントロールの扱い方と似ているので違和感なく扱えるはずです。



同じテーマ「VBA入門」の記事

第127回.他のブックのマクロを実行(Runメソッド)
第128回.マクロをショートカットで起動(OnKeyメソッド)
第129回.レジストリの操作(SaveSetting,GetSetting,GetAllSettings,DeleteSetting)
第130回.テーブル操作の概要(ListObject)
第131回.テーブル操作のVBAコード(ListObject)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
第133回.引数の数を可変にできるパラメーター配列(ParamArray)
第134回.Errオブジェクトとユーザー定義エラー
第135回.ジャンプの選択オプション(SpecialCells)
第136回.フォームコントロール
第136回.ActiveXコントロール


新着記事NEW ・・・新着記事一覧を見る

SQL関数と演算子|SQL入門(12月1日)
データの取得:集約集計、並べ替え(DISTINKT,GROUP BY,ORDER BY)|SQL入門(11月30日)
データの取得:条件指定(SELECT,WHERE)|SQL入門(11月29日)
データの挿入:バルクインサート|SQL入門(11月28日)
データの挿入(INSERT)と全削除|SQL入門(11月26日)
テーブル名変更と列追加(ALTER TABLE)とテーブル自動作成|SQL入門(11月25日)
テーブルの作成/削除(CREATE TABLE,DROP TABLE)|SQL入門(11月24日)
データベースに接続/切断|SQL入門(11月23日)
SQLiteのインストール|SQL入門(11月22日)
SQL入門:VBAでデータベースを使う|エクセルの神髄(11月22日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • ActiveXコントロール

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
    掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ