2013-04-24 40 views
1

嗨我有一個電子表格,需要根據多個值進行計數和分組。使用下面的示例,我只需要它在託運人 - 發件人城市,收件人和收件人城市都相同的情況下計算一行。否則,我需要它來創建一個新的條目。編程方式在Excel中對多個字段值進行分組,計數和複製

除了計數之外,如果可能的話,我必須以編程方式執行它,而不是使用數據透視表,因爲它會從SQL DB頻繁更新並由各種用戶通過按鈕控制。我已經使用VBA在這裏獲取數據,但我失去了如何進行排序/分組。

我試過一個for循環嵌套條件,但對VBA來說是相當新的,所以我沒有成功。

表目前的樣子;

# - Shipper - City - Recipient - City  - Bool 
1 Bob  L.A. Jenny  Las Vegas True 
2 Bob  L.A. Jenny  Las Vegas False 
3 Bob  L.A. Jenny  Portland  True 
4 Bob  L.A  Jenny  Orem   True 
5 Bob  L.A  Jenny  Orem   True 
6 Sam  L.A  Jenny  Portland  True 
7 Sam  L.A  Jenny  Portland  True 
8 Sam  L.A  Jenny  Reno   False 
9 Sam  L.A  Jenny  Reno   False 

最終結果應該放在一張新紙上;

# - Shipper - City - Recipient - City  - Count - Bool 
1 Bob  L.A. Jenny  Las Vegas  2  50% 
2 Bob  L.A. Jenny  Portland  1  100% 
3 Bob  L.A. Jenny  Orem   2  100% 
4 Sam  L.A  Jenny  Portland  2  100% 
5 Sam  L.A  Jenny  Reno   2  0% 
+0

您可以創建數據透視表並使用VBA替換原始表,而不是每次都創建新文件。另外,您嘗試過哪些內容並且無法正常工作? – Aprillion 2013-04-24 20:54:39

+0

您使用的是哪個Excel版本? – 2013-04-24 21:03:26

+0

如果您使用xl2007 +,那麼我可以爲您建議一個非常簡單的代碼... – 2013-04-24 21:22:19

回答

1

比方說,你的數據看起來像這

enter image description here

您現在要做的就是將下面的代碼粘貼到模塊中並運行它。輸出將顯示在新的工作表中。您不必擔心數據中的行數增加/減少。只需確保數據位於上述屏幕截圖所示的列A至E和第一行。否則你將不得不修改宏。

邏輯(代碼做什麼)

  1. 複製山口A-D只是一個新的工作表
  2. 使用內置.RemoveDuplicates去除過多的數據
  3. 使用COUNTIFS()計數的記錄數並顯示在Col E
  4. 然後再次使用COUNTIFS()來計算TRUE的數量並顯示在Col F
  5. 使用COUNTIFS()來算的FALSE數量和山口G
  6. 顯示在山口H,找到百分比。一旦完成,將其轉換爲數值
  7. 刪除山口F和山口摹
  8. 格式上校G(今山口F)到%

CODE

Sub Sample() 
    Dim ws As Worksheet, wsOutput As Worksheet 
    Dim lRow As Long 

    Set ws = ThisWorkbook.Sheets("Sheet1") 
    Set wsOutput = ThisWorkbook.Sheets.Add 

    With wsOutput 
     ws.Range("A:D").Copy .Range("A:D") 

     .Range("A:D").RemoveDuplicates Columns:=Array(1, 2, 3, 4), Header:=xlYes 

     lRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     .Range("E2:E" & lRow).Formula = "=COUNTIFS(" & ws.Name & "!A:A,A2," & _ 
                 ws.Name & "!B:B,B2," & _ 
                 ws.Name & "!C:C,C2," & _ 
                 ws.Name & "!D:D,D2)" 

     .Range("F2:F" & lRow).Formula = "=COUNTIFS(" & ws.Name & "!A:A,A2," & _ 
                 ws.Name & "!B:B,B2," & _ 
                 ws.Name & "!C:C,C2," & _ 
                 ws.Name & "!D:D,D2," & _ 
                 ws.Name & "!E:E,""TRUE"")" 

     .Range("G2:G" & lRow).Formula = "=COUNTIFS(" & ws.Name & "!A:A,A2," & _ 
                 ws.Name & "!B:B,B2," & _ 
                 ws.Name & "!C:C,C2," & _ 
                 ws.Name & "!D:D,D2," & _ 
                 ws.Name & "!E:E,""FALSE"")" 

     .Range("H2:H" & lRow).Formula = "=F2/SUM(F2:G2)" 
     .Range("H2:H" & lRow).Value = .Range("H2:H" & lRow).Value 

     .Columns("F:G").Delete Shift:=xlToLeft 
     .Columns("F:F").NumberFormat = "0%" 
     .Cells(1, 5).Value = "Count": .Cells(1, 6).Value = "BOOL" 
    End With 
End Sub 

輸出

enter image description here

+1

非常感謝。這做到了。我不得不稍微調整一下,因爲實際的表格要大得多,但是這個訣竅! – h8a 2013-04-25 19:26:10

1

可以使用SUMPRODUCT函數,例如

=SUMPRODUCT((A1:A500="Bob")*(B1:B500="L.A")*(D1:D500="Las Vegas")*1) 

透視表過一個不錯的選擇......

[]的

+0

使用SUMPRODUCT,我是否必須事先知道我正在分組的值,或者是否有辦法使其與每張表成爲動態的。這將會在很多數據表上運行。只有全部4個字段匹配,我才能夠進行分組。 – h8a 2013-04-25 12:21:00

+0

您可以使用AdvancedFilter方法獲取唯一值,並使用VBA上的sumproduct函數對此信息進行分組。 – 2013-04-25 13:12:14

相關問題