Board logo

標題: [發問] 加總問題 [打印本頁]

作者: donod    時間: 2013-10-25 13:15     標題: 加總問題

請教大大加總問題,見附件如何改寫VBA,謝謝!
[attach]16477[/attach]
作者: luhpro    時間: 2013-10-26 01:01

本帖最後由 luhpro 於 2013-10-26 01:02 編輯

回復 1# donod
  1. Sub nn()
  2.   Dim iCol%, iCols%, iNum%, iIdx%
  3.   Dim lRow&, lRows&, lSum&(0 To 1)
  4.   Dim bColor As Boolean, bChk(0 To 1) As Boolean
  5.   
  6.   lSum(0) = 0
  7.   lSum(1) = 0
  8.   For lRow = 9 To 11
  9.     bChk(0) = False
  10.     bChk(1) = False
  11.     For iCol = 2 To 18
  12.       With Cells(lRow, iCol)
  13.         If Not .Value = "" Then ' 無數字不處理
  14.           If .Interior.ColorIndex = 43 Then bColor = True Else bColor = False
  15.           iIdx = -bColor ' 0 無色格, 1 綠色格
  16.           If Left(.Value, 1) = "[" Then
  17.             iNum = Val(Mid(.Value, 2, Len(.Value) - 2))
  18.             If iNum >= Cells(5, 2 + iIdx * 2) Then
  19.               lSum(iIdx) = lSum(iIdx) + Cells(5, 2 + iIdx * 2)
  20.               bChk(iIdx) = True
  21.             ElseIf iNum <= Cells(5, 3 + iIdx * 2) Then
  22.               lSum(iIdx) = lSum(iIdx) + Cells(5, 3 + iIdx * 2)
  23.               bChk(iIdx) = True
  24.             Else
  25.               lSum(iIdx) = lSum(iIdx) + iNum
  26.             End If
  27.           Else
  28.             If Not bChk(iIdx) Then lSum(iIdx) = lSum(iIdx) + .Value
  29.           End If
  30.         End If
  31.       End With
  32.     Next iCol
  33.   Next lRow
  34.   MsgBox "綠色格總數為 : " & lSum(1) & Chr(10) & Chr(10) & Chr(10) & "無色格總數為 : " & lSum(0)
  35. End Sub
複製代碼

作者: donod    時間: 2013-10-26 12:31

本帖最後由 donod 於 2013-10-26 12:33 編輯

回復 2# luhpro
謝謝大大!還是不行,例子中...
綠色格總數應該為 : -158
無色格總數應該為 : 45
[attach]16479[/attach]
作者: luhpro    時間: 2013-10-29 23:46

本帖最後由 luhpro 於 2013-10-29 23:49 編輯

回復 3# donod
原式有些地方沒考慮週到, 我又修改了一下:
  1. Sub nn()
  2.   Dim iCol%, iCols%, iNum%, iIdx%
  3.   Dim lRow&, lRows&, lSum&(0 To 1)
  4.   Dim bChk(0 To 1) As Boolean

  5.   lSum(0) = 0
  6.   lSum(1) = 0
  7.   For lRow = 9 To 11
  8.     bChk(0) = False
  9.     bChk(1) = False
  10.     For iCol = 2 To 18
  11.       With Cells(lRow, iCol)
  12.         If Not .Value = "" Then ' 無數字不處理
  13.           iIdx = IIf(.Interior.ColorIndex = 43, 1, 0)
  14.           If Left(.Value, 1) = "[" Then
  15.             iNum = Val(Mid(.Value, 2, Len(.Value) - 2))
  16.           Else
  17.             If bChk(iIdx) Then iNum = 0 Else iNum = Val(.Value)
  18.           End If
  19.           If iNum >= Cells(5, 2 + iIdx * 2) Then
  20.             lSum(iIdx) = lSum(iIdx) + Cells(5, 2 + iIdx * 2)
  21.             bChk(iIdx) = True
  22.           ElseIf iNum <= Cells(5, 3 + iIdx * 2) Then
  23.             lSum(iIdx) = lSum(iIdx) + Cells(5, 3 + iIdx * 2)
  24.             bChk(iIdx) = True
  25.           Else
  26.             lSum(iIdx) = lSum(iIdx) + iNum
  27.           End If
  28.         End If
  29.       End With
  30.     Next iCol
  31.   Next lRow
  32.   MsgBox "綠色格總數為 : " & lSum(1) & Chr(10) & Chr(10) & Chr(10) & "無色格總數為 : " & lSum(0)
  33. End Sub
複製代碼
不過計算出來的結果與你的不同,
是我對條件的敘述有誤解嗎?
以綠色格為例: (底下略過非綠色格或空值格)
第 1 行 - ( D5=33 , E5=-91 )
※ C9=[-100] 和=-91 (條件5 - 如果綠色格內有[]的數值<=E5,只當E5的值,不需計算其右邊無[]的數值, 觸發)
※ D9=33     (條件5 - 略過)
※ G9=[35]   和=-91+33=-58 (條件4 - 如果綠色格內有[]的數值>=D5,只當D5的值,不需計算其右邊無[]的數值)
※ H9=-110   (條件5 - 略過)
※ I9=[32]   和=-58+32=-26 (條件2)
※ J9=-102   (條件5 - 略過)

第 2 行 -
※ F10=[-27] 和=-26+-27=-53 (條件2)
※ G10=135   和=-53+33=-20 (條件4, 觸發)
※ M10=[-30] 和=-20+-30=-50 (條件2)
※ N10=-2    (條件4 - 略過)

第 3 行 -
※ B11=[-61]  和=-50+-61=-111 (條件2)
※ C11=-60    和=-111+-60=-171 (條件2)
※ O11=[-9]   和=-171+-9=-180 (條件2)
※ P11=20     和=-180+20=-160 (條件2)

我算出來的結果是 :  -160 與 -56
作者: donod    時間: 2013-10-30 00:35

回復 4# luhpro
再謝謝大大指教!
條件2:如果綠色格內的數值<D5及>E5,只當格內的值
是指沒有[ ]的數值,不包括有[ ]的數值。
作者: luhpro    時間: 2013-10-30 21:39

回復  luhpro
再謝謝大大指教!
條件2:如果綠色格內的數值E5,只當格內的值
是指沒有[ ]的數值,不包括有 ...
donod 發表於 2013-10-30 00:35

那就只要改第 27 行的 :
lSum(iIdx) = lSum(iIdx) + iNum

If Left(.Value, 1) <> "[" Then lSum(iIdx) = lSum(iIdx) + iNum
即可.

不過算出來的答案是 -65 與 -1 還是與你的不同.

計算過程如下:
第 1 行 - ( D5=33 , E5=-91 )
※ C9=[-100] 和=-91 (條件5 - 如果綠色格內有[]的數值<=E5,只當E5的值,不需計算其右邊無[]的數值, 觸發)
※ D9=33     (條件5 - 略過)
※ G9=[35]   和=-91+33=-58 (條件4 - 如果綠色格內有[]的數值>=D5,只當D5的值,不需計算其右邊無[]的數值)
※ H9=-110   (條件5 - 略過)
※ I9=[32]   (條件2 - 有[]要略過)
※ J9=-102   (條件5 - 略過)

第 2 行 -
※ F10=[-27] (條件2 - 有[]要略過)
※ G10=135   和=-58+33=-25 (條件4, 觸發)
※ M10=[-30] (條件2 - 有[]要略過)
※ N10=-2    (條件4 - 略過)

第 3 行 -
※ B11=[-61]  (條件2 - 有[]要略過)
※ C11=-60    和=-25+-60=-85 (條件2)
※ O11=[-9]   (條件2 - 有[]要略過)
※ P11=20     和=-85+20=-65 (條件2)
作者: donod    時間: 2013-10-31 00:26

回復 6# luhpro
再謝謝大大指教,條件4,條件5如下:
※ M10=[-30] (條件2 - 有[]要略過)
※ N10=-2    (條件4 - 略過)
條件4:如果綠色格內有[]的數值>=D5(即>=33),只當D5的值,不需計算其右邊無[]的數值

※ I9=[32]   (條件2 - 有[]要略過)
※ J9=-102   (條件5 - 略過)
條件5:如果綠色格內有[]的數值<=E5(即<=-91),只當E5的值,不需計算其右邊無[]的數值

再請教大大,綠色,無色及兩者總和的結果,可否分別顯示在指定格內,謝謝!
作者: luhpro    時間: 2013-10-31 20:03

本帖最後由 luhpro 於 2013-10-31 20:06 編輯

回復 7# donod
※ N10=-2    (條件4 - 略過)
會註明 條件4 - 略過 是因為之前的 ※ G10=135   和=-58+33=-25 (條件4, 觸發)   觸發了條件4,
而條件4 的說明是 : 如果綠色格內有[]的數值>=D5,只當D5的值,不需計算其右邊 無[] 的數值
所以觸發此條件後, 其右邊無[]的值就不再列入計算範圍內而被直接略過了.
此條件不是這個意思的嗎?

msgbox 那一行 改為
[A1]=lSum(0)
[B1]=lSum(1)
[C1]=lSum(0)+lSum(1)
作者: donod    時間: 2013-10-31 21:35

回復  donod
※ N10=-2    (條件4 - 略過)
會註明 條件4 - 略過 是因為之前的 ※ G10=135   和=-58+33=- ...
luhpro 發表於 2013-10-31 20:03

謝謝大大回覆!
M10=[-30]
N10=-2
條件4:如果綠色格內有[]的數值>=D5(>=33),只當D5的值,不需計算其右邊無[]的數值
所以N10要計算
作者: luhpro    時間: 2013-10-31 22:14

回復 9# donod
看起來我可能還有點誤會,
改了幾次程式結果都不對.

你可不可以像 6# 這樣人工跑一遍流程,
並詳細敘述和的變化情形及每一步驟適用的條件.
以便於確認並釐清程式到底應該如何修改.
作者: donod    時間: 2013-10-31 23:45

回復 10# luhpro
是小的說不清楚,計算過程如下:
第 1 行 - ( D5=33 , E5=-91 )
※ C9=[-100] 和=-91 (條件5 - 如果綠色格內有[]的數值<=E5,只當E5的值,不需計算其右邊無[]的數值, 觸發)
※ D9=33     (條件5 - 略過)
※ G9=[35]   和=-91+33=-58 (條件4 - 如果綠色格內有[]的數值>=D5,只當D5的值,不需計算其右邊無[]的數值)
※ H9=-110   (條件5 - 略過)
※ I9=[32]   (不在條件內 - 沒有計算)
※ J9=-102   和=-91+33-91=-149 (條件3:如果綠色格內的數值<=E5,只當E5的值)

第 2 行 -
※ F10=[-27] (不在條件內 - 沒有計算)
※ G10=135   和=-149+33=-116 (條件1:如果綠色格內的數值>=D5,只當D5的值)
※ M10=[-30] (不在條件內 - 沒有計算)
※ N10=-2   和=-116-2=-118  (條件2:如果綠色格內的數值<D5及>E5,只當格內的值)

第 3 行 -
※ B11=[-61]  (不在條件內 - 沒有計算)
※ C11=-60    和=-118+-60=-178 (條件2)
※ O11=[-9]   (不在條件內 - 沒有計算)
※ P11=20     和=-178+20=-158 (條件2)
作者: luhpro    時間: 2013-11-5 23:38

回復 11# donod
電腦這幾天又掛了,到今天程式才弄出來.
你看看是否OK, 程式如下:
  1. Sub nn()
  2.   Dim iCol%, iCols%, iNum%, iIdx%, iI%, iJ%
  3.   Dim lRow&, lRows&, lSum&(0 To 1)
  4.   Dim bChk(0 To 1, 0 To 1) As Boolean

  5.   lSum(0) = 0
  6.   lSum(1) = 0
  7.   For lRow = 9 To 11
  8.     For iI = 0 To 1
  9.       For iJ = 0 To 1
  10.         bChk(iI, iJ) = False
  11.       Next
  12.     Next
  13.     For iCol = 2 To 18
  14.       With Cells(lRow, iCol)
  15.         If Not .Value = "" Then ' 無數字不處理
  16.           iIdx = IIf(.Interior.ColorIndex = 43, 1, 0)
  17.           If Left(.Value, 1) = "[" Then
  18.             bChk(iIdx, 0) = True
  19.             iNum = Val(Mid(.Value, 2, Len(.Value) - 2))
  20.           Else
  21.             bChk(iIdx, 0) = False
  22.             iNum = Val(.Value)
  23.           End If
  24.          
  25.           If Not bChk(iIdx, 0) And bChk(iIdx, 1) Then
  26.             bChk(iIdx, 1) = False
  27.           ElseIf iNum >= Cells(5, 2 + iIdx * 2) Then
  28.             lSum(iIdx) = lSum(iIdx) + Cells(5, 2 + iIdx * 2)
  29.             If bChk(iIdx, 0) Then bChk(iIdx, 1) = True
  30.           ElseIf iNum <= Cells(5, 3 + iIdx * 2) Then
  31.             lSum(iIdx) = lSum(iIdx) + Cells(5, 3 + iIdx * 2)
  32.             If bChk(iIdx, 0) Then bChk(iIdx, 1) = True
  33.           Else
  34.             If Not bChk(iIdx, 0) Then
  35.               lSum(iIdx) = lSum(iIdx) + iNum
  36.               bChk(iIdx, 1) = False
  37.             End If
  38.           End If
  39.         End If
  40.       End With
  41.     Next iCol
  42.   Next lRow
  43.   MsgBox "綠色格總數為 : " & lSum(1) & Chr(10) & Chr(10) & Chr(10) & "無色格總數為 : " & lSum(0)
  44. End Sub
複製代碼

作者: donod    時間: 2013-11-6 18:32

回復 12# luhpro

可以了,謝謝大大!




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