Board logo

標題: [發問] 請教 關於 程式開頭 的相關疑惑(承接 CheckBox 核選問題) [打印本頁]

作者: mark15jill    時間: 2012-10-17 15:56     標題: 關於Checkbox核選判斷

已設 10 * 10 個 Checkbox 控制項
想請問  如何隨機核選時 在Label1.Caption  出現該控制項之Caption 內容。
  1. Private Sub CommandButton1_Click()
  2.     Dim mycheckbox1 As MSForms.CheckBox
  3.     For kk = 1 To 100
  4.         Cells(kk, 1) = "王" & kk
  5.     Next kk
  6.          Columns("c:c").Clear
  7.           Columns("c:c").Select
  8.         Selection.ColumnWidth = 15
  9.    
  10.         For sjy = 1 To 450 Step 45

  11.             For sja = 1 To 900 Step 90
  12.                 Set mycheckbox1 = UserForm1.Frame1.Controls.Add("forms.checkbox.1")
  13.                 With mycheckbox1
  14.                     .Left = 10 + sja
  15.                     .Top = 10 + sjy
  16.                     .Width = 70
  17.                     .Height = 20
  18.                     .TextAlign = fmTextAlignCenter
  19.                     .BackColor = &HFFFFC0
  20.                     .Caption = .Name
  21.                 End With
  22.             Next
  23.         Next
  24.     Dim ct As Control

  25.     r = 1
  26.     For Each ct In Controls
  27.     If TypeName(ct.Object) = "ICheckboxControl" Then ct.Caption = Cells(r, 1): Cells(r, 2) = ct.Name
  28.         Cells(r, 3) = ct.Name: r = r + 1
  29.     Next
  30.      aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count
  31.     For hh = 1 To aois
  32.         For kh = 1 To aois
  33.             If Cells(hh, 3) <> "" Then
  34.                 If Mid(Cells(hh, 3), 1, 8) <> "CheckBox" Then
  35.                     Range("c" & hh).Select
  36.                     Selection.Delete Shift:=xlUp
  37.                
  38.                 End If
  39.             End If
  40.         Next
  41.     Next
  42.         
  43.    
  44.     Cells(1, 3).Select
  45. End Sub
複製代碼
[attach]12804[/attach]
作者: GBKEE    時間: 2012-10-17 16:56

本帖最後由 GBKEE 於 2012-10-18 09:15 編輯

回復 1# mark15jill
使用物件類別 試試看
  1. Dim TheCheck() As New Class1  '動態陣列 宣告為新的Class1物件類別物件
  2. Private Sub CommandButton1_Click()
  3.     Dim mycheckbox1 As MSForms.CheckBox
  4.     Dim Sh As Worksheet
  5.      Set Sh = ActiveSheet   
  6.     Sh.Columns("c:c").Clear
  7.     Sh.Columns("c:c").ColumnWidth = 15
  8.     kk = 1
  9.     For sjy = 1 To 450 Step 45
  10.         For sja = 1 To 900 Step 90
  11.             With Frame1.Controls.Add("forms.checkbox.1")
  12.                 Sh.Cells(kk, 1) = "王" & kk
  13.                 Sh.Cells(kk, 3) = .Name
  14.                 .Left = 10 + sja
  15.                 .Top = 10 + sjy
  16.                 .Width = 70
  17.                 .Height = 20
  18.                 .TextAlign = fmTextAlignCenter
  19.                 .BackColor = &HFFFFC0
  20.                 .Caption = Sh.Cells(kk, 1)
  21.                 ReDim Preserve TheCheck(0 To kk - 1)              '重新配置 動態陣列
  22.                 Set TheCheck(kk - 1).xlCheckbox = Controls(.Name)
  23.                 '動態陣列的元素 指定到物件模組內的物件
  24.             End With
  25.             kk = kk + 1
  26.         Next
  27.     Next
  28. End Sub
複製代碼
  1. 'VBA插入 物件類別模組 自動命名為Class1 的程式碼
  2. Option Explicit
  3. Public WithEvents xlCheckbox As MSForms.CheckBox
  4. Private Sub xlcheckbox_Click()
  5.     If xlCheckbox = True Then UserForm1.Label1.Caption = xlCheckbox.Caption
  6. End Sub
複製代碼

作者: mark15jill    時間: 2012-10-18 08:50

回復 2# GBKEE

大大 謝謝您的解答。
但出現  ReDim Preserve TheCheck(0 To         變數未定義
作者: GBKEE    時間: 2012-10-18 09:18

回復 3# mark15jill
你附檔模組 沒加上  Option Explicit  所以我測試時是沒問題
依你的能力,是可以試著修改的
2#
  1. Private Sub CommandButton1_Click()
  2.     Dim mycheckbox1 As MSForms.CheckBox
  3.     Dim Sh As Worksheet
  4.     Set Sh = ActiveSheet ' **少了這程式碼請加入 **
複製代碼

作者: mark15jill    時間: 2012-10-18 10:09

回復 4# GBKEE

抱歉 讓大大您見笑了~
因最近  VB2010 和 VBA 同時用到
有些語法 語串 導致常常會混亂
如 同一事件 兩邊的語法可能就有差異
有試著修正  但跑出來的成果不盡理想

再次感謝大大的耐心解說
作者: mark15jill    時間: 2012-10-18 15:23     標題: RE: 關於Checkbox核選判斷 [已解決]

感謝 GBKEE  的指教
有找到方法去判別..
  1. Private Sub CommandButton1_Click()
  2.     Dim mycheckbox1 As MSForms.CheckBox
  3.           Columns("a:c").Clear
  4.           Columns("a:c").Select
  5.     For kk = 1 To 100

  6.         Cells(kk, 1) = "王" & kk
  7.          
  8.     Next kk

  9.      aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count

  10.         Selection.ColumnWidth = 15

  11.    
  12.         For sjy = 1 To 450 Step 45


  13.             For sja = 1 To 900 Step 90

  14.                 Set mycheckbox1 = UserForm1.Frame1.Controls.Add("forms.checkbox.1")

  15.                 With mycheckbox1

  16.                     .Left = 10 + sja

  17.                     .Top = 10 + sjy

  18.                     .Width = 70

  19.                     .Height = 20

  20.                     .TextAlign = fmTextAlignCenter

  21.                     .BackColor = &HFFFFC0

  22.                     .Caption = .Name

  23.                 End With

  24.             Next

  25.         Next

  26.     Dim ct As Control

  27.     r = 1

  28.     For Each ct In Controls

  29.     If TypeName(ct.Object) = "ICheckboxControl" Then ct.Caption = Cells(r, 1): Cells(r, 2) = ct.Name

  30.         Cells(r, 3) = ct.Name: r = r + 1

  31.     Next
  32.       aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count
  33.     For hh = 1 To aois

  34.         For kh = 1 To aois

  35.             If Cells(hh, 3) <> "" Then

  36.                 If Mid(Cells(hh, 3), 1, 8) <> "CheckBox" Then

  37.                     Range("c" & hh).Select

  38.                     Selection.Delete Shift:=xlUp

  39.                
  40.                 End If

  41.             End If

  42.         Next

  43.     Next
  44.      
  45.     Cells(1, 3).Select


  46. End Sub
複製代碼

Private Sub CommandButton2_Click()
     Dim mycheckbox1 As MSForms.CheckBox
     aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count
     For gosj = 1 To aois
        With Controls("Checkbox" & gosj)
            If .Value = True Then
                Label1.Caption = "現在核選:" & .Name
            
            End If
        End With
     Next
End Sub

作者: mark15jill    時間: 2012-10-19 09:20     標題: 請教 關於 程式開頭 的相關疑惑(承接 CheckBox 核選問題)

想請問
一般而言
Private Sub UserForm_Initialize()
End Sub
為 初始狀態的時候的狀態~


Private Sub CommandButton1_Click()
End Sub

但如果今天是想以
Controls("Checkbox" & gosj) 為範圍
以表單自動判斷而不用 CommandButton 模式下

該怎控制什麼比較適合??
程式如下

'主程式區塊
  1. Private Sub CommandButton1_Click()


  2.     Dim mycheckbox1 As MSForms.CheckBox
  3.           Columns("a:c").Clear
  4.           Columns("a:c").Select
  5.     For kk = 1 To 100

  6.         Cells(kk, 1) = "王" & kk
  7.          
  8.     Next kk

  9.      aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count

  10.         Selection.ColumnWidth = 15

  11.    
  12.         For sjy = 1 To 450 Step 45


  13.             For sja = 1 To 900 Step 90

  14.                 Set mycheckbox1 = UserForm1.Frame1.Controls.Add("forms.checkbox.1")

  15.                 With mycheckbox1

  16.                     .Left = 10 + sja

  17.                     .Top = 10 + sjy

  18.                     .Width = 70

  19.                     .Height = 20

  20.                     .TextAlign = fmTextAlignCenter

  21.                     .BackColor = &HFFFFC0

  22.                     .Caption = .Name

  23.                 End With

  24.             Next

  25.         Next

  26.     Dim ct As Control

  27.     r = 1

  28.     For Each ct In Controls

  29.     If TypeName(ct.Object) = "ICheckboxControl" Then ct.Caption = Cells(r, 1): Cells(r, 2) = ct.Name

  30.         Cells(r, 3) = ct.Name: r = r + 1

  31.     Next
  32.       aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count
  33.     For hh = 1 To aois

  34.         For kh = 1 To aois

  35.             If Cells(hh, 3) <> "" Then

  36.                 If Mid(Cells(hh, 3), 1, 8) <> "CheckBox" Then

  37.                     Range("c" & hh).Select

  38.                     Selection.Delete Shift:=xlUp

  39.                
  40.                 End If

  41.             End If

  42.         Next

  43.     Next
  44.      
  45.     Cells(1, 3).Select

  46. End Sub
複製代碼
'需判斷區塊
  1. Private Sub CommandButton2_Click()
  2.      Dim mycheckbox1 As MSForms.CheckBox
  3.      aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count
  4.      For gosj = 1 To aois
  5.         With Controls("Checkbox" & gosj)
  6.             If .Value = True Then
  7.                 Label1.Caption = "現在核選:" & .Name
  8.             End If
  9.         End With
  10.      Next

  11. End Sub
複製代碼
有試驗過

Private Sub UserForm_Activate()

End Sub

此方式 但無反映
作者: GBKEE    時間: 2012-10-19 10:58

回復 7# mark15jill
沒附檔,只能猜猜看
主程式區塊   是UserForm中  
Private Sub CommandButton1_Click()   改成  
Private Sub UserForm_Activate()  與 Private Sub UserForm_Initialize() 是一樣的
主程式區塊   是其他模組中
  1. Private Sub CommandButton1_Click()
  2. '
  3. '

  4.   Next
  5.    Cells(1, 3).Select
  6. UserForm1.Show   
  7. End Sub     
複製代碼

作者: mark15jill    時間: 2012-10-19 11:09

回復 8# GBKEE

抱歉 小弟說的不清楚~
再次說明小弟 的疑惑點~
如上面程式所示,目前是利用CommandButton2 作為觸發點(即 點CommandButton2  , Label1.Caption   才會顯示目前核選之Checkbox 的 Caption值 )  
若以UserForm_Active  為首的話,勢必會產生錯誤(因尚未 產生 10*10 個 Checkbox控制項 )

疑惑點如下
1.若想在 10*10 個 Checkbox控制項  產生後,點選任一 Checkbox ,產生效果如同原始 CommandButton2 之效果相同,但不用透過 CommandButton 控制,該用何者方式描寫比較適當。
2.若核選為複選,該如何判斷?
作者: mark15jill    時間: 2012-10-19 11:13

本帖最後由 mark15jill 於 2012-10-19 11:15 編輯

回復 8# GBKEE
  1. Private Sub CommandButton2_Click()

  2.      Dim mycheckbox1 As MSForms.CheckBox

  3.      aois = ActiveSheet.Range("c1").CurrentRegion.Rows.Count

  4.      For gosj = 1 To aois

  5.         With Controls("Checkbox" & gosj)

  6.             If .Value = True Then

  7.                 Label1.Caption = "現在核選:" & .Name

  8.             End If

  9.         End With

  10.      Next


  11. End Sub
複製代碼

作者: GBKEE    時間: 2012-10-19 12:09

本帖最後由 GBKEE 於 2012-10-19 12:13 編輯

回復 9# mark15jill
CommandButton2 改為UserForm_Click (UserForm_Active 只有表單顯示時才有的  )   將Label1.Caption  顯示目前核選之Checkbox 的  
可也是可以 條件是已有產生 10*10 個 Checkbox控制項

點選任一 Checkbox ,產生效果如同原始 CommandButton2 之效果相同
2#  使用物件類別  2# Private Sub CommandButton1_Click() 名稱 改成
Private Sub UserForm_Activate()  或是 Private Sub UserForm_Initialize()  皆可以
  1. 'VBA插入 物件類別模組 自動命名為Class1 的程式碼
  2. Option Explicit
  3. Public WithEvents xlCheckbox As MSForms.Checkbox
  4. Private Sub xlcheckbox_Click()
  5.     '    If xlCheckbox = True Then UserForm1.Label1.Caption = "現在核選:" & xlCheckbox.Name
  6.     複選
  7. End Sub
  8. Private Sub 複選()
  9.     Dim xlCcaptionas As String, E As MSForms.Control
  10.     With UserForm1
  11.         For Each E In .Controls
  12.             If InStr(UCase(E.Name), UCase("checkbox")) Then
  13.                 If E.Value = True Then xlCcaptionas = IIf(xlCcaptionas = "", E.Name, xlCcaptionas & "," & E.Name)
  14.             End If
  15.         Next
  16.         If xlCcaptionas <> "" Then
  17.             .Label1.Caption = "現在核選:" & xlCcaptionas
  18.         Else
  19.             .Label1.Caption = ""
  20.         End If
  21.     End With
  22. End Sub
複製代碼

作者: mark15jill    時間: 2012-10-19 13:39

大大您好
小弟的版本2010 似乎會有些問題產生~(如 CLASS)
作者: GBKEE    時間: 2012-10-19 13:57

回復 12# mark15jill
見笑了 2010 尚未摸過
2003 如圖


[attach]12830[/attach]
作者: mark15jill    時間: 2012-10-19 14:34

回復 13# GBKEE


    測試成功
感謝大大~
抱歉 小弟資質愚昧~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)