VBA入門
ActiveXコントロール

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

第137回.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)関連のプロパティ、メソッド一覧
・Shapesコレクション ・・・ Shapeオブジェクトのコレクション ・Shapeオブジェクト ・・・ オートシェイプやピクチャなど、描画レイヤーのオブジェクト ・ShapeRangeオブジェクト ・・・ 文書の図形セットである図形範囲を表します。 ・GroupShapesオブジェクト ・・・ グループ化した図形を表します。 ・FillFormatオブジェクト ・・・ 図形の塗りつぶしの書式設定を表します。 ・LineFormatオブジェクト ・・・ 線と矢印の両端の書式を表します。 ・TextFrameオブジェクト ・・・ レイアウト枠を表します。 ・TextFrame2オブジェクト ・・・ 2007から追加されたTextFrameの後継オブジェクト。
ただし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 マクロ ActiveXコントロール

シートのオブジェクト名を使わずに標準モジュールで扱う場合は、少々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のイベント一覧 ・イベントプロシージャー追加のVBE操作 ・Workbook_Open:Workbookのイベント ・Workbook_BeforeClose:Workbookのイベント ・Workbook_SheetChange:Workbookのイベント
第125回.Worksheetのイベントプロシージャー
・Worksheetのイベント ・イベントプロシージャー追加のVBE操作 ・Activate:Worksheetのイベント ・BeforeDoubleClick:Worksheetのイベント ・BeforeRightClick:Worksheetのイベント ・Change:Worksheetのイベント ・SelectionChange: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コントロールは過去には問題が発生したこともあります。
大抵の場合は、フォームコントロールで対応できますので、まずはそちらで検討してみてください。
・フォームコントロールを追加する ・フォームコントロールを削除/編集/情報取得 ・フォームコントロールを特定する方法 ・フォームコントロールの最後に

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

シートでのActiveXコントロールの扱い方は、ユーザーフォームでのコントロールの扱い方と似ているので違和感なく扱えるはずです。




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

第96回.グラフ(Chart)
第97回.図形オートシェイプ(Shape)
第136回.フォームコントロール
第137回.ActiveXコントロール
第98回.Findメソッド(Find,FindNext,FindPrevious)
第99回.Replaceメソッド(置換)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
第135回.ジャンプの選択オプション(SpecialCells)
第141回.行・列の表示・非表示・列幅・行高
第105回.Callステートメント
第106回.Functionプロシージャー


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

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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



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