Board logo

標題: [發問] 簡化程式 [打印本頁]

作者: acdx    時間: 2013-8-12 17:33     標題: 簡化程式

我利用Userform做計算時需要選定要計算的欄位
故設定每一個section的起始欄位-"Start Row"及"End Row"
且在Critera存在時才可輸入起始欄位,當它為"N/A"時起使欄位則不可輸入
[attach]15761[/attach]
於是就寫了一長串的code
想問大家同樣的問題會怎麼寫可以比較簡化?
謝謝
'------------------------------------------
If TextBox3.Locked = True Then
    CC = 1
Else
    If TextBox5.Locked = True Then
        CC = 2
    Else
        If TextBox7.Locked = True Then
            CC = 3
        Else
            If TextBox9.Locked = True Then
                CC = 4
            Else
                If TextBox11.Locked = True Then
                    CC = 5
                End If
            End If
        End If
    End If
End If

iC = 1
Do Until iC > CC
    If iC = 1 Then
        StartRow = Val(TextBox1.Text)
        EndRow = Val(TextBox2.Text)
    End If
    If iC = 2 Then
        StartRow = Val(TextBox3.Text)
        EndRow = Val(TextBox4.Text)
    End If
    If iC = 3 Then
        StartRow = Val(TextBox5.Text)
        EndRow = Val(TextBox6.Text)
    End If
    If iC = 4 Then
        StartRow = Val(TextBox7.Text)
        EndRow = Val(TextBox8.Text)
    End If
    If iC = 5 Then
        StartRow = Val(TextBox9.Text)
        EndRow = Val(TextBox10.Text)
    End If
    If iC = 6 Then
        StartRow = Val(TextBox11.Text)
        EndRow = Val(TextBox12.Text)
    End If
中間計算程式

iC = iC + 1
Loop
'----------------------------------
作者: acdx    時間: 2013-8-12 17:37

回復 1# acdx
上面沒講清楚
我在Sub ComboBox1_Change裡有設定當ComboBox1.Value 不等於"N/A"(即C1~C5)時 TextBox才可輸入否則會被Locked
Private Sub ComboBox1_Change()
If ComboBox1.Value = "N/A" Then
    TextBox1.Locked = True
    TextBox2.Locked = True
    TextBox1.BackColor = &H8000000A
    TextBox2.BackColor = &H8000000A
Else
    TextBox1.Locked = False
    TextBox2.Locked = False
    TextBox1.BackColor = &H8000000B
    TextBox2.BackColor = &H8000000B
End If
End Sub
作者: stillfish00    時間: 2013-8-12 20:18

  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
作者: sunnyso    時間: 2013-8-13 13:13

回復 1# acdx

可以用select case來代替if  else if
作者: acdx    時間: 2013-8-14 11:45

回復 3# stillfish00
太感謝了 這種寫法是我所沒嘗試過的
另外我想設定成第一個Critera有選擇時(即ComboBox1不等於N/A)下一個ComboBox2才可以選擇
該如何寫呢?
作者: stillfish00    時間: 2013-8-14 17:15

本帖最後由 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
複製代碼
大概類似這樣,我也不是很常用。
作者: acdx    時間: 2013-8-14 18:21

回復 6# stillfish00
太感謝了
這裡讓我學到太多東西了




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