返回列表 上一主題 發帖

[發問] 有條件的統計

[發問] 有條件的統計

請問各位大大:
我有一個工作表如下(SHEET1)

我需要統計A公司的品名及數量如下(SHEET2)
2.JPG
要如何做呢?

1.jpg (23.72 KB)

1.jpg

本帖最後由 Andy2483 於 2023-3-31 16:23 編輯

回復 24# gctsai


    謝謝論壇,謝謝前輩發表此主題與範例檔
後學藉此帖研究資料表排序後才帶入陣列,資料表復原,接著才進行統計,
學習到很多知識,學習方案如下,請各位前輩指教

來源表:


統計表:結果


Option Explicit
Sub 宣告()
Dim Brr, Crr, Y, N&, C&, R&, i&, j&, T$, T2$, T3$, TT$
Dim Sh1 As Worksheet, Sh2 As Worksheet
Set Y = CreateObject("Scripting.Dictionary")
Set Sh1 = Sheets("來源"): Set Sh2 = Sheets("統計")
C = Sh1.UsedRange.Columns.Count: R = Sh1.UsedRange.Rows.Count
With Range(Sh1.[A1], Sh1.Cells(R, C + 1))
   With .Columns(C + 1): .Value = "=ROW(A1)": .Value = .Value: End With
   .Sort KEY1:=.Item(3), Order1:=1, Key2:=.Item(2), Order2:=1, Header:=1
   Brr = .Value
   .Sort KEY1:=.Item(C + 1), Order1:=1, Header:=1: .Columns(C + 1).Delete
End With
For i = 2 To UBound(Brr)
   T = Brr(i, 3): If Y(T) = "" Then Y(T) = Y.Count: Y(T & "|儲位數") = ""
Next
Sh2.UsedRange.Delete
With Sh2.[A1].Resize(1, Y.Count)
   .Value = Y.keys: .Replace "*|", "", Lookat:=xlPart
End With
ReDim Crr(1 To R, 1 To Y.Count)
For i = 2 To UBound(Brr)
   T2 = Brr(i, 2): T3 = Brr(i, 3): TT = T3 & "|" & T2
   If Y(TT) = "" Then
      Y(T3 & "/r") = Y(T3 & "/r") + 1
      Crr(Y(T3 & "/r"), Y(T3)) = T2
      Crr(Y(T3 & "/r"), Y(T3) + 1) = 1
      Y(TT) = 1
      Else
         N = Y(T3 & "/r")
         Crr(N, Y(T3) + 1) = Crr(N, Y(T3) + 1) + 1
   End If
Next
With Sh2.[A2].Resize(UBound(Crr), UBound(Crr, 2))
   .Value = Crr: .EntireColumn.AutoFit
End With
Set Y = Nothing: Erase Brr, Crr: Set Sh1 = Nothing: Set Sh2 = Nothing
End Sub
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

gbkee版主解釋的好清楚
又學會了新觀念

TOP

D(Rng.Offset(, 1).Value) = D(Rng.Offset(, 1).Value) + 1

沒想到還能這樣用
又學到了,感謝

TOP

謝謝各位大大的指導,終於完善了

TOP

TOP

不好意思,GBKEE大大,可以解釋一下"SCRIPTING.DICTIONARY"的用法呢?這個我還沒學過,謝謝!
50 字節以內
不支持自定義 Discuz! 代碼

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

請問各位大大, 如果計算"數量"可否不是利用等於號(=) 絕對值 {0,1,2...}, 而改為 大於/小於 可以嗎?
小學生 sony

TOP

回復 25# GBKEE

   從 A欄移到C欄要加 f=f-2
   那從A欄移到E欄是不是要加 F=F-4
   也就是如果移多少欄就要減回來嗎??

TOP

        靜思自在 : 真正的愛心,是照顧好自己的這顆心。
返回列表 上一主題