• ベストアンサー

Excel2000 クリックイベントをまとめたい

クラスを利用すれば出来ると思うのですが、知識不足で解決出来ませんでした。 1.フォーム上にCheckboxが20個程あり,その中の”ChkB_すべて”というCheckboxがチェックされた場合、他のCheckboxのチェックを外し、その逆で”ChkB_すべて”以外のCheckboxにチェックが入った場合は”ChkB_すべて”のチェックを外すという処理をしたい。また、”ChkB_すべて”のクリックイベント以外は殆ど同じ処理をしているので簡略化したい。 2.フォーム上にあるCheckboxのチェックの有無を配列に入れたい。 Web上で見つけたクラスの処理を応用しようと思ったのですが出来ませんでした。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

クラスで『擬似コントロール配列?』を作ってみました。 UserForm1にチェックボックスを20個使った例です。 標準モジュールのCBnumにチェックボックスの個数を設定して下さい。 UserForm1に  オブジェクト名=CheckBox1、Caption="ChkB_すべて"  オブジェクト名=CheckBox2    :  オブジェクト名=CheckBox20 を配置しています。 コードを簡略化するために、オブジェクト名は番号順に、 CheckBox1のCaptionを『ChkB_すべて』としてコードを書いています。 オブジェクト名を判定に使うなら少し修正する必要があります。(こちらは非効率でしょう) ここから ↓ '=== クラスモジュールに貼り付け <Class1> === 'WithEventsでActiveXコントロールで発生するClickイベントを検知させる Private WithEvents myChkBox As MSForms.CheckBox Private myIndex As Integer 'CheckBox型の変数が参照するチェックボックスを設定するための関数 Public Sub SetCheckBox(NewCheckBox As MSForms.CheckBox, Index As Integer)   Set myChkBox = NewCheckBox   myIndex = Index End Sub '独自に作ったmyChkBoxのClickイベントを書く Private Sub myChkBox_Click()   Dim cb As Integer 'チェックボックスカウンタ   If myChkBox.Value = True Then     If myChkBox.Caption = "ChkB_すべて" Then       For cb = 2 To CBnum         UserForm1.Controls("CheckBox" & cb).Value = False       Next     Else       UserForm1.Controls("CheckBox" & 1).Value = False     End If   End If   'チェックボックスの値を配列に入れる   For cb = 1 To CBnum     CBval(cb) = UserForm1.Controls("CheckBox" & cb).Value     'Range("A" & cb) = CBval(cb)   Next End Sub '=== フォームのコードウインドウに貼り付け <UserForm1> === Dim myCBArray() As New Class1 '配列風にしたチェックボックス '呼出し時の処理 Private Sub UserForm_Initialize()   ReDim myCBArray(CBnum) As New Class1   ReDim CBval(CBnum) As Boolean   Dim i As Integer 'カウンタ   'クラスの変数がチェックボックスを参照できるようSetCheckBoxを呼び出す   For i = 1 To CBnum     myCBArray(i).SetCheckBox UserForm1.Controls("CheckBox" & i), i   Next End Sub '=== 標準モジュールに貼り付け <Module1> === Public Const CBnum = 20 'チェックボックスの数 Public CBval() As Boolean 'チェックボックスの値

siog
質問者

お礼

返事が送れて申し訳ありません。 おかげさまで解決しました。ありがとうございます。処理の動きは完全に把握できていないので、他の処理に応用する時にお世話になる事もあるかと思いますが宜しくお願いします。どうもありがとうございました。

その他の回答 (2)

回答No.2

こんにちは。次のようなマクロを組んでみました。 ユーザーフォーム上にチェックボックスを9個配置する。 (チェックボックスのオブジェクト名をCheckBox1~CheckBox9とする。) ・CheckBox1にチェックが入った時、CheckBox2~CheckBox9にチェックが入っていたらすべてのチェックをはずす。 ・CheckBox2~CheckBox9のどれかにチェックが入った時、CheckBox1にチェックがついていたらそのチェックをはずす。 フォームモジュールに下記のコードをコピー&ペーストする。 Private Sub CheckBox1_Click() Dim i As Integer If Me.CheckBox1.Value = True Then For i = 2 To 9 If Me.Controls("CheckBox" & i).Value = True Then Me.Controls("CheckBox" & i).Value = False Next i End If End Sub Private Sub CheckBox2_Click() If Me.CheckBox2.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox3_Click() If Me.CheckBox3.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox4_Click() If Me.CheckBox4.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox5_Click() If Me.CheckBox5.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox6_Click() If Me.CheckBox6.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox7_Click() If Me.CheckBox7.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox8_Click() If Me.CheckBox8.Value = True Then Me.CheckBox1.Value = False End Sub Private Sub CheckBox9_Click() If Me.CheckBox9.Value = True Then Me.CheckBox1.Value = False End Sub >2.フォーム上にあるCheckboxのチェックの有無を配列に入れたい。 同じモジュールシートに下記のコードを記述し、このコードを呼び出して実行させるようにしてみてはいかがでしょうか。 Sub Test Dim i as integer Dim myChk(1 to 9) as Boolean for i = 1 to 9 myChk(i) = Me.Controls("CheckBox" & i).Value next i End Sub >また、”ChkB_すべて”のクリックイベント以外は殆ど同じ処理をしているので簡略化したい。 この件に関してもマクロを呼び出して実行させるようにしてみてはいかがでしょうか。 ご不明な点等がございましたら、ご遠慮なくお知らせ下さい。

siog
質問者

お礼

返事が遅れ申し訳ありません。 サンプルを作って頂いてありがとうございます。Me.Controlsという使い方があるのを知らなかったので勉強になりました。 ただ、クラスで処理をまとめたかったのでnishi6さんの方を使う事にしました。(処理の分かり易さはこちらなんですけど) どうもありがとうございました。

回答No.1

初めまして。私でよろしければサンプルマクロを組んでみたいと思います。 ご希望の節は、貴方様のおやりになりたいことをもう少し詳しく具体的にお知らせ下さい。 お手数をおかけいたしますが、よろしくお願いいたします。

関連するQ&A