iT邦幫忙

0

VBA有難度的邏輯(office2003)

  • 分享至 

  • xImage

公司要求的功能,如連結:
http://www.2shared.com/document/g-7rzfUv/test1.html
難在分配人數的合法性檢查
請教要怎麼判斷?
謝謝!

symis iT邦新手 3 級 ‧ 2014-04-22 19:06:27 檢舉
antijava邏輯清楚,真高手也,
其實題目的原意,是總數8人不變,但A,B,C,D的人數,還是有可能會變,
我表達不好,自己再改程式囉!
再次感謝您,我猜您大概不用20分鐘就寫出來了吧!
筆記
symis提到:
A,B,C,D的人數,還是有可能會變


這個部份原程式應該有考慮到
你是改成多少後發現程式破功的呢
疑惑
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

6
海綿寶寶
iT邦大神 1 級 ‧ 2014-04-22 16:48:59
最佳解答

這邏輯不算難
只是做苦工而已

規則6的「即時檢查」有實作困難
因為
除非你能「一口氣輸入J3到J10的值」
否則
你永遠通過不了自己的檢查

<pre class="c" name="code">
Option Explicit
Const cTotalCountEmployee = 8   '員工總人數限制
Sub Main()
    If IsValid() Then
        MsgBox "檢查結果是符合規則的", vbInformation
    Else
        MsgBox "檢查結果是不符規則的", vbInformation
    End If
End Sub
Function IsValid() As Boolean
    Dim bRet As Boolean
    Dim arrType(1 To 4) '各組代號
    Dim arrMax(1 To 4)  '各組可允許最多人數
    Dim arrMin(1 To 4)  '各組可允許最少人數
    Dim arrCount(1 To 4) '各組小計人數
    Dim nI As Integer
    Dim nCountEmployee As Integer '統計總人數
    
    'Init values
    bRet = True
    nCountEmployee = 0
    arrType(1) = Range("B4").Value
    arrType(2) = Range("B5").Value
    arrType(3) = Range("B6").Value
    arrType(4) = Range("B7").Value
    
    arrMax(1) = Range("C4").Value
    arrMax(2) = Range("C5").Value + arrMax(1)
    arrMax(3) = Range("C6").Value + arrMax(1) + arrMax(2)
    arrMax(4) = Range("C7").Value + arrMax(1) + arrMax(2)
    
    arrMin(1) = 0
    arrMin(2) = 0
    arrMin(3) = Range("C6").Value
    arrMin(4) = Range("C7").Value
    
    For nI = 1 To 4
        arrCount(nI) = 0
    Next
    
    '統計各組人數
    For nI = 3 To 3 + cTotalCountEmployee - 1
        Select Case Range("J" & nI).Value
            Case arrType(1):
                arrCount(1) = arrCount(1) + 1
                nCountEmployee = nCountEmployee + 1
            Case arrType(2):
                arrCount(2) = arrCount(2) + 1
                nCountEmployee = nCountEmployee + 1
            Case arrType(3):
                arrCount(3) = arrCount(3) + 1
                nCountEmployee = nCountEmployee + 1
            Case arrType(4):
                arrCount(4) = arrCount(4) + 1
                nCountEmployee = nCountEmployee + 1
        End Select
    Next
    
    Debug.Print arrCount(1), arrCount(2), arrCount(3), arrCount(4)
    
    '檢查各項規則
    '規則1 - C4..C7 加起來等於 8
    If bRet = True Then
        If Range("C4").Value + Range("C5").Value + Range("C6").Value + Range("C7").Value = cTotalCountEmployee Then
            bRet = True
        Else
            bRet = False
        End If
    End If
    
    '規則2 - A 組
    If bRet = True Then
        If arrCount(1) >= arrMin(1) And arrCount(1) <= arrMax(1) Then bRet = True Else bRet = False
    End If
    
    '規則3 - B 組
    If bRet = True Then
        If arrCount(2) >= arrMin(2) And arrCount(2) <= arrMax(2) Then bRet = True Else bRet = False
    End If
    
    '規則4 - C 組
    If bRet = True Then
        If arrCount(3) >= arrMin(3) And arrCount(3) <= arrMax(3) Then bRet = True Else bRet = False
    End If
    
    '規則5 - D 組
    If bRet = True Then
        If arrCount(4) >= arrMin(4) And arrCount(4) <= arrMax(4) Then bRet = True Else bRet = False
    End If
    
    '規則 6 - J3..J11 加起來等於 8, 其實是判斷「是否 J3..J11 所有值都是合法值」
    If bRet = True Then
        If nCountEmployee = cTotalCountEmployee Then
            bRet = True
        Else
            bRet = False
        End If
    End If
    
    IsValid = bRet
End Function
symis iT邦新手 3 級 ‧ 2014-04-22 18:18:38 檢舉

感謝antijava,
您的意思是設一個BUTTON,去call Main()嗎?
這像是好主意!
測試結果OK,只有要改A,B,C,D為大小寫均可
另一個問題是,若USER去改規定人數,程式就破功了...

symis提到:
另一個問題是,若USER去改規定人數,程式就破功了...

程式只解決「問題提到的部份」
如你所說的
要改規定人數,就是另一個問題了
汗

我要發表回答

立即登入回答