Board logo

標題: [發問] 多重條件式統計與加總 [打印本頁]

作者: b9208    時間: 2010-5-11 23:29     標題: 多重條件式統計與加總

各位先進們好!
多重條件式統計與加總
如附件,雖然可以用 {=SUM(  )}完成
但請先進們可否用VBA程式來執行
非常感謝指導
[attach]260[/attach]
作者: b9208    時間: 2010-5-14 17:17

各位先進前輩
次數統計問題己解決,但數量加總懇請協助指導。
例如:
[E35]之值為單號=ABS and 地區=WZ and 品名=K 符合上述三條件之銷售數量加總。
請看附件B1
下列程式如何修改成可以加總
For i = 5 To 11
For m = 35 To 42
.Cells(m, i) = f(.Cells(10, i) & .Cells(m, 3) & .Cells(m, 4))
Next m
Next i

感謝

[attach]402[/attach]
作者: b9208    時間: 2010-5-15 14:14

各位先進前輩
上網查詢到使用 Application.Evaluate("sumproduct()")
程式碼如下:但執行後儲存格內為〞#NAME?〞
懇請前輩們指導。
m = Sheets("Re").Range("C65536").End(xlUp).Row
For i = 5 To 11
    For j = 35 To 42        
        Cells(j, i) = Application.Evaluate("sumproduct((MID(Re!C7:C100, 5, 3) = cells(34, i))*(Re!K7:K100 = cells(j, 3))*(Re!AM7:AS100 = cells(j, 4))*(Re!BA7:BG100))")
    Next j
Next i
作者: b9208    時間: 2010-5-15 14:16

抱歉上信沒有附加檔案 B2.rar

[attach]437[/attach]
作者: HUNGCHILIN    時間: 2010-5-15 22:47

這種類型資料彙整
照正常來說 使用樞紐分析比較快

但看了data
data排列要再修正
才會更好執行
長期來說修正data使用樞紐會更方便
作者: b9208    時間: 2010-5-16 00:26

感謝阿吉兄
熱心指導說明,但〞樞紐分析〞超出小弟的能力太多了。
還是感謝您
作者: PD961A    時間: 2010-5-16 19:51

感謝阿吉兄
熱心指導說明,但〞樞紐分析〞超出小弟的能力太多了。
還是感謝您
b9208 發表於 2010-5-16 00:26



    您好
其實樞紐分析
比VBA整理資料快很多
也沒那麼複雜
照步驟做....不會太難![attach]531[/attach]
謝謝!
作者: b9208    時間: 2010-5-17 23:27

各位前輩
以下使用R1C1方式可用,供大家參考。

For i = 5 To 11
    For j = 35 To 42
       Cells(j, i).FormulaR1C1 = "=SUMPRODUCT((MID(Re!R7C3:R100C3, 5, 3) =R34C)*(Re!R7C11:R100C11 =RC3)*(Re!R7C39:R100C45 =RC4)*(Re!R7C53:R100C59))"
       Cells(j, i) = Cells(j, i).Value
    Next
Next

請指導一下:上式中 R34C 及 RC3 代表什麼,因書中R OR C 後面有數字,如 R5C7, R10C70.....
例如
Cells(35, 5).FormulaR1C1 ====> R34C = ?,     RC3 = ?
Cells(36, 5).FormulaR1C1 ====> R34C = ?,     RC3 = ?
Cells(35, 6).FormulaR1C1 ====> R34C = ?,     RC3 = ?
作者: Hsieh    時間: 2010-5-18 08:38

回復 8# b9208


    這方法就是寫公式,何必多此一舉
R1C1表示法
R1C1→A1
RC1→同列A欄
R1C→同欄第一列
R[1]C→同欄下一列
RC[1]→同列向右一欄
作者: Hsieh    時間: 2010-5-18 23:25

回復 8# b9208


    若真的不去改變資料庫格式,不嫌麻煩的話
參考附件[attach]684[/attach]
作者: b9208    時間: 2010-5-21 13:15

[attach]790[/attach]
非常感謝前輩指導
程式可以使用。
想增加單位每日銷售數量表單,如ABS, ORO, SHE...。
研究幾天還是無法於前輩程式中增加程式來完成。
功力有待加強(理解力不足)

Set Rng = .Cells(A.row, "AM").Resize(, 7)
If Application.CountA(Rng) > 0 Then Set Rng = Rng.SpecialCells(xlCellTypeConstants) Else GoTo 10
For Each B In Rng

上列程式中,如 Reg 中只有 AM, AP, AR, AS等四欄位有資料(AN. AO, AQ三欄空白),
請問 For Each B In Rng 會執行幾迴圈?

感謝
作者: b9208    時間: 2010-5-21 13:19

抱歉附件沒有上傳成功 C2.rar
[attach]791[/attach]
作者: Hsieh    時間: 2010-5-21 15:08

回復 11# b9208


    有幾欄資料就執行幾次
勸你還是要遵守資料庫規則製作才能省去麻煩
[attach]792[/attach]
作者: b9208    時間: 2010-5-21 21:39

Hsieh版主
非常謝謝您
無私分享指導
因資料庫格式是固定的,後方加上的毎日資料,
是為統計分析用的。
謝謝 & 感謝
作者: wsx24680    時間: 2010-5-22 08:10

Hsieh前輩:

由於小弟剛好也在找用Excel VBA多重條件式統計的方法,但這兩天才加入,
所以能否請Hsieh前輩分享一段程式碼來讓小弟參考一下。
感激不盡!
作者: Hsieh    時間: 2010-5-22 14:51

回復 15# wsx24680
  1. Private Sub CommandButton1_Click()
  2. Dim A As Range, Rng As Range, B As Range
  3. Set dc = CreateObject("Scripting.Dictionary")
  4. Set ds = CreateObject("Scripting.Dictionary")
  5. With Sheet222
  6.    For Each A In .Range(.[C7], .[C65536].End(xlUp))
  7.        mystr = Mid(A, 5, 3)
  8.        If IsError(Application.Match(mystr, Sheet201.[E10:K10], 0)) Then mystr = "Other"
  9.        Set Rng = .Cells(A.Row, "AM").Resize(, 7)
  10.        If Application.CountA(Rng) > 0 Then Set Rng = Rng.SpecialCells(xlCellTypeConstants) Else GoTo 10
  11.        For Each B In Rng
  12.        m1 = mystr & A.Offset(, 8) & B
  13.        m2 = mystr & B & B.Offset(, 7)
  14.        m3 = mystr & A.Offset(, 8) & .Cells(5, B.Column) & B
  15.        dc(m1) = dc(m1) + 1
  16.        dc(m2) = dc(m2) + 1
  17.        ds(m1) = ds(m1) + B.Offset(, 14)
  18.        ds(m3) = ds(m3) + B.Offset(, 14)
  19.        Next
  20. 10
  21.    Next
  22. End With
  23. With Sheet201
  24.    Set Rng = .Columns("C").SpecialCells(xlCellTypeConstants)
  25.    For Each A In Rng
  26.    If A = "銷售加總數量" Then yn = True
  27.    If InStr(A, "每日銷售數量") > 0 Then mystr1 = Mid(A, 1, 3)
  28.        If A.MergeCells = False Then
  29.        If A.Row < 47 Then
  30.           For Each B In .[E10:K10]
  31.               mystr = B & A & A.Offset(, 1)
  32.               If yn = True Then .Cells(A.Row, B.Column) = ds(mystr) Else .Cells(A.Row, B.Column) = dc(mystr)
  33.           Next
  34.         Else
  35.           For Each B In .[E48:K48]
  36.               mystr = mystr1 & A & B & A.Offset(, 1)
  37.               .Cells(A.Row, B.Column) = ds(mystr)
  38.           Next
  39.         End If
  40.         End If
  41.     Next
  42. End With
  43. Set dc = Nothing
  44. Set ds = Nothing
  45. MsgBox ("恭喜您~統計完成!!")   '結束視窗提示
  46. End Sub
複製代碼

作者: wsx24680    時間: 2010-5-23 11:12

感謝 Hsieh版主的分享,看來b9208大 的資料內容確實有點複雜




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