Board logo

標題: [發問] 有難度的邏輯 [打印本頁]

作者: symis    時間: 2014-4-22 12:33     標題: 有難度的邏輯

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

回復 1# symis
我只能想到這個笨方法:
E4 陣列公式:
=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),C4,"")))
向下拉

E8 陣列公式:
=SUM(E4:E5)

有錯誤時, 輸入有點麻煩:
(至少要操作兩次以上, 看準要修改的格子再修改)
總數有錯誤時, 不給警告, 以免太麻煩, 反正全部輸入完畢就ok了,
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     Dim a1, b1, c1, d1 As Integer, Rng As Range
  3.     Set Rng = Worksheets(1).Range("J3:J10")
  4.    
  5.    
  6.     If Not Intersect(Target, Rng) Is Nothing Then
  7.         [E4].FormulaArray = _
  8.                 "=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),C4,"""")))"
  9.         [E5].FormulaArray = _
  10.                 "=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),C5,"""")))"
  11.         [E6].FormulaArray = _
  12.                 "=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),C6,"""")))"
  13.         [E7].FormulaArray = _
  14.                 "=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),C7,"""")))"
  15.         [E8] = "=SUM(E4:E5)"
  16.         
  17.         If [E4] > 1 Then
  18.            MsgBox "A 最多只能有1個", vbCritical
  19.         End If
  20.         If [E5] > 2 Then
  21.            MsgBox "B 最多只能有2個", vbCritical
  22.         End If
  23.         If [E6] < 4 Then
  24.            MsgBox "C 最少要有4個", vbCritical
  25.         End If
  26.         If [E7] < 1 Then
  27.            MsgBox "D 最少要有1個", vbCritical
  28.         End If
  29.     End If
  30.    
  31. End Sub
複製代碼

作者: yen956    時間: 2014-4-22 16:20

回復 1# symis
這個方法人多時不適用(太多警告了)
作者: symis    時間: 2014-4-22 17:47

感謝yen956,但是輸入正確,為何仍有警告?

作者: yen956    時間: 2014-4-22 18:46

本帖最後由 yen956 於 2014-4-22 18:49 編輯

抱歉, 我好像有偷改你的檔案的樣子,
(兩個圖不一樣, 真抱歉, 常為了錄影而压縮原空間)
又, 所謂 陣列公式
點[E4], 在【資料編輯列】輸入公式,
不要按 Enter, 改按 Ctrl+Shift+Enter
作者: symis    時間: 2014-4-22 19:25

回復 5# yen956

您太客氣了,我試的結果一樣呢!
是不是我也把E5,E6,E7也照做有關?
查了一下,Ctrl+Shift+Enter 是陣列公式
我再研究一下好了
謝謝您!
作者: yen956    時間: 2014-4-22 20:40

回復 4# symis
把 B3:C7 剪下, 貼到 C3 就可以了, 公式已在 vba 中

有難度的邏輯(考核表).7z
http://www.mediafire.com/download/j90ni7j1evwrix5/%E6%9C%89%E9%9B%A3%E5%BA%A6%E7%9A%84%E9%82%8F%E8%BC%AF%28%E8%80%83%E6%A0%B8%E8%A1%A8%29.7z
作者: yen956    時間: 2014-4-23 08:31

本帖最後由 yen956 於 2014-4-23 08:33 編輯

回復 6# symis
如果整張工作表, 只有這四個公式:
[E4].FormulaArray = "=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),C4,"""")))"
(或許公式應改為:) "=SUM(LEN(UPPER($J$3:$J$10))-LEN(SUBSTITUTE(UPPER($J$3:$J$10),B4,"""")))"
....
再也沒有其他的公式, 則可將原VBA刪除, 改用這個試試看:
(原公式保留)
  1. Private Sub Worksheet_Calculate()
  2.     If [E4] > 1 Then
  3.        MsgBox "A 最多只能有1個", vbCritical
  4.     End If
  5.     If [E5] > 2 Then
  6.        MsgBox "B 最多只能有2個", vbCritical
  7.     End If
  8.     If [E6] < 4 Then
  9.        MsgBox "C 最少要有4個", vbCritical
  10.     End If
  11.     If [E7] < 1 Then
  12.        MsgBox "D 最少要有1個", vbCritical
  13.     End If
  14. End Sub
複製代碼
又, 原VBA有誤(不小心, 抱歉!!)
[E8] = "=SUM(E4:E5)"
應改為
[E8] = "=SUM(E4:E7)"
作者: symis    時間: 2014-4-23 17:07

大大真厲害!
幾點請教:
1. 如何讓USER若改到規定人數時,也會提示?
2. A,B,C,D輸入錯誤會提示,但仍可繼續操作,這樣USER可不理? 還是,若有錯,按掉訊息後,回復回值比較好?
3. macro3的用途是...?
作者: yen956    時間: 2014-4-25 16:40

本帖最後由 yen956 於 2014-4-25 16:44 編輯
  1. 2. A,B,C,D輸入錯誤會提示,但仍可繼續操作,這樣USER可不理? 還是,若有錯,按掉訊息後,回復回值比較好?
複製代碼
回復 9# symis
[J4:J10] 用資料→驗証→清單, 可防使用者輸入錯誤.
  1. 1. 如何讓USER若改到規定人數時,也會提示?
複製代碼
其實用【錯誤會提示】不是好方法,太多【錯誤會提示】會中斷操作
建議[E3:E8]可改用【設定格式化條件】,例如:
當 B級(即[E5]) 大於2時, [E5]就變成滿江紅(公式仍在),
但不會出現警告提示, 不會中斷操作, 如何?
  1. 3. macro3的用途是...?
複製代碼
不知macro3是指什麼?




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