返回列表 上一主題 發帖

[發問] 有條件的統計

本帖最後由 GBKEE 於 2011-7-22 07:37 編輯

回復 4# gctsai
先學基本功  3樓提議的工作表函數SUMPRODUCT
圖一  SHEET1 (資料區)

圖二 SHEET2

數量的公式
B5=SUMPRODUCT((Sheet1!$A$2:$A$65525=$A$2)*(Sheet1!$B$2:$B$65525=$B$2)*(Sheet1!$C$2:$C$65525=$C$2)*(Sheet1!$D$2:$D$65535=A5))
B6=SUMPRODUCT((Sheet1!$A$2:$A$65525=$A$2)*(Sheet1!$B$2:$B$65525=$B$2)*(Sheet1!$C$2:$C$65525=$C$2)*(Sheet1!$D$2:$D$65535=A6))
B7=SUMPRODUCT((Sheet1!$A$2:$A$65525=$A$2)*(Sheet1!$B$2:$B$65525=$B$2)*(Sheet1!$C$2:$C$65525=$C$2)*(Sheet1!$D$2:$D$65535=A7))
B8=SUMPRODUCT((Sheet1!$A$2:$A$65525=$A$2)*(Sheet1!$B$2:$B$65525=$B$2)*(Sheet1!$C$2:$C$65525=$C$2)*(Sheet1!$D$2:$D$65535=A8))

TOP

回復 6# gctsai
VBA程序是要量身套製的,所以附黨上來規定條件要放那裡說明白, 回答才會明確.

TOP

回復 8# gctsai
試試看
  1. Sub Ex()
  2.     Dim D As Object, Rng As Range
  3.     Set D = CreateObject("SCRIPTING.DICTIONARY") '設立字典物件
  4.     Set Rng = Sheets("來源").[A2]                                       '設立儲存格物件
  5.     With Sheets("統計")
  6.         Do While Rng <> ""        'Rng的值為空白時不執行 Do的迴圈
  7.             If Rng = .[A2] Then D(Rng.Offset(, 1).Value) = D(Rng.Offset(, 1).Value) + 1
  8.             '        .[A2] ->Sheets("統計")[A2]      '字典物件(KEY)=ITEM + 1
  9.             Set Rng = Rng.Offset(1)  'Rng下移一列位
  10.         Loop
  11.         With .[B2:C2]
  12.             .Cells(1).Resize(D.Count) = Application.Transpose(D.KEYS)
  13.             .Cells(2).Resize(D.Count) = Application.Transpose(D.ITEMS)
  14.             .Resize(D.Count, 2).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo
  15.         End With
  16.     End With
  17.     Set D = Nothing
  18.     Set Rng = Nothing
  19. End Sub
複製代碼

TOP

回復 11# gctsai
使用工作表的預設事件Worksheet_Change,這是你附件Sheets("來源")的程式碼.
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     Ex
  3. End Sub
  4. Private Sub Ex()
  5.     Dim D As Object, Rng As Range
  6.     Set D = CreateObject("SCRIPTING.DICTIONARY") '設立字典物件
  7.     Set Rng = Sheets("來源").[A2]                                       '設立儲存格物件
  8.     With Sheets("統計")
  9.         Do While Rng <> ""        'Rng的值為空白時不執行 Do的迴圈
  10.             If Rng = .[A2] Then D(Rng.Offset(, 1).Value) = D(Rng.Offset(, 1).Value) + 1
  11.             '        .[A2] ->Sheets("統計")[A2]      '字典物件(KEY)=ITEM + 1
  12.             Set Rng = Rng.Offset(1)  'Rng下移一列位
  13.         Loop
  14.         With .[B2:C2]
  15.             .Cells(1).Resize(D.Count) = Application.Transpose(D.KEYS)
  16.             .Cells(2).Resize(D.Count) = Application.Transpose(D.ITEMS)
  17.             .Resize(D.Count, 2).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo
  18.         End With
  19.     End With
  20.     Set D = Nothing
  21.     Set Rng = Nothing
  22. End Sub
複製代碼

TOP

回復 16# gctsai
那如果要統計的欄位不在旁邊呢
那你要跟電腦說阿 如圖

   
  1. Private Sub Ex()
  2.     Dim D As Object, Rng As Range, f As Variant
  3.     Set D = CreateObject("SCRIPTING.DICTIONARY") '設立字典物件
  4.     Set Rng = Sheets("來源").[a2]    '設立儲存格物件
  5.     With Sheets("統計")
  6.          f = Application.Match(.[b1].Text, Sheets("來源").Rows(1), 0) 'f: 在來源中尋找統計的欄位
  7.          If IsError(f) Then MsgBox "統計的欄位不存在!!!": Exit Sub
  8.         Do While Rng <> ""        'Rng的值為空白時不執行 Do的迴圈
  9.             If Rng = .Range("A2") Then D(Rng.Offset(, f - 1).Value) = D(Rng.Offset(, f - 1).Value) + 1
  10.             '        .[A2] ->Sheets("統計")[A2]      '字典物件(KEY)=ITEM + 1
  11.             Set Rng = Rng.Offset(1)  'Rng下移一列位
  12.         Loop
  13.         With .[B2:C2]
  14.             .Resize(.CurrentRegion.Rows.Count, 2) = ""
  15.             .Cells(1).Resize(D.Count) = Application.Transpose(D.KEYS)
  16.             .Cells(2).Resize(D.Count) = Application.Transpose(D.ITEMS)
  17.             .Resize(D.Count, 2).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo
  18.         End With
  19.     End With
  20.     Set D = Nothing
  21.     Set Rng = Nothing
  22. End Sub
複製代碼

TOP

回復 24# gctsai
程序裡請加上紅字部分
f = Application.Match(.[b1].Text, Sheets("來源").Rows(1), 0) 'f: 在來源中尋找統計的欄位
f = f - 2    '你A欄從移到C欄 ***** Rng.Offset會改變
If Rng = .Range("A2") Then D(Rng.Offset(, f- 1).Value) = D(Rng.Offset(, f - 1).Value) + 1

TOP

回復 26# gctsai
修改如下就必去計算欄位了
  1. Sub Ex()
  2.     Dim D As Object, Rng As Range, f As Variant
  3.     Set D = CreateObject("SCRIPTING.DICTIONARY") '設立字典物件
  4.     With Sheets("來源")
  5.         Set Rng = .[c2]    '設立儲存格物件
  6.         f = Application.Match(Sheets("統計").[b1].Text, .Rows(1), 0) 'f: 在來源中尋找統計的欄位
  7.         If IsError(f) Then MsgBox "統計的欄位不存在!!!": Exit Sub
  8.         Do While Rng <> ""        'Rng的值為空白時不執行 Do的迴圈
  9.            If Rng = Sheets("統計").Range("A2") Then D(.Cells(Rng.Row, f).Value) = D(.Cells(Rng.Row, f).Value) + 1
  10.             '        .[A2] ->Sheets("統計")[A2]      '字典物件(KEY)=ITEM + 1
  11.             Set Rng = Rng.Offset(1)  'Rng下移一列位
  12.         Loop
  13.     End With
  14.     With Sheets("統計").[B2:C2]
  15.         .Resize(.CurrentRegion.Rows.Count, 2) = ""
  16.         .Cells(1).Resize(D.Count) = Application.Transpose(D.KEYS)
  17.         .Cells(2).Resize(D.Count) = Application.Transpose(D.ITEMS)
  18.         .Resize(D.Count, 2).Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo
  19.     End With
  20.     Set D = Nothing
  21.     Set Rng = Nothing
  22. End Sub
複製代碼

TOP

        靜思自在 : 原諒別人就是善待自己。
返回列表 上一主題