用于合并Excel中

时间:2017-09-28 13:29:39

标签: excel vba excel-vba

我已经多次遇到过这个问题,从未找到过解决问题的满意方法。我确信它必须是一个简单的宏来完成这项工作。 我有一个大表,其中包含行中的名称,列中的月份和值。像这个例子:

      Jan-17  Feb-17  Mar-17
CS      12     10      9
GS       1      5      3
JPM     43     35     40
UBS     11     15     13

每个月我都会得到新值,但问题是:名称不一定相同。有一些新名称和一些旧的不再出现。让我们举一个例子:

     Apr-17
BNP    21
Citi   75
CS     11
UBS     8

我需要将它添加到原始的大表中。因此,我需要为本月的新内容添加一个全新的零行,并在本月为零消失的零点添加零。我想要这样的结果:

     Jan-17  Feb-17  Mar-17  Apr-17
BNP     0      0       0      21
Citi    0      0       0      75
CS     12     10       9      11
GS      1      5       3       0
JPM    43     35      40       0
UBS    11     15      13       8

我到目前为止得到的最佳解决方案是循环考虑两个表中的名称并进行比较。当它发现不匹配时检查主表中的下一个名称,如果这两个匹配则表示新名称。如果没有,我检查新表中的下一个名称,如果匹配则表示该名称已停止显示。请参阅下面的代码:

Sub FixColumnsNames()

'This sub Compare the names in the Summary and the Input tab and put the same names on both
Dim LoopRow As Integer
LoopRow = 1

While Sheets("Input").Range("A" & LoopRow) <> "Grand Total"
'Walkthought tha name list until we find the end (Grand Total)

    If Sheets("Input").Range("A" & LoopRow).Value <> Sheets("Summary").Range("A" & LoopRow).Value Then
    'If two names don't match lets analyse:

        If Sheets("Input").Range("A" & LoopRow + 1).Value = Sheets("Summary").Range("A" & LoopRow).Value Then
        'New Strategy
            Sheets("Summary").Rows(LoopRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Sheets("Summary").Range("A" & LoopRow).Value = Sheets("Input").Range("A" & LoopRow).Value
        End If

        If Sheets("Input").Range("A" & LoopRow).Value = Sheets("Summary").Range("A" & LoopRow + 1).Value Then
        'Old strategy (it has stopped apearing)
            Sheets("Input").Rows(LoopRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Sheets("Input").Range("A" & LoopRow).Value = Sheets("Summary").Range("A" & LoopRow).Value
        End If

    End If
    LoopRow = LoopRow + 1
Wend

End Sub

这假定名称总是按字母顺序缩短,但这对我来说不是问题。这不是一个很好的解决方案,因为当连续出现两个旧名称或新名称时,它会失败。

有人可以建议如何解决这个问题?一些代码或伪代码将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

使用Vlookup公式可以更快地解决这个问题。首先,找到新的四月值。你可以用Vlookup April值和Table值来做到这一点。

enter image description here

现在copy/PasteValue未找到的值(具有#N / A Vlookup值的值)位于主表下方,并在单元格E2中使用此公式(根据需要调整范围){{1 }}。将公式拖到底部。

enter image description here