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

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

第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)関連のプロパティ、メソッド一覧
図形(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入門」の記事

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


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

ユーザーに絶対に停止させたくない場合のVBA設定|VBA技術解説(4月1日)
CharactersプロパティとCharactersオブジェクト|VBA技術解説(3月31日)
指数近似/対数近似/累乗近似(掲載順位とCTR)|エクセル関数超技(3月31日)
練習問題32(連続数値部分を取り出し記号で連結)|VBA練習問題(3月24日)
連続数値部分を取り出し記号で連結|エクセル関数超技(3月24日)
数式バーの高さを数式の行数で自動設定|VBAサンプル集(3月21日)
LET関数(数式で変数を使う)|エクセル入門(3月21日)
スピルに対応したXSPLITユーザー定義関数(文字区切り)|VBAサンプル集(3月15日)
XMATCH関数(範囲から値を検索し一致する相対位置)|エクセル入門(3月14日)
XLOOKUP関数(範囲を検索し一致する対応項目を返す)|エクセル入門(3月14日)


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

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




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


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



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