我已经多次遇到过这个问题,从未找到过解决问题的满意方法。我确信它必须是一个简单的宏来完成这项工作。 我有一个大表,其中包含行中的名称,列中的月份和值。像这个例子:
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
这假定名称总是按字母顺序缩短,但这对我来说不是问题。这不是一个很好的解决方案,因为当连续出现两个旧名称或新名称时,它会失败。
有人可以建议如何解决这个问题?一些代码或伪代码将不胜感激。感谢。