シートモジュール内のPrivate Sub CommandButton1_Click()を実行すると
1.Sheet1シートのA列セル(今回はA1~A4までとします。)に複数Checkboxを動的に作成し、
2.同CheckBOXにChangeイベントを追加したい。
※追加するChangeイベントは 同CheckBoxがonになった際に MegBox にてCheckboxの名前を表示したい。
のですが、web上のコードを参考に作成しましたが、CheckBoxの作成は出来たのですが、イベントの追加はクラスを作成し、同クラスとCheckBoxを紐づけるようですが、この辺りがあまり理解出来ていない様です。
参考にしたweb上のコードは既にCheckBoxが存在していることを前提に記載されていましたのが、
今回はクラスが作成された時点ではCheckBoxが存在しないのですから、何かしらのコードを追記しないといけないのでは?と考えますが、どの様にしたら良いか分かりません。
どなたかご教示いただければ幸いです。
以下コードです。
'*************
'クラスモジュール Class1
'*************
Dim WithEvents 作成 As MSForms.CheckBox
Sub 紐付け(作成コントロール As MSForms.CheckBox)
Set 作成 = 作成コントロール
End Sub
Private Sub 作成_Change()
If 作成.value = True Then
MsgBox 作成.Name
Else: End If
End Sub
'*************
'シートモジュール Sheet1
'*************
Dim 動的作成() As New Class1
Private Sub CommandButton1_Click()
Dim y As Integer
For y = 1 To 4
'チェックボックス作成
Call createCheckBoxes(Cells(y, 1))
Next y
'チェックボックスとクラスを紐づけする
Call linkCheckBoxesEvent
End Sub
'チェックボタン作成関数
Function createCheckBoxes(ByVal obj As Object)
Dim StartX As Single 'セルの左端
Dim StartY As Single 'セルの上端
Dim EndX As Single 'セルの横幅
Dim EndY As Single 'セルの高さ
Dim checkbox_cell As Object
Set checkbox_cell = Cells(obj.Row, obj.Column)
StartX = checkbox_cell.Left
StartY = checkbox_cell.top
EndX = checkbox_cell.Offset(0, 1).Left - checkbox_cell.Left
EndY = checkbox_cell.Height
'チェックボックスオブジェクト作成
Dim checkbox_obj As OLEObject
Set checkbox_obj = ActiveSheet.OLEObjects.Add( _
ClassType:="Forms.CheckBox.1", _
Link:=False, DisplayAsIcon:=False, _
Left:=StartX, top:=StartY, Width:=EndX, Height:=EndY)
End Function
'チェックボックスとクラスの紐づけ
Function linkCheckBoxesEvent()
Dim 取得用 As Shape, インデックス As Long
For Each 取得用 In ActiveSheet.Shapes
If 取得用.Name Like "*CheckBox*" Then
ReDim Preserve 動的作成(インデックス)
動的作成(インデックス).紐付け OLEObjects(取得用.Name).Object
インデックス = インデックス + 1
Else: End If
Next 取得用
End Function
No.1ベストアンサー
- 回答日時:
クラスを使用してチェックボックスのChangeイベントを追加する方法は、チェックボックスを動的に作成する場合でも同じです。
ただし、クラスとチェックボックスを紐付けるコードを少し変更する必要があります。以下は、修正されたコード例です。
'*************
'クラスモジュール Class1
'*************
Public WithEvents 作成 As MSForms.CheckBox
Private Sub 作成_Change()
If 作成.Value = True Then
MsgBox 作成.Name
End If
End Sub
'*************
'シートモジュール Sheet1
'*************
Dim 動的作成() As Class1
Private Sub CommandButton1_Click()
Dim y As Integer
For y = 1 To 4
'チェックボックス作成
Call createCheckBoxes(Cells(y, 1), y)
Next y
'チェックボックスとクラスを紐づけする
Call linkCheckBoxesEvent
End Sub
'チェックボタン作成関数
Function createCheckBoxes(ByVal obj As Object, ByVal index As Long)
Dim StartX As Single 'セルの左端
Dim StartY As Single 'セルの上端
Dim EndX As Single 'セルの横幅
Dim EndY As Single 'セルの高さ
Dim checkbox_cell As Object
Set checkbox_cell = Cells(obj.Row, obj.Column)
StartX = checkbox_cell.Left
StartY = checkbox_cell.top
EndX = checkbox_cell.Offset(0, 1).Left - checkbox_cell.Left
EndY = checkbox_cell.Height
'チェックボックスオブジェクト作成
Dim checkbox_obj As OLEObject
Set checkbox_obj = ActiveSheet.OLEObjects.Add( _
ClassType:="Forms.CheckBox.1", _
Link:=False, DisplayAsIcon:=False, _
Left:=StartX, top:=StartY, Width:=EndX, Height:=EndY)
'チェックボックスとクラスを紐づける
Set 動的作成(index) = New Class1
Set 動的作成(index).作成 = checkbox_obj.Object
End Function
'チェックボックスとクラスの紐づけ
Function linkCheckBoxesEvent()
Dim i As Long
For i = 0 To UBound(動的作成)
If Not 動的作成(i) Is Nothing Then
'何かしらの処理を行うためにクラスとチェックボックスを紐づけたい場合は、
'以下のよう
クラスモジュール(Class1)のSub 紐付けは、引数として渡されたCheckBoxオブジェクトを、WithEventsキーワードを使用して作成オブジェクト変数に割り当てています。これにより、CheckBoxオブジェクトのChangeイベントを受け取ることができます。
また、Private Sub 作成_Change()は、作成オブジェクト変数で受け取ったCheckBoxオブジェクトのChangeイベントを処理するためのサブルーチンです。ここでは、CheckBoxオブジェクトがONになった場合に、その名前をメッセージボックスに表示するだけの処理を行っています。
次に、シートモジュールのSub CommandButton1_Click()は、指定したセルに動的にCheckBoxを作成しています。これにより、この時点ではCheckBoxオブジェクトはまだ存在していません。
そこで、Function linkCheckBoxesEvent()では、作成されたすべてのShapeオブジェクトを走査し、その中からCheckBoxオブジェクトを取得しています。そして、それらのCheckBoxオブジェクトを、事前に作成したClass1クラスのインスタンスである動的作成()の各要素に紐づけるために、Sub 紐付け()を呼び出しています。
したがって、クラスモジュール(Class1)のSub 紐付けとPrivate Sub 作成_Change()は、CheckBoxオブジェクトが作成された時点で自動的に紐づけられ、Changeイベントが発生した場合には、Private Sub 作成_Change()が呼び出されるようになります。
具体的には、以下のように変更することで、動的に作成されたCheckBoxオブジェクトにChangeイベントを追加することができます。
Dim WithEvents 作成 As MSForms.CheckBox
Public Sub 紐付け(作成コントロール As MSForms.CheckBox)
Set 作成 = 作成コントロール
End Sub
Private Sub 作成_Change()
If 作成.Value = True Then
MsgBox 作成.Name
End If
End Sub
Private Sub CommandButton1_Click()
Dim y As Integer
For y = 1 To 4
'チェックボックス作成
Dim checkbox_obj As OLEObject
Set checkbox_obj = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1",
返答遅くなり申し訳ございません。
早速のご回答ありがとうございました。
なるほど、OLEObjects.addで作成したチェックボックスオブジェクトとnewしたClass1の作成イベントを紐づけるのですね。
まだPCに触ることが出来ていないので、後程確認します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
字面がカッコいい英単語
あなたが思う「字面がカッコいい英単語」を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
エクセル・VBA CheckBoxのオブジェクト名に変数を使うことは可能でしょうか?
Excel(エクセル)
-
Excel VBAでCheckboxの名前を変数にとって値を調べたい
Visual Basic(VBA)
-
エクセル VBA CheckBox名に変数を使用
Excel(エクセル)
-
-
4
エクセルVBA フォームへ動的に貼り付けたボタンのクリックイベントを検知する方法を教えてください
Excel(エクセル)
-
5
Excel VBA 動的に作成したチェックボックスにイベントを追加したい
Excel(エクセル)
-
6
【VBA】シート上の複数のチェックボックスのうちどれか一つでも変更した場合のイベント
Visual Basic(VBA)
-
7
ユーザーフォームで動的(Me.Controls.Add)に作成したコントロールの削除
Visual Basic(VBA)
-
8
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
9
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
10
コントロールの存在確認
Visual Basic(VBA)
-
11
CheckBoxの配列化
Access(アクセス)
-
12
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
13
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
14
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
15
VBAでのチェックボックスの自動作成
その他(プログラミング・Web制作)
-
16
エクセルVBAで結合セルの真ん中にチェックボックスを作成する方法を教え
Visual Basic(VBA)
-
17
Excel2007 でのチェックボックスの名称
Visual Basic(VBA)
-
18
(VBA)チェックボックスのclickのイベントが、プログラムからの操作でも反応してしまいます。
Visual Basic(VBA)
-
19
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
20
フォームのCheck boxとOLEObjectのCheckboxのマクロの違い?
PowerPoint(パワーポイント)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Object型からDouble型へのキャスト
-
VBA 同じ名前のオブジェクトを...
-
Visual Studioでのbmpファイル...
-
EXCEL VBAにて動的にCheckBOXを...
-
ManagedDirectXを使った半透明...
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
Rangeオブジェクトを一時的に作...
-
開始日(Date型)から終了日(Date...
-
COMコンポーネントって何?
-
複数のドキュメントテンプレー...
-
ADO オブジェクトの渡し方
-
戻り値がクラスオブジェクト
-
VBAからノーツを起動
-
Webアプリケーションのエラーメ...
-
オブジェクトに値を保持させる...
-
Excelファイルをgrep検索したい
-
質問すいません。 javascriptの...
-
エプソンVP-930のESC/Pの操作に...
-
Servlet上でのClass#forName()...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
VBA 同じ名前のオブジェクトを...
-
Excelで =EMBED("Acrobat Docu...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
EXCEL VBAにて動的にCheckBOXを...
-
時間帯判定をする。
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
error C2712: オブジェクト ア...
-
LISTBOXの内容が更新されま...
-
ワイルドカード<?>と型パラメー...
-
戻り値がクラスオブジェクト
-
bmp画像をjpegやpng画像に圧縮...
-
VBAからノーツを起動
-
ワードで画像をドロップすると...
-
Accessの連結・非連結オブジェ...
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
おすすめ情報