|
▼seya さん:
>Sheet1のB1セルの数値が、Sheet2のB列の数値で一致するセルがあった場合、Sheet1のB1を含むその行を、Sheet2の一致した行に上書きするにはどうしたらいいのでしょうか。 よろしくお願いします。
こういったMatchingの方法はいろいろありますが・・・
とりあえず、基本的なMatchingアルゴリズムを書いておきます。
双方のデータをSortしてから、総当りでMatchingしているものですが、
配列を用いているため、高速なはずです。
他に、高速なものとしてはDictionaryを用いたものとかあります。
興味があったらチャレンジしてみては?
Const MAX_LONG = &H7FFFFFFF
Sub test1()
Dim rngList1 As Range
Dim rngList2 As Range
Dim rngTemp1 As Range
Dim rngTemp2 As Range
Dim lngRowC1 As Long
Dim lngRowC2 As Long
Dim vntList1 As Variant
Dim vntList2 As Variant
Dim lngUCol1 As Long
Dim i As Long, j As Long, k As Long
'Sheet1
Set rngList1 = Worksheets("Sheet1").Cells(1).CurrentRegion
With rngList1
'B列で昇順Sort
.Sort Key1:=.Item(2), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=True, Orientation:=xlTopToBottom, _
SortMethod:=xlStroke, DataOption1:=xlSortNormal
lngRowC1 = .Rows.Count
'Matching漏れをなくすため、B列の最終行にLong型の最大値を付与
Set rngTemp1 = .Item(2).Offset(lngRowC1)
rngTemp1.Value = MAX_LONG
'配列に代入
vntList1 = .Resize(lngRowC1 + 1).Value
End With
lngUCol1 = UBound(vntList1, 2)
'Sheet2
Set rngList2 = Worksheets("Sheet2").Cells(1).CurrentRegion
With rngList2
'B列で昇順Sort
.Sort Key1:=.Item(2), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=True, Orientation:=xlTopToBottom, _
SortMethod:=xlStroke, DataOption1:=xlSortNormal
lngRowC2 = .Rows.Count
'Matching漏れをなくすため、B列の最終行にLong型の最大値を付与
Set rngTemp2 = .Item(2).Offset(lngRowC2)
rngTemp2.Value = MAX_LONG
Set rngList2 = .Resize(lngRowC2 + 1, lngUCol1)
'配列に代入
vntList2 = rngList2.Value
End With
i = 1
j = 1
'Matching
Do
Select Case vntList1(i, 2)
Case Is < vntList2(j, 2)
i = i + 1
Case Is = vntList2(j, 2)
'値のコピー
For k = 1 To lngUCol1
vntList2(j, k) = vntList1(i, k)
Next k
j = j + 1
Case Is > vntList2(j, 2)
j = j + 1
End Select
Loop Until i > lngRowC1 + 1 Or j > lngRowC2 + 1
'結果の出力
rngList2.Value = vntList2
'Temp数字のクリア
rngTemp1.ClearContents
rngTemp2.ClearContents
End Sub
|
|