前提・実現したいこと
VBAで
50個あるボタンに対して
それぞれ5個ずつのグループを作り
各グループに対して1つのボタンしか押せない(色がつかない)
→グループ内では1度ボタンを押した後に別のボタンを押すと、ほかのボタンは元の色に戻る
ようにしたい
そのために、とりあえずは押したボタンを自動認識し、色が変わるようにしたい
発生している問題・エラーメッセージ
エラーはないが機能しない
VBA
1~class1~ 2Public WithEvents myBtn As MSForms.CommandButton 3Private Sub myBtn_Click() 4 Dim i As Integer 5 i = myBtn.Index 6 n = "CommandButton" & i & ".BackColor" 7 If i <= 5 Then 8 n = RGB(255, 0, 0) 9 ElseIf i <= 10 Then 10 n = RGB(255, 0, 0) 11 End If 12End Sub 13~module~ 14Public myClass As New Class1 15Sub Auto_Open() 16 Dim ctrl As Object 17 Dim i As Integer 18Static myClass() As Class1 19 For Each ctrl In Worksheets("Sheet1").OLEObjects 20 If TypeOf ctrl.Object Is MSForms.CommandButton Then 21 ReDim Preserve myClass(i) 22 Set myClass(i) = New Class1 23 Set myClass(i).myBtn = ctrl.Object 24 i = i + 1 25 End If 26 Next 27End Sub
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
解決済みになっちゃいましたが、興味深い内容なので作ってみました。
今回の要件は、
複数のボタンをグループ化して、その中の一つだけを選択できるようにするということですね。
せっかくクラスにするのですから、できるだけ汎用性のあるものにしたいので、
下記のような設計を考えてみました。
SelectButtonクラス
クリックすると選択状態(背景色 赤)になる
・Selectedプロパティ 選択=True / 非選択=False
SelectButtonGroupクラス
SelectButtonのグループ
・Addメソッド コマンドボタンをグループに追加する。
このクラスを作ることによって各グループごとにボタンの数が異なる場合でも簡単に対応できます。
SelectButtonクラス
Option Explicit Private WithEvents btn As MSForms.CommandButton Private Slected_ As Boolean '選択 Private GroupBtns_ As Collection 'クラスにコマンドボタンと属するグループ(Collection)を登録する。 Public Sub setBtn(ByVal cb As MSForms.CommandButton, ByVal GroupBtns As Collection) Set btn = cb Set GroupBtns_ = GroupBtns End Sub '選択状態の設定 Public Property Let Slected(ByVal new_Slected As Boolean) If Slected_ <> new_Slected Then Slected_ = new_Slected If Slected_ Then btn.BackColor = vbRed Else btn.BackColor = vbButtonFace End If End If End Property '選択状態の取得 Public Property Get Slected() As Boolean Slected = Slected_ End Property Private Sub Btn_Click() Dim ctl As SelectButton For Each ctl In GroupBtns_ ctl.Slected = False Next Slected_ = True btn.BackColor = vbRed End Sub
SelectButtonGroupクラス
Option Explicit Private BtnGrp As Collection Public Sub Add(ByVal btn As MSForms.CommandButton) Dim selBtn As SelectButton Set selBtn = New SelectButton selBtn.setBtn btn, BtnGrp BtnGrp.Add selBtn End Sub Private Sub Class_Initialize() Set BtnGrp = New Collection End Sub Private Sub Class_Terminate() Dim selBtn As SelectButton For Each selBtn In BtnGrp selBtn.Slected = False Set selBtn = Nothing Next Set BtnGrp = Nothing End Sub
Sheet1 に、CommandButton1 ~ 10 の10個のコマンドボタンがあり、
1 ~ 5, 6 ~ 8, 9 ~ 10 の3グループに分ける、
Sheet2 に、CommandButton1 ~ 5 がありすべて一つのグループにする、
場合のコード例
ThisWorkBookモジュール
Option Explicit Private SelBtnGrp(3) As SelectButtonGroup Private Sub Workbook_BeforeClose(Cancel As Boolean) Set SelBtnGrp(0) = Nothing Set SelBtnGrp(1) = Nothing Set SelBtnGrp(2) = Nothing Set SelBtnGrp(3) = Nothing End Sub Private Sub Workbook_Open() Dim i As Integer With Worksheets("Sheet1") Set SelBtnGrp(0) = New SelectButtonGroup For i = 1 To 5 SelBtnGrp(0).Add .OLEObjects("CommandButton" & i).Object Next Set SelBtnGrp(1) = New SelectButtonGroup For i = 6 To 8 SelBtnGrp(1).Add .OLEObjects("CommandButton" & i).Object Next Set SelBtnGrp(2) = New SelectButtonGroup For i = 9 To 10 SelBtnGrp(2).Add .OLEObjects("CommandButton" & i).Object Next End With With Worksheets("Sheet2") Set SelBtnGrp(3) = New SelectButtonGroup For i = 1 To 5 SelBtnGrp(3).Add .OLEObjects("CommandButton" & i).Object Next End With End Sub
一応、最小限の雛形です。今後、拡張したいこととして、下記が考えられます。
SelectButtonクラスに
Countプロパティ、
SelectIndexプロパティ、
Changeイベント
などの実装
投稿2018/12/07 17:12
編集2018/12/08 03:58総合スコア33715
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/08 00:06
2018/12/08 00:39
2018/12/08 00:50
2018/12/08 01:28
2018/12/08 01:38 編集
0
ベストアンサー
修正してみました。
似ているようで若干違います。
クラスの使い方ですかね。
見比べてみてください。
Class1
VBA
1Private WithEvents Btn As MSForms.CommandButton 2 3Public Sub myBtn(ByVal cb As MSForms.CommandButton) 4 Set Btn = cb 5End Sub 6 7Private Sub Btn_Click() 8 Dim i As Integer 9 i = Btn.Index 10 If i <= 1 Then 11 Btn.BackColor = RGB(255, 0, 0) 12 ElseIf i <= 2 Then 13 Btn.BackColor = RGB(0, 255, 0) 14 ElseIf i <= 3 Then 15 Btn.BackColor = RGB(0, 0, 255) 16 End If 17End Sub
Module1
VBA
1Public myClass() As Class1 2 3Sub Auto_Open() 4 5 Dim ctrl As Object 6 Dim i As Integer 7 8 i = 0 9 For Each ctrl In Worksheets("Sheet1").OLEObjects 10 If TypeOf ctrl.Object Is MSForms.CommandButton Then 11 ReDim Preserve myClass(i) 12 Set myClass(i) = New Class1 13 myClass(i).myBtn ctrl.Object 14 i = i + 1 15 End If 16 Next 17 18End Sub
投稿2018/12/07 04:50
総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/07 05:11
2018/12/07 05:45
2018/12/07 08:37 編集
2018/12/07 12:49
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。