从两个不同的表中总结两列

时间:2013-06-20 18:50:54

标签: excel excel-vba vba

我真的需要你的帮助,我想在列的标题的每个外观中总结非空单元格。

例如:

     |111|222|333|111|444|222|555

aaa  |2  |2  |2  |2  |2  |2  |2    
bbb  |   |2  |2  |2  |2  |2  |2  
ccc  |   |   |2  |   |2  |2  |  
ddd  |2  |   |   |2  |   |2  |  
eee  |2  |   |2  |   |   |   |2  

我希望结果如下:

    |111|222|333|444|555
    --------------------
    |6  |6  |4  |3  |3

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

在工作表的底部,使用COUNTA公式计算每列的非空白。

         |111|222|333|111|444|222|555
 -------------------------------------
    aaa  |2  |2  |2  |2  |2  |2  |2    
    bbb  |   |2  |2  |2  |2  |2  |2  
    ccc  |   |   |2  |   |2  |2  |  
    ddd  |2  |   |   |2  |   |2  |  
    eee  |2  |   |2  |   |   |   |2  
  COUNTA |3  |2  |4  |3  |3  |4  |3

粘贴特殊/将标题行和COUNTA行转置到新工作表中。

  Header | COUNTA
 -----------------
    111  | 3
    222  | 2
    333  | 4
    111  | 3
    444  | 3
    222  | 4
    555  | 3

现在创建一个包含列值“Header”的数据透视表,并将COUNTA公式求和以获得结果。

如果您不想使用数据透视表,请将标题值粘贴到新工作表中,删除重复项,然后使用SUMIF公式获取每个标题值的总计。

答案 1 :(得分:2)

这很有效。您可能需要更新范围引用。它在单独的工作表上输出摘要。

Sub UserNameCount()
Dim headers As Range, header As Range, countRng As Range, col As Long

Set dict = CreateObject("Scripting.Dictionary")
Set headers = Range("A1:G1")
col = 1

For Each header In headers
    Set countRng = Range(header.Offset(1, 0), header.Offset(5, 0)) //update the '5' depending on the number of rows you have

    If Not dict.Exists(header.Value) Then
        dict.Add header.Value, WorksheetFunction.CountA(countRng)
    Else
        dict.Item(header.Value) = dict.Item(header.Value) + WorksheetFunction.CountA(countRng)
    End If
Next header

For Each v In dict.Keys
    With Worksheets("Sheet2")
        .Cells(1, col) = v
        .Cells(2, col) = dict.Item(v)
        col = col + 1
    End With
Next

Set dict = Nothing
End Sub