プロが教えるわが家の防犯対策術!

クラスを利用すれば出来ると思うのですが、知識不足で解決出来ませんでした。

1.フォーム上にCheckboxが20個程あり,その中の”ChkB_すべて”というCheckboxがチェックされた場合、他のCheckboxのチェックを外し、その逆で”ChkB_すべて”以外のCheckboxにチェックが入った場合は”ChkB_すべて”のチェックを外すという処理をしたい。また、”ChkB_すべて”のクリックイベント以外は殆ど同じ処理をしているので簡略化したい。
2.フォーム上にあるCheckboxのチェックの有無を配列に入れたい。

Web上で見つけたクラスの処理を応用しようと思ったのですが出来ませんでした。
宜しくお願いします。

A 回答 (3件)

初めまして。

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

お手数をおかけいたしますが、よろしくお願いいたします。
    • good
    • 0

こんにちは。

次のようなマクロを組んでみました。

ユーザーフォーム上にチェックボックスを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_すべて”のクリックイベント以外は殆ど同じ処理をしているので簡略化したい。
この件に関してもマクロを呼び出して実行させるようにしてみてはいかがでしょうか。

ご不明な点等がございましたら、ご遠慮なくお知らせ下さい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/18 14:50

クラスで『擬似コントロール配列?』を作ってみました。


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 'チェックボックスの値
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/11/18 14:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!