2017-09-28 7 views
1

私はこの問題を何回も経験していて、それを解決するには満足のいく方法は見つけられませんでした。これを行うには簡単なマクロでなければならないと確信しています。 私は行の名前、列の月、および値を持つ大きなテーブルを得ました。この例のように:Excelで2つのテーブルをマージするマクロ

 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 

私が今までに得た最良の解決策は、両方のテーブルの名前をループして比較することです。ミスマッチがメインテーブルの次の名前を確認したとき、それらの2つが一致した場合は、新しい名前です。そうでなければ、私は新しいテーブルの次の名前をチェックし、それが一致すれば、それは表示されなくなった古い名前であることを意味します。以下のコードを参照してください:

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 

これは名前が常にアルファベット順に短くなっていることを前提としていますが、これは問題ではありません。これは、2つの古い名前または新しい名前の連続(他のものの中でも)があるときに失敗するため、素晴らしい解決策ではありません。

誰かがこれを解決する方法をアドバイスできますか?いくつかのコードまたは擬似コードは高く評価されます。ありがとう。

+0

VBAが必要ですか?代わりに 'Index/Match'や' VLOOKUP'の式を使うことができると確信しています。 – BruceWayne

+0

私はVBAを使う必要はありませんが、これをすばやく簡単に行う方法を探しています。実際のものは数百行あり、このプロセスは同様のテーブルで数回実行する必要があります。それがもっと自動化されたソリューションであれば良いのです。 –

答えて

0

これは、Vlookup式ではるかに速く解くことができます。まず、新しい4月の値を見つけます。 Vlookup Aprilの値とTableの値を比較することができます。今

enter image description here

メインテーブルの下に見出されないcopy/PasteValue値(#N/A VLOOKUP値を持つもの)、および細胞E2でこの式を使用する(ニーズの範囲を調整)=IFERROR(VLOOKUP(A2,$H$1:$I$10,2,FALSE),0)。数式を下にドラッグします。

enter image description here

+0

ありがとうございます。あなたは新しいものを追加するのではなく、CSとUBSを複製しましたが、私はあなたの考えを得ます。私はvlookupのメカニックをマクロにすることについて考えます。 –

+0

あなたは正しいです、私は私の答えを修正しました。あなたは答えとして印を付けてください? –

関連する問題