VBA100本ノック 39本目:数値リストの統合(マージ)
1 今回のお題
A列とB列の数値を統合(マージ)しユニーク化してC列に出力します。
・A列、B列ともに行数は不定
・列内では数値は昇順になっています。
・列内では重複していないが、A列とB列では重複します。
・C列へは重複しない数値として昇順に出力してください。
※画像を参考に。
2 今回のお題の意図
同じ列に重複はない。別の列には重複する数字がある。複数の列から重複しない数字を列Cに書き出す。
3 回答
私の最初の回答
Sub ノック39本目_1() Dim hi() As Variant Dim myCollection As New Collection Dim ws As Worksheet: Set ws = Worksheets("sheet1") '最終行の取得 rowLastLineA = ws.Cells(Rows.Count, 1).End(xlUp).Row rowLastLineB = ws.Cells(Rows.Count, 2).End(xlUp).Row ReDim hi(1 To rowLastLineA) For k = 1 To rowLastLineA hi(k) = ws.Cells(k, 1) Next ReDim Preserve hi(1 To rowLastLineA + rowLastLineB) For i = 1 To rowLastLineB hi(rowLastLineA + i) = ws.Cells(i, 2) Next On Error Resume Next '重複の代入エラーを無視 For j = 1 To rowLastLineA + rowLastLineB myCollection.Add hi(j), CStr(hi(j)) Next On Error GoTo 0 'エラー無視の解除 '列Cへ転記 For k = 1 To myCollection.Count ws.Cells(k, 3) = myCollection(k) Next '列Cを並べ替え Range("C1:C11").Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlNo End Sub
処理手順
1 A、B列の数字を配列に入れる。
2 Collectionに重複しない数字を取得する。
3 列Cに転記する。
4 並べ替える。
ポイントとしてはCollection.Add処理の、Keyは文字列で代入しないと重複してItemを追加(Add)してしまいます。
「myCollection.Add hi(j), CStr(hi(j))」(Add Item,Key)のKeyを、Cstr関数で文字列に変換する必要があります。
これは、パラメータがItemがObjectに対し、KeyはStringのためであると思われます。
4 感想
CollectionはItemが重複するObjectを代入することができないと思っていたのですが、実際はKeyが重複不可でした。
かなり重要な勘違いをしていました(;^ω^)。数字のユニーク化でも、KeyをCstr関数で文字列として扱えば可能となります。
ではでは、この辺で(^^)/~~~