如果两个数组中的名称对应,我如何只对excel列中的值求和?

时间:2017-10-11 19:24:48

标签: excel excel-vba vba

我确定下面的解决方案非常简单,但它让我难过......

我想在excel工作簿中执行以下操作。假设在A列中我们有一系列名称,在B列中有一系列值

A1 - Alan  B1 - 1
A2 - Bob   B2 - 0
A3 - Jim   B3 - 1
A4 - Tom   B4 - 2

然后我收到一个单独的工作簿,其中包含我需要添加到B列中的值的类似数据,但新工作簿不包含原始工作簿中的所有名称,例如。

A1 - Alan  B1 - 1
A2 - Jim   B2 - 2
A3 - Dave  B3 - 1
A4 - Tom   B4 - 1

我想更新B列中原始工作簿的值,以便它们从每个工作簿中提供B列的总和,并将第二个(新)工作簿中A列的任何新名称附加到名称范围中原始工作簿中的A列。

任何新添加到A列的名称也应显示B列的相关值。

我目前正在使用过滤器并手动更新值,名称范围很大,耗费时间,让我发疯...我确定有一个更优雅的解决方案。

帮助?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是将新列表放在与旧列表相同的工作表上。这假设您将新列表放在D列中(参见newCol)。

如果你想选择一个新工作簿并从中获取特定工作表,我们需要知道如何选择新工作簿(文件选择器,它是否总是在某个文件中,可以选择多个文件) ,工作表名称是什么,等等。)。

Sub AddAndAppend()
Dim ws As Worksheet
Dim i As Long, j As Long
Dim origCol As Long, newCol As Long, startRow As Long

On Error GoTo ErrorHandler

'sets to the current worksheet
Set ws = ActiveSheet

'speeds up macro for longer lists
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'assumes a header row so starts on row 2
startRow = 2

'origcol is where the names are to start, newcol is where the names are in the new list
origCol = 1
newCol = 4

'loop through all the new names
For i = startRow To ws.Cells(ws.Rows.Count, newCol).End(xlUp).Row
    'if name in new list is found in old list...
    If WorksheetFunction.CountIf(ws.Range(ws.Cells(startRow, origCol), ws.Cells(ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row, origCol)), ws.Cells(i, newCol).Value) > 0 Then
        '...find the name in the old list and combine the values
        For j = startRow To ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row
            If ws.Cells(j, origCol).Value = ws.Cells(i, newCol).Value Then
                ws.Cells(j, origCol + 1).Value = ws.Cells(j, origCol + 1).Value + ws.Cells(i, newCol + 1).Value
                Exit For
            End If
        Next j
    Else
        '...otherwise, add the new name to the end of the old list
        ws.Cells(ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row + 1, origCol).Value = ws.Cells(i, newCol).Value
        ws.Cells(ws.Cells(ws.Rows.Count, origCol).End(xlUp).Row, origCol + 1).Value = ws.Cells(i, newCol + 1).Value
    End If
Next i

'turns off speeding up
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub

ErrorHandler:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

MsgBox Err.Number & vbCr & Err.Description
Exit Sub

End Sub