VBA Dictionaryで「ABC」「abc」「ABC 」を同じ重複として数える ― キー正規化のコツ

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのDictionary object公式資料を確認し、重複集計そのものではなく、前後空白や大文字小文字をどうそろえるかという実務上の「キー正規化」に焦点を当てています。

検証ステータス:📘 Microsoft公式確認済み・Excel実機未確認

Excelの重複チェックでは、見た目がほぼ同じデータが別物として数えられることがあります。

たとえば、

ABC
abc
ABC 

末尾空白や大文字小文字の違いを無視したいなら、Dictionaryへ入れる前に「何を同じとみなすか」を決めてキーを正規化します。

まず失敗しやすい例

そのままDictionaryへ入れると、値の違いがキーの違いになります。

Sub CountRawKeys()

    Dim d As Object
    Dim v As Variant

    Set d = CreateObject("Scripting.Dictionary")

    For Each v In Array("ABC", "abc", "ABC ")

        If d.Exists(CStr(v)) Then
            d(CStr(v)) = d(CStr(v)) + 1
        Else
            d.Add CStr(v), 1
        End If

    Next v

    For Each v In d.Keys
        Debug.Print "[" & v & "]", d(v)
    Next v

End Sub

この場合、末尾空白付き ABC は別キーです。

前後空白を除く

キー生成を1か所へまとめます。

Private Function NormalizeKey(ByVal value As Variant) As String

    ' 前後の半角スペースを取り除いて文字列化する
    NormalizeKey = Trim$(CStr(value))

End Function

集計側では、

Dim key As String
key = NormalizeKey(v)

としてからDictionaryへ入れます。

大文字小文字を同じ扱いにする

CompareModevbTextCompare にします。

Set d = CreateObject("Scripting.Dictionary")

' データを追加する前に設定する
d.CompareMode = vbTextCompare

これで ABCabc を同じキーとして比較できます。

実務向けの最小形

Sub CountNormalizedKeys()

    Dim d As Object
    Dim v As Variant
    Dim key As String

    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = vbTextCompare

    For Each v In Array("ABC", "abc", "ABC ", "XYZ")

        key = Trim$(CStr(v))

        ' 空白だけのデータを数えない例
        If Len(key) > 0 Then

            If d.Exists(key) Then
                d(key) = d(key) + 1
            Else
                d.Add key, 1
            End If

        End If

    Next v

    For Each v In d.Keys
        Debug.Print v, d(v)
    Next v

End Sub

この例では ABC 系が3件としてまとまります。

正規化は「強くすれば良い」わけではない

たとえば社員コードで abcABC が本当に別コードなら、大文字小文字を無視してはいけません。

同様に、

  • 00123123

  • 全角数字と半角数字

  • ハイフン有り/無し

  • スペース有り/無し

を同一視してよいかは業務ルール次第です。

flowchart LR
A[元データ] --> B[業務ルールを決める]
B --> C[NormalizeKey]
C --> D[DictionaryのKey]
D --> E[重複件数]

仕事でどう使えるか

  • 顧客コードの重複

  • メールアドレスの前後空白除去

  • 部署名の表記揺れ

  • CSV取込前チェック

  • マスタ突合

  • 申請データの重複検査

では、Dictionaryの書き方よりキーをどう作るかの方が品質に効きます。

Excel範囲で使うとき

大量データではセルを1つずつ読むより、一度配列へ取得してから正規化・集計する方が扱いやすくなります。

また、元データを書き換えて正規化するのではなく、Dictionary用のキーだけ別に作れば、元データを保持したまま検査できます。

まとめ

  • 重複判定では「何を同じとするか」を先に決める

  • Trimで前後空白を除ける

  • CompareModeで大文字小文字の比較方針を決められる

  • 正規化しすぎると本来別の値を同一視する危険がある

  • NormalizeKeyを1関数にまとめると実務ルールを管理しやすい

公式情報・一次情報

文書情報

記事タイトル
VBA Dictionaryで「ABC」「abc」「ABC 」を同じ重複として数える ― キー正規化のコツ
作成日
更新日
Source URL
https://papanda925.com/?p=15391

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました