|
はじめて質問させていただきます。お世話になります。
素人で申し訳ありませんが、どうぞよろしくお願いいたします。
前月と今月のシートを比較し、
新規データと削除データ、修正があったデータを洗い出すのが目的です。
それぞれ、A列からAN列までデータが入っています。M列からP列は空白です。
見よう見まねで以下の通り作成しましたところ、
データの行が100行くらいであれば問題なく動くのですが、
10万行近くなるとフリーズしてしまいます。
高速化のために"Application.Calculation = xlCalculationManual"を追加すると、
計算式が動かなくなってしまいました。
VLOOKUPの代わりにdictionaryオブジェクトを使うべきかとも思いましたが、
使い方がよくわかりません。
ご教示いただけますと幸甚です。
どうぞよろしくお願いいたします。
Sub Data_compare()
Application.ScreenUpdating = False
Dim LastMonth As Worksheet
Dim ThisMonth As Worksheet
Set LastMonth = Worksheets("前月")
Set ThisMonth = Worksheets("今月")
'データ照合
Dim TheRow1 As Long
Dim TheRow2 As Long
'新規データの明示
'今月のシートと前月のシートを比較。
'今月のシートのL列の数値(重複なし)をキーとし、前月のシートを検索。
'データがあれば、今月のシートのM列は空白のままとする。
'データがなければ、今月のシートのM列に「新規」と入力。
ThisMonth.Select
TheRow2 = Range("A1").CurrentRegion.Rows.Count
Range("M2").Formula = "=IF(ISNA(VLOOKUP(L2,前月!$L:$L,1,FALSE)),""新規"","""")"
Range("M2").Copy
Range("M3:M" & TheRow2).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("M:M").Copy
Range("M1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
LastMonth.Select
'後に出てくる「範囲修正」でVLOOKUPを使うが、
'キーがL列で、ピックアップしたい列がG列(左側)のため、
'前月のデータのG列からP列にデータをコピー&ペースト
Columns(7).Copy
Columns(16).PasteSpecial
'削除データの明示
'前月のシートと前月のシートを比較。
'前月のシートのL列の数値(重複なし)をキーとし、今月のシートを検索。
'データがあれば、前月のシートのM列は空白のままとする。
'データがなければ、前月のシートのM列に「削除」と入力。
TheRow1 = Range("A1").CurrentRegion.Rows.Count
Range("M2").Formula = "=IF(ISNA(VLOOKUP(L2,今月!$L:$L,1,FALSE)),""削除"","""")"
Range("M2").Copy
Range("M3:M" & TheRow1).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("M:M").Copy
Range("M1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'範囲修正の明示
'今月のシートのG列と前月のシートのP列(G列のデータをコピーしたもの)を比較。
'M列が空白のデータ(今月と前月のシートの両方にデータが存在するもの)を対象とする。
'今月のシートのL列の数値(重複なし)をキーとし、前月のシートを検索。
'G列とP列のデータに相違がなければM列は空白のままとする。
'G列とP列のデータに相違があれば、M列に「範囲修正」と入力。
ThisMonth.Select
For i = 2 To TheRow2
If Cells(i, 13).Value = "" Then
Cells(i, 13).Formula = "=If(G" & i & "=VLOOKUP(L" & i & ",前月!$L:$P,5,FALSE),"""",""範囲修正"")"
Cells(i, 13).Copy
Cells(i, 13).PasteSpecial Paste:=xlPasteValues
End If
Next
'--並び替え---------------------------------------
'F列を第1キー、A列を第2キーとして並べ替え
LastMonth.Select
Range("A:AN").Sort _
Key1:=Range("F1"), Order1:=xlAscending, _
Key2:=Range("A1"), Order1:=xlAscending, _
Header:=xlYes, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
ThisMonth.Select
Range("A:AN").Sort _
Key1:=Range("F1"), Order1:=xlAscending, _
Key2:=Range("A1"), Order1:=xlAscending, _
Header:=xlYes, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
Application.ScreenUpdating = True
End Sub
|
|