VBA100本ノック 39本目:数値リストの統合(マージ)

この記事から得るもの

Collectionオブジェクトを使って、重複しないデータを作成する。


1 今回のお題

A列とB列の数値を統合(マージ)しユニーク化してC列に出力します。
・A列、B列ともに行数は不定
・列内では数値は昇順になっています。
・列内では重複していないが、A列とB列では重複します。
・C列へは重複しない数値として昇順に出力してください。
※画像を参考に。

f:id:bimori466:20201220205726p:plain

excel-ubara.com

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関数で文字列として扱えば可能となります。


ではでは、この辺で(^^)/~~~