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机械师变成宏。你是对的,我更正了我的答案。请你把答案记下来好吗?