過去ログ

                                Page     813
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼フォーム上のチェックボックス  ishy 03/2/26(水) 15:41
   ┣Re:フォーム上のチェックボックス  ichinose 03/2/26(水) 19:13
   ┃  ┗Re:フォーム上のチェックボックス  ishy 03/2/27(木) 17:33
   ┃     ┗Re:フォーム上のチェックボックス  ichinose 03/2/27(木) 21:27
   ┗Re:フォーム上のチェックボックス  Jaka 03/2/28(金) 9:32
      ┗Re:フォーム上のチェックボックス  ishy 03/2/28(金) 17:36

 ───────────────────────────────────────
 ■題名 : フォーム上のチェックボックス
 ■名前 : ishy <ishy88@hotmail.com>
 ■日付 : 03/2/26(水) 15:41
 -------------------------------------------------------------------------
   初めて投稿いたします。
不慣れな点がございましたらご指導お願いします。

現在excel97作業しております。
フォームを作成し、モジュールのコードにてフォーム上に任意の数のチェックボックスと
ラベルを作成します。
例えばcheckbox1がチェックされれば、checkbox2もチェックされる。
checkbox1のチェックがはずされれば、checkbox2もチェックがはずされる。
といったことがしたいのです。

最初から用意しているチェックボックスにはクリックイベントで
行えますが、モジュールで作成したチェックボックスは反映されません。
    Dim MyControl As Object
    Set MyControl = Controls.Item(ControlsIndex)
    Label1.Caption = MyControl.Name
    Label2.Caption = ControlsIndex
で名前や、ControlsIndexは取得できます。そのチェックボックスがONかOFFかも
判断できます。
ただ、どうしてもクリックしたときの反応ができません。
一応、 [#9952]を見て研究しましたがだめでした。

下記にチェックボックスの作り方のコードを載せます。
長いのですが、これをみてもらった方が、何をしたいかよく
わかるのではないかと思います。

もしかしたらいらない変数が混じってるかもしれません。(すいません)

UserForm1にCommandButton1とFrame1を用意します。
(コマンドボタンとフレーム1のみ最初から作成しています。)
UserForm1に貼り付けて頂ければ、機能すると思います。

ご助言、回答お待ちしております。

Option Explicit
Private chkcnt As Integer  '全体で何行(個)チェックボックスを作成したか。
Private f1Cnt(5) As Integer  'frcnt =1の時のカウントを保持
Private f2Cnt(2) As Integer  'frcnt =2の時のカウントを保持
Private f1chk As Integer
'コマンドボタン1を押下時
Private Sub CommandButton1_Click()
Dim ret As Integer
  ret = cmdAdd(1, 5, 5)    'チェックボックスとラベルを作成
  ret = chkbox(5)       '作成されたチェックボックスの一部を確認
                  '(認識はできるということです。)
End Sub

'チェックボックスとラベルを作成

Private Function cmdAdd(frcnt As Integer, lcnt As Integer, lrcnt As Integer)
            'frcnt 1か2。1なら物件2なら部屋。 lcnt 物件の件数。 lrcnt 列数
  Dim ret As Integer
  Dim cmbAdd_cnt As MSForms.Label
  Dim chkAdd_cnt As MSForms.CheckBox
  Dim frmAdd_cnt As MSForms.Frame
  Dim Cnt As Integer, rcnt As Integer
  Dim Haba As Integer, TH As Integer, TW As Integer, TT As Integer, TL As Integer
  Dim TW1 As Integer, TW2 As Integer, TW3 As Integer, TW4 As Integer
  Dim ctlName As String
  Dim fr As String
  
  TH = 20  'height
  Haba = 3
  If frcnt = 1 Then
    TL = 18  'left
    TT = 15
    chkcnt = 0
    TW1 = 150
    TW2 = 300
    TW3 = 60
    fr = "a"
  Else
    TL = 50
    TT = 15 + (TH * chkcnt) + (Haba * chkcnt)
    TW1 = 100
    TW2 = 200
    TW3 = 60
    fr = "b"
  End If
  
  '行
  For Cnt = 1 To lcnt
    'チェックボックス作成
    If frcnt = 1 Then
      f1chk = Cnt
      f1Cnt(lcnt) = Cnt  'frcnt = 1の時のカウント
      ctlName = "CheckBox" & fr & Cnt
    Else
      ctlName = "CheckBox" & fr & f1chk & Cnt
    End If
    Set chkAdd_cnt = _
      UserForm1.Frame1.Controls.Add("Forms.CheckBox.1", ctlName, True)
'      MsgBox ctlName & "は、作成されました"
    chkAdd_cnt.Value = True
    chkAdd_cnt.Left = TL - 13
    chkAdd_cnt.Top = TT
    chkcnt = chkcnt + 1
    '列
    For rcnt = 1 To lrcnt
    'ラベル作成
    If frcnt = 1 Then
      ctlName = "label" & fr & Cnt
    Else
      ctlName = "label" & fr & f1chk & Cnt
    End If
    Set cmbAdd_cnt = _
    UserForm1.Frame1.Controls.Add("Forms.Label.1", ctlName, True)
    cmbAdd_cnt.Caption = "コントロールが追加されました。" & Cnt
'      MsgBox ctlName & "は、作成されました"
    cmbAdd_cnt.Left = TL
    cmbAdd_cnt.Top = TT
    Select Case rcnt
      Case 1
        TW = TW1 'width
      Case 2
        TW = TW2
      Case 3
        TW = TW3
      Case 4
        TW = TW3
      Case 5
        TW = TW3
    End Select
    cmbAdd_cnt.Width = TW
    cmbAdd_cnt.Font.Size = 12
    cmbAdd_cnt.Height = 18
    TL = TL + TW + Haba
    '最終列は物件コードを代入。不可視
    If rcnt = lrcnt Then
      cmbAdd_cnt.Caption = ""
    Else
      cmbAdd_cnt.SpecialEffect = fmSpecialEffectSunken
      If frcnt = 1 Then
        cmbAdd_cnt.BackColor = RGB(205, 207, 176)
      Else
        cmbAdd_cnt.BackColor = RGB(229, 236, 197)
      End If
    End If
    Next rcnt
'    Stop
  If frcnt = 1 Then
    ret = cmdAdd(2, 2, 2)
    frcnt = 1
    TL = 18
  End If
  
  If frcnt = 2 Then
    TL = 50
  End If
  
  TT = 15 + (TH * chkcnt) + (Haba * chkcnt)

  Next Cnt
  
  If frcnt = 1 Then
  Set cmbAdd_cnt = Nothing
  Set chkAdd_cnt = Nothing
  'フレームの形を整える。
    UserForm1.Frame1.Left = 8
    UserForm1.Frame1.Top = 10
    UserForm1.Frame1.Width = 150 + 300 + 60 + 50
    UserForm1.Frame1.Height = 350
    UserForm1.Frame1.ScrollBars = 3
    UserForm1.Frame1.KeepScrollBarsVisible = 3
    UserForm1.Frame1.ScrollHeight = 400
    UserForm1.Frame1.ScrollWidth = 600
  End If
End Function

'作成されたチェックボックスの一部を確認(5個分。数に意味はありません)
Function chkbox(lcnt As Integer)
Dim i As Integer
  Dim nCnt  As Integer
  Dim strCtl As String
  
  For nCnt = 1 To lcnt Step 1
    strCtl = "CheckBox" & "a" & CStr(nCnt)
     If UserForm1.Controls(strCtl).Value = True Then
      MsgBox strCtl & "は、ONです"
      
    Else
      MsgBox strCtl & "は、OFFです"
    End If
  Next nCnt

End Function

以上です。宜しくお願いします。
 ───────────────────────────────────────  ■題名 : Re:フォーム上のチェックボックス  ■名前 : ichinose  ■日付 : 03/2/26(水) 19:13  -------------------------------------------------------------------------
   ▼ishy さん:
こんばんは。
見せていただいたコードで動作確認はしました。
で・・・・。
「cmdAdd」というFunctionモジュールをちゃんと理解していませんが、
以下のコードでイベントが発生しますので、イベント内をCase文等で処理を分けてください。
クラスモジュールを作成してください(既定名のClass1)。
クラスモジュール内で・・・
'======================================
Public WithEvents chkAdd_cnt As MSForms.CheckBox
Public id As Long
Public enableevent As Boolean
Private Sub chkAdd_cnt_Click()
If enableevent = True Then
  If chkAdd_cnt.Value = True Then
   mes$ = "チェックされました"
  Else
   mes$ = "チェックはずされました"
   End If
  MsgBox id & "番のチェックボックスが" & mes$
  End If
End Sub
「cmdAdd」を少し変更しました(内容全て把握してないんで少しだけです)。
'==================================================================
Private ev_chk() As New Class1
'追加データ
'==================================================================
Private Function cmdAdd(frcnt As Integer, lcnt As Integer, lrcnt As Integer)
            'frcnt 1か2。1なら物件2なら部屋。 lcnt 物件の件数。 lrcnt 列数
  Dim ret As Integer
  Dim cmbAdd_cnt As MSForms.Label
  'Dim chkAdd_cnt As MSForms.CheckBox
  '↑これ要りません
  Dim frmAdd_cnt As MSForms.Frame
  Dim Cnt As Integer, rcnt As Integer
  Dim Haba As Integer, TH As Integer, TW As Integer, TT As Integer, TL As Integer
  Dim TW1 As Integer, TW2 As Integer, TW3 As Integer, TW4 As Integer
  Dim ctlName As String
  Dim fr As String
 
  TH = 20  'height
  Haba = 3
  If frcnt = 1 Then
    TL = 18  'left
    TT = 15
    chkcnt = 0
    TW1 = 150
    TW2 = 300
    TW3 = 60
    fr = "a"
  Else
    TL = 50
    TT = 15 + (TH * chkcnt) + (Haba * chkcnt)
    TW1 = 100
    TW2 = 200
    TW3 = 60
    fr = "b"
  End If
 
  '行
  For Cnt = 1 To lcnt
    'チェックボックス作成
    If frcnt = 1 Then
      f1chk = Cnt
      f1Cnt(lcnt) = Cnt  'frcnt = 1の時のカウント
      ctlName = "CheckBox" & fr & Cnt
    Else
      ctlName = "CheckBox" & fr & f1chk & Cnt
    End If
    ReDim Preserve ev_chk(1 To chkcnt + 1)
'   必要な数だけClass1を設定します
   With ev_chk(chkcnt + 1)
    Set .chkAdd_cnt = _
      UserForm1.Frame1.Controls.Add("Forms.CheckBox.1", ctlName, True)
'      MsgBox ctlName & "は、作成されました"
    .chkAdd_cnt.Value = True
    .chkAdd_cnt.Left = TL - 13
    .chkAdd_cnt.Top = TT
    .id = chkcnt + 1
    '↑どのチェックボックスかを識別するID
    .enableevent = True
    '↑Falseの時は、イベントを発生させないように制御する(自分でですよ)

    End With
    chkcnt = chkcnt + 1
    '列
    For rcnt = 1 To lrcnt
    'ラベル作成
    If frcnt = 1 Then
      ctlName = "label" & fr & Cnt
    Else
      ctlName = "label" & fr & f1chk & Cnt
    End If
    Set cmbAdd_cnt = _
    UserForm1.Frame1.Controls.Add("Forms.Label.1", ctlName, True)
    cmbAdd_cnt.Caption = "コントロールが追加されました。" & Cnt
'      MsgBox ctlName & "は、作成されました"
    cmbAdd_cnt.Left = TL
    cmbAdd_cnt.Top = TT
    Select Case rcnt
      Case 1
        TW = TW1 'width
      Case 2
        TW = TW2
      Case 3
        TW = TW3
      Case 4
        TW = TW3
      Case 5
        TW = TW3
    End Select
    cmbAdd_cnt.Width = TW
    cmbAdd_cnt.Font.Size = 12
    cmbAdd_cnt.Height = 18
    TL = TL + TW + Haba
    '最終列は物件コードを代入。不可視
    If rcnt = lrcnt Then
      cmbAdd_cnt.Caption = ""
    Else
      cmbAdd_cnt.SpecialEffect = fmSpecialEffectSunken
      If frcnt = 1 Then
        cmbAdd_cnt.BackColor = RGB(205, 207, 176)
      Else
        cmbAdd_cnt.BackColor = RGB(229, 236, 197)
      End If
    End If
    Next rcnt
'    Stop
  If frcnt = 1 Then
    ret = cmdAdd(2, 2, 2)
    frcnt = 1
    TL = 18
  End If
 
  If frcnt = 2 Then
    TL = 50
  End If
 
  TT = 15 + (TH * chkcnt) + (Haba * chkcnt)

  Next Cnt
 
  If frcnt = 1 Then
  Set cmbAdd_cnt = Nothing
  'Set chkAdd_cnt = Nothing
  '↑これは、取る
   'フレームの形を整える。
    UserForm1.Frame1.Left = 8
    UserForm1.Frame1.Top = 10
    UserForm1.Frame1.Width = 150 + 300 + 60 + 50
    UserForm1.Frame1.Height = 350
    UserForm1.Frame1.ScrollBars = 3
    UserForm1.Frame1.KeepScrollBarsVisible = 3
    UserForm1.Frame1.ScrollHeight = 400
    UserForm1.Frame1.ScrollWidth = 600
  End If
End Function

としてみましたが、クラス内の構成を考えてみて下さい。
 ───────────────────────────────────────  ■題名 : Re:フォーム上のチェックボックス  ■名前 : ishy <ishy88@hotmail.com>  ■日付 : 03/2/27(木) 17:33  -------------------------------------------------------------------------
   ichinoseさん
さっそくのご指導ありがとうございます。

なんかものすごくレベルが高いところの話のような気がしました。
教えてもらわなければ、絶対できなかったと思います。
おかげさまで、きっちり機能しております。

もし宜しければ、教えて頂きたいのですが、
目指しているのは一件ツリー構造に見える画面です。
一回目のループが親、二回目のループが子供を作っています。
親は一行その子供は複数行(データにより異なる)
親子ともに列は変りません。

親のチェックボタンが外れれば、子供のチェックボタンがすべて外れます。
親のチェックボタンにチェックがなくても、どれか一つでも子供にチェックがつくと、
親にも自動的にチェックがつきます。

(最終的にはチェックのついている、行を必要データとして、シートに取り込みます。)
この判断として、チェックボックスに、一意の名前(但し、
親と子の関係がわかるようにグループも判断できる)をつけようと頑張っています。

もし、洗練された名前の付け方や、名前に関係なくこの判断が行えるのなら
教えて頂けないでしょうか。
宜しくお願いします。

宜しくお願いします。
 ───────────────────────────────────────  ■題名 : Re:フォーム上のチェックボックス  ■名前 : ichinose  ■日付 : 03/2/27(木) 21:27  -------------------------------------------------------------------------
   ▼ishy さん:
こんばんは。
>親のチェックボタンが外れれば、子供のチェックボタンがすべて外れます。
>親のチェックボタンにチェックがなくても、どれか一つでも子供にチェックがつくと、
>親にも自動的にチェックがつきます。
そうでしたね。これがしたいんでしたっけ・・・。
クラスモジュールを次のように変更してください。
'====================================================
  Public WithEvents chkAdd_cnt As MSForms.CheckBox
  Public id As Long
  Public frcnt As Integer
  Public f1chk As Integer
  Public cnt As Integer
'  上3つの変数は ishy さんが宣言した変数と同じ意味です 
  Public enableevent As Boolean
'======================================================
Private Sub chkAdd_cnt_Click()
  If enableevent = True Then
    call UserForm1.chk_value(id)
'   当該ユーザーフォーム名で・・・   
    End If
End Sub
フォームモジュールは・・・
'=====================================================
Option Explicit
Private ev_chk() As New Class1
Private chkcnt As Integer  '全体で何行(個)チェックボックスを作成したか。
'Private f1Cnt(5) As Integer  'frcnt =1の時のカウントを保持
'Private f2Cnt(2) As Integer  'frcnt =2の時のカウントを保持
'上2つは、要りません
Private f1chk As Integer
'コマンドボタン1を押下時
'=============================================================
Private Sub CommandButton1_Click()
Dim ret As Integer
  ret = cmdAdd(1, 5, 5)    'チェックボックスとラベルを作成
  ret = chkbox(5)       '作成されたチェックボックスの一部を確認
                 '(認識はできるということです。)
End Sub
'=====================================================================
'チェックボックスとラベルを作成

Private Function cmdAdd(frcnt As Integer, lcnt As Integer, lrcnt As Integer)
            'frcnt 1か2。1なら物件2なら部屋。 lcnt 物件の件数。 lrcnt 列数
  Dim ret As Integer
  Dim cmbAdd_cnt As MSForms.Label
  'Dim chkAdd_cnt As MSForms.CheckBox
  Dim frmAdd_cnt As MSForms.Frame
  Dim cnt As Integer, rcnt As Integer
  Dim Haba As Integer, TH As Integer, TW As Integer, TT As Integer, TL As Integer
  Dim TW1 As Integer, TW2 As Integer, TW3 As Integer, TW4 As Integer
  Dim ctlName As String
  Dim fr As String
 
  TH = 20  'height
  Haba = 3
  If frcnt = 1 Then
    TL = 18  'left
    TT = 15
    chkcnt = 0
    TW1 = 150
    TW2 = 300
    TW3 = 60
    fr = "a"
  Else
    TL = 50
    TT = 15 + (TH * chkcnt) + (Haba * chkcnt)
    TW1 = 100
    TW2 = 200
    TW3 = 60
    fr = "b"
  End If
 
  '行
  For cnt = 1 To lcnt
    'チェックボックス作成
    If frcnt = 1 Then
      f1chk = cnt
      'f1Cnt(lcnt) = cnt  'frcnt = 1の時のカウント
      ctlName = "CheckBox" & fr & cnt
    Else
      ctlName = "CheckBox" & fr & f1chk & cnt
    End If
    ReDim Preserve ev_chk(1 To chkcnt + 1)
    With ev_chk(chkcnt + 1)
    Set .chkAdd_cnt = _
      UserForm1.Frame1.Controls.Add("Forms.CheckBox.1", ctlName, True)
'      MsgBox ctlName & "は、作成されました"
    .chkAdd_cnt.Value = True
    .chkAdd_cnt.Left = TL - 13
    .chkAdd_cnt.Top = TT
    .id = chkcnt + 1
    .frcnt = frcnt
    If frcnt = 1 Then
      .f1chk = cnt
      .cnt = 0
    Else
      .f1chk = f1chk
      .cnt = cnt
      End If
    .enableevent = True
    End With
    chkcnt = chkcnt + 1
    '列
    For rcnt = 1 To lrcnt
    'ラベル作成
    If frcnt = 1 Then
      ctlName = "label" & fr & cnt
    Else
      ctlName = "label" & fr & f1chk & cnt
    End If
    Set cmbAdd_cnt = _
    UserForm1.Frame1.Controls.Add("Forms.Label.1", ctlName, True)
    cmbAdd_cnt.Caption = "コントロールが追加されました。" & cnt
'      MsgBox ctlName & "は、作成されました"
    cmbAdd_cnt.Left = TL
    cmbAdd_cnt.Top = TT
    Select Case rcnt
      Case 1
        TW = TW1 'width
      Case 2
        TW = TW2
      Case 3
        TW = TW3
      Case 4
        TW = TW3
      Case 5
        TW = TW3
    End Select
    cmbAdd_cnt.Width = TW
    cmbAdd_cnt.Font.Size = 12
    cmbAdd_cnt.Height = 18
    TL = TL + TW + Haba
    '最終列は物件コードを代入。不可視
    If rcnt = lrcnt Then
      cmbAdd_cnt.Caption = ""
    Else
      cmbAdd_cnt.SpecialEffect = fmSpecialEffectSunken
      If frcnt = 1 Then
        cmbAdd_cnt.BackColor = RGB(205, 207, 176)
      Else
        cmbAdd_cnt.BackColor = RGB(229, 236, 197)
      End If
    End If
    Next rcnt
'    Stop
  If frcnt = 1 Then
    ret = cmdAdd(2, 2, 2)
    frcnt = 1
    TL = 18
  End If
 
  If frcnt = 2 Then
    TL = 50
  End If
 
  TT = 15 + (TH * chkcnt) + (Haba * chkcnt)

  Next cnt
 
  If frcnt = 1 Then
  Set cmbAdd_cnt = Nothing
  'Set chkAdd_cnt = Nothing
  'フレームの形を整える。
    UserForm1.Frame1.Left = 8
    UserForm1.Frame1.Top = 10
    UserForm1.Frame1.Width = 150 + 300 + 60 + 50
    UserForm1.Frame1.Height = 350
    UserForm1.Frame1.ScrollBars = 3
    UserForm1.Frame1.KeepScrollBarsVisible = 3
    UserForm1.Frame1.ScrollHeight = 400
    UserForm1.Frame1.ScrollWidth = 600
  End If
End Function
'===============================================================
'作成されたチェックボックスの一部を確認(5個分。数に意味はありません)
Function chkbox(lcnt As Integer)
Dim i As Integer
  Dim nCnt  As Integer
  Dim strCtl As String
 
  For nCnt = 1 To lcnt Step 1
    strCtl = "CheckBox" & "a" & CStr(nCnt)
     If UserForm1.Controls(strCtl).Value = True Then
      MsgBox strCtl & "は、ONです"
   
    Else
      MsgBox strCtl & "は、OFFです"
    End If
  Next nCnt

End Function
'================================================================
'このプロシジャーでチェックボックスのValueプロパティを制御しています
Sub chk_value(id As Long)
  Dim idx As Long
  Dim ans As Boolean
  ans = ev_chk(id).chkAdd_cnt.Value
  If ev_chk(id).frcnt = 1 Then
    For idx = LBound(ev_chk()) To UBound(ev_chk())
     With ev_chk(idx)
      If ev_chk(id).f1chk = .f1chk Then
       .enableevent = False
       .chkAdd_cnt.Value = ans
       .enableevent = True
       End If
      End With
     Next idx
  Else
    If ans = True Then
     For idx = LBound(ev_chk()) To UBound(ev_chk())
      With ev_chk(idx)
       If ev_chk(id).f1chk = .f1chk And .cnt = 0 Then
         .enableevent = False
         .chkAdd_cnt.Value = ans
         .enableevent = True
         End If
       End With
      Next idx
     End If
    End If
End Sub

以上ですが、Class1というオブジェクトが強度の弱い、結合度の大きいものになってしまいましたが、Excel2000ですが、動作確認はしました。
試してみて下さい。


>目指しているのは一件ツリー構造に見える画面です。
>一回目のループが親、二回目のループが子供を作っています。
>親は一行その子供は複数行(データにより異なる)
>親子ともに列は変りません。

ところで、この「cmdAdd」Functionプロシジャーで再帰ロジックになっていますが、
この先、ツリー構造が深くなっていってもいいようにという拡張性からですか?
(でも、その時は、中のロジックも大きく変更しなければなりませんよね)
本日も花粉症がひどく、代替コードを載せられませんが、普通のループのネストでいけそうに思えるんですが・・・。
 ───────────────────────────────────────  ■題名 : Re:フォーム上のチェックボックス  ■名前 : Jaka  ■日付 : 03/2/28(金) 9:32  -------------------------------------------------------------------------
   ishyさん ichinoseさん おはようございます。。
ishyさんへの直接回答ではありません。
私は、ichinose師匠様の様に高度な脳みそを持ち合わせていないので、ishyさんのコードを解析できませんでした。
で、参考になと思えない自己満足出展と言う事で..。
(作っちゃったから)
Object名の1部に連番を使っています。


Class1モジュール

Public WithEvents ChecEvent As MSForms.CheckBox
Public WithEvents ButnEvent As MSForms.CommandButton

Private Sub ButnEvent_Click()
  Dim ctobj As Object
  With ButnEvent
     MsgBox ButnEvent.Caption
    If ButnEvent.Caption = "終 了" Then
      Unload UserForm1
      End
    Else
      For Each ctobj In UserForm1.Controls
       If TypeName(ctobj) = "CheckBox" And _
         ctobj.Value = True Then
         MsgBox ctobj.Caption & " は、" & ctobj.Value
       End If
      Next
    End If
  End With
End Sub

Private Sub ChecEvent_Click()
  Dim MC As Long
  With ChecEvent
     MC = Application.Substitute(UserForm1.ActiveControl.Name, "MCheckBox", "")
     If MC <> 10 Then  'MTBC
      Application.EnableEvents = False
      If UserForm1.Controls("MCheckBox" & MC) = True Then
        UserForm1.Controls("MCheckBox" & MC + 1) = True
      Else
        UserForm1.Controls("MCheckBox" & MC + 1) = False
      End If
      Application.EnableEvents = True
     End If
  End With
End Sub


Form1モジュール

Dim ChecCls() As New Class1
Dim ButnCls() As New Class1
Dim i As Long, J As Long, N As Long, CCnt As Long
Dim ボタン位置高 As Single, 実行ボタン位置横 As Long
Const 行間隔 = 16, ボタン基準値 = 50
Const チェック標準数 = 5

Private Sub UserForm_Initialize()
  N = 0: J = 5
  Me.Width = 240
  Me.Caption = "シート削除"
  Me.Height = 140.25
  ボタン位置高 = Me.Height - ボタン基準値
  実行ボタン位置横 = 135
  For i = 1 To 10
    If N = J Then
      N = 0
    End If
    N = N + 1
    CCnt = CCnt + 1
    ReDim Preserve ChecCls(1 To CCnt)
    Set ChecCls(CCnt).ChecEvent = Me.Controls.Add("Forms.CheckBox.1", "MCheckBox" & i)
    
    With Me.Controls("MCheckBox" & i)
      If i <= J Then
       .Left = 15
      ElseIf i <= J * 2 Then
       .Left = 120
      ElseIf i <= J * 3 Then
       .Left = 225
      Else
       .Left = 325
      End If
      If N = 1 Then
       .Top = 0
      Else
       .Top = N * 行間隔 - 行間隔
      End If
      .Height = 行間隔
      .Caption = "チェックボックス" & i
    End With
  Next
  
  FMCNT = 0
  For i = 1 To 2
    CCnt = CCnt + 1
    ReDim Preserve ButnCls(1 To CCnt)
    If i = 1 Then
      ButtnN = "終了ボタン"
    Else
      ButtnN = "実行ボタン"
    End If
    Set ButnCls(CCnt).ButnEvent = Me.Controls.Add("Forms.CommandButton.1", ButtnN)
    If i = 1 Then
      With Me.Controls(ButtnN)
        .Caption = "終 了"
        .Width = 75
        .Top = ボタン位置高
        .Left = 25
        .SetFocus
      End With
    Else
      With Me.Controls(ButtnN)
        .Caption = "実行処理"
        .Width = 75
        .Top = ボタン位置高
        .Left = 実行ボタン位置横  '135
      End With
    End If
  Next
End Sub
 ───────────────────────────────────────  ■題名 : Re:フォーム上のチェックボックス  ■名前 : ishy <ishy88@hotmail.com>  ■日付 : 03/2/28(金) 17:36  -------------------------------------------------------------------------
   ichinoseさん jakaさんありがとうございます。
ichinoseさん花粉症大丈夫ですか?

私の気持ち先行型のコードなんでわかりにくかったと思います。

ichinoseさんに教えていただいたコードを実際に
97のSR2に貼り付けた所、見事私が考えていたことができました。

おっしゃられた通り再帰処理になっています。
特に理由はなく、ちょっと再帰処理にしてみたかっただけです。
コンピューターに余分な力を使わせてしまうのでしょうか?

ループのネストに直します。
修正したものも見ていただきたかったのですが、
今日は内容の仕様変更があったのでそれに追われてしまいました。

正直、すぐに内容を理解して、ぱっと書き直すほど
できる人間ではないのです。
すいません。ですので
とりあえずお礼にお返事を、と思い先に投稿します。

jakaさんに教えていただいた方も前述の理由で
まだ解読できていません。

解読してからまた投稿いたします。
とても拙い問に迅速に回答をいただき感謝しております。
ありがとうございました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 813