2024年11月5日火曜日

ネットの投稿が、わざと分かりずらく書いていると邪推してしまうような説明を糺す(その②) ー シート上のコントロール動的作成(VBAマクロ)

シート上ActiveXコントロール
          
その①で説明した内容は、ユーザーフォーム上のActiveXコントロールでした。
今回は、ワークシート上で、複数のコントロールを一気に作ってしまう手法ね。

ただ、ワークシートのActiveXコントロールは、OLEObjectの属性で括られる。
一方、OLEは、"Object Linking and Embedding"の略で、かなり古い仕組み。

昔は、WordにExcelなどの別のアプリケーションを貼り付けるのに使いました。
貼り付けた後は、貼り付けた個所をクリックすると、編集できたりもしたのよ。

しかも、一太郎や花子のアプリでもOLEを使うと他のアプリと連携できました。
だけど、エクセルのシートに貼るのに、何でOLEのオブジェクトなんだろうか。

まあ、オフィスの各アプリに貼付けられるコントロールオブジェクトだからか。
そう思うことにして、Objectなのか、OLEObjectなのかは、使う時に注意だな。

それでコードですが、冒頭のような複数コントロールを動的配列にする手法だ。
というわけで、コードの構造は、その①で説明した内容を参考にして下さいね。

こちらの記述でも、”OLEObjects.Add”で複数個を作成した後は、コントロールを配列に流し込んでから、クラスモジュールでイベントの挙動を起こす操作につなげていくのですが、この配列を削除してしまうと、イベントが起きなくなるので、何かゲームに活用できないかと思案する自分なのでした。

※起動方法:
① プロシージャ”Macro1”と”try”を順にコールすると、イベントが発生できます
② ①の後、プロシージャ”try2”をコールすると、イベントは発生しません

※モジュール1に記述するコード
Sub Macro1()
  Dim obj As OLEObject, i As Long
For i = 1 To 5
Set obj = ActiveSheet.OLEObjects.Add( _
            ClassType:="Forms.CommandButton.1", _
            Link:=False, DisplayAsIcon:=False, _
            Left:=5 + (i - 1) * 55, Top:=5, Width:=50, Height:=50)
With Sheet1.OLEObjects("CommandButton" & i).Object
  .Caption = i
  .Font.Name = "メイリオ"
  .Font.Bold = True
  .Font.Size = 24
  .ForeColor = vbRed
  .BackColor = RGB(0, 204, 0)
    End With
Next i
End Sub

Sub Sample() 'シート上のコントロールを削除(参考)
  ActiveSheet.OLEObjects.Delete
End Sub

Sub OLEObjctChk() 'シート上の各コントロールの名前を確認(参考)
Dim Objct As OLEObject
For Each Objct In ActiveSheet.OLEObjects
Debug.Print Objct.Name
Next Objct
End Sub

※モジュール2に記述するコード
Private CommandButton(5) As New Class1 'モジュール先頭に必要
Private i As Integer

Sub try() 'クラスモジュールに配列作成・イベント処理可能
Dim objCom As Object
  i = 0
    For Each objCom In ActiveSheet.OLEObjects
      If objCom.Name Like "CommandButton*" Then
        Set CommandButton(i).comC = objCom.Object
         i = i + 1
      End If
    Next objCom
End Sub

Sub try2() 'クラスモジュールの配列削除・イベントが起きない
Dim i As Integer
For i = 0 To 5
Set CommandButton(i).comC = Nothing
Next
End Sub

※クラス1モジュールに記述するコード
Public WithEvents comC As CommandButton 'モジュール先頭に必要

Private Sub comc_Click() 'クリックでメッセージボックス起動
MsgBox comC.Caption
End Sub



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿