返回列表 上一主題 發帖

[發問] 簡化程式

  1.   Dim myControl(1 To 6, 1 To 3) As Control
  2.   
  3.   '設定控制項陣列
  4.   For i = 1 To UBound(myControl)
  5.     Set myControl(i, 1) = Controls("ComboBox" & i)
  6.     Set myControl(i, 2) = Controls("TextBox" & 2 * i - 1)
  7.     Set myControl(i, 3) = Controls("TextBox" & 2 * i)
  8.   Next
  9.   
  10.   For iC = 1 To UBound(myControl)
  11.     If myControl(iC, 2).Locked Then Exit For
  12.    
  13.     StartRow = Val(myControl(iC, 2).Value)
  14.     EndRow = Val(myControl(iC, 3).Value)
  15.    
  16.     '中間計算程式
  17.   Next
複製代碼
回復 1# acdx

TOP

本帖最後由 stillfish00 於 2013-8-14 17:25 編輯

回復 5# acdx
簡單的做法就是在你2#的Change事件中判斷就可以了,因為你只有6個ComboBox還算少,只要寫6個ComboBoxN_Change()就好了。

若是數十、數百個控制項,事件執行動作類似,可考慮用物件類別模組(較複雜)去定義共通的事件:
新增一物件類別模組,命名為clsComboBoxMyEvents
  1. Public WithEvents myComboBox As MSForms.ComboBox
  2. Private cbForLock As MSForms.ComboBox

  3. Public Sub setObject(ByRef ctl As MSForms.ComboBox)
  4.   Set myComboBox = ctl
  5. End Sub

  6. Public Sub setLinkForLock(ByRef ctl As MSForms.ComboBox)
  7.   Set cbForLock = ctl
  8. End Sub

  9. Private Sub myComboBox_Change()
  10.   If cbForLock Is Nothing Then Exit Sub
  11.   
  12.   If myComboBox.Value = "N/A" Then
  13.     cbForLock.Enabled = False
  14.   Else
  15.     cbForLock.Enabled = True
  16.   End If
  17. End Sub
複製代碼
你的表單:
  1. Private Const COMBOBOX_COUNT = 6
  2. Dim myCombo(1 To COMBOBOX_COUNT) As clsComboBoxMyEvents

  3. Private Sub UserForm_Initialize()

  4.   '............................
  5.   
  6.   '加上下面這段
  7.   For i = 1 To COMBOBOX_COUNT
  8.     Set myCombo(i) = New clsComboBoxMyEvents
  9.     myCombo(i).setObject Controls("ComboBox" & i)
  10.     If i < COMBOBOX_COUNT Then myCombo(i).setLinkForLock Controls("ComboBox" & i + 1)
  11.   Next i
  12. End Sub
複製代碼
大概類似這樣,我也不是很常用。

TOP

        靜思自在 : 為人處世要小心細心,但不要「小心眼」。
返回列表 上一主題