Vba 宏在Excel中合并两个表

Vba 宏在Excel中合并两个表,vba,excel,Vba,Excel,这个问题我已经遇到好几次了,但从来没有找到一个令人满意的解决方法。我相信这一定是一个很容易完成的宏。 我得到了一个大表,行中有名字,列中有月份,还有值。像这个例子: Jan-17 Feb-17 Mar-17 CS 12 10 9 GS 1 5 3 JPM 43 35 40 UBS 11 15 13 每个月我都会得到新的值,但问题是:名称不一定相同。有一些新名字和一些旧名字

这个问题我已经遇到好几次了,但从来没有找到一个令人满意的解决方法。我相信这一定是一个很容易完成的宏。 我得到了一个大表,行中有名字,列中有月份,还有值。像这个例子:

      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
Sub-FixColumnsNames()
'此子项比较摘要和输入选项卡中的名称,并将相同的名称放在两者上
将行设置为整数
LoopRow=1
While Sheets(“Input”).Range(“A”和LoopRow)“总计”
“在我们找到结尾之前,先查看名单(总计)
如果工作表(“输入”).Range(“A”和LoopRow).值工作表(“摘要”).Range(“A”和LoopRow).值,则
'如果两个名称不匹配,让我们分析:
如果工作表(“输入”).Range(“A”和LoopRow+1).Value=工作表(“摘要”).Range(“A”和LoopRow).Value,则
"新战略",
工作表(“摘要”)。行(LoopRow)。插入Shift:=xlDown,CopyOrigin:=xlFormatFromLeftOrove
工作表(“摘要”).Range(“A”和LoopRow).Value=工作表(“输入”).Range(“A”和LoopRow).Value
如果结束
如果工作表(“输入”).Range(“A”和LoopRow).Value=工作表(“摘要”).Range(“A”和LoopRow+1).Value,则
“旧策略(它已经停止使用了)
工作表(“输入”)。行(LoopRow)。插入Shift:=xlDown,CopyOrigin:=xlFormatFromLeftOrove
工作表(“输入”).Range(“A”和LoopRow).Value=工作表(“摘要”).Range(“A”和LoopRow).Value
如果结束
如果结束
LoopRow=LoopRow+1
温德
端接头
这假设名称总是按字母顺序缩短,但这对我来说不是问题。这不是一个很好的解决方案,因为当有两个旧的或新的名称连续时(除其他外),它会失败


有人能建议如何解决这个问题吗?一些代码或伪代码将被欣赏。谢谢。

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

现在,
copy/PasteValue
在主表下找不到的值(带有#N/A Vlookup值的值),并在单元格
E2
(根据需要调整范围)
=IFERROR(Vlookup(A2,$H$1:$I$10,2,FALSE),0)
。将公式拖到底部


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

现在,
copy/PasteValue
在主表下找不到的值(带有#N/A Vlookup值的值),并在单元格
E2
(根据需要调整范围)
=IFERROR(Vlookup(A2,$H$1:$I$10,2,FALSE),0)
。将公式拖到底部


您需要VBA吗?我很确定你可以使用
Index/Match
VLOOKUP
公式来代替……我不必使用VBA,但我正在寻找一种快速简便的方法。真正的东西有几百行,这个过程需要在类似的表上执行几次,这就是为什么如果它是一个自动化的解决方案会更好。你需要VBA吗?我很确定你可以使用
Index/Match
VLOOKUP
公式来代替……我不必使用VBA,但我正在寻找一种快速简便的方法。真正的东西有几百行,这个过程需要在类似的表上执行几次,这就是为什么如果它是一个自动化的解决方案会更好。谢谢你的回答。你复制了CS和UBS,而不是添加新的,但我明白你的想法。我会考虑把vlookup机械师变成宏。你是对的,我更正了我的答案。你能把答案记下来吗?谢谢你的回答。你复制了CS和UBS,而不是添加新的,但我明白你的想法。我会考虑把vlookup机械师变成宏。你是对的,我更正了我的答案。请你把答案记下来好吗?