連想配列を使う


プログラミングの仕組みに連想配列という機能があります。たとえば、

Japan 日本
USA アメリカ
France フランス

のようにデータを格納しておいて、「Japan」というキーで「日本」を探し出す機能です。

「VBAで連想配列は使えますか?」とか「VBAには連想配列がないからな~」などという話をたまに聞きますが、Excel VBA使いとしては「??」という気がしてなりません。だって、いつもワークシート上で普通にやってることですから。

Excel VBAに連想配列という機能はありませんが、データを変数ではなくワークシート上のセルに格納することで、連想配列のような使い方ができます。ちなみに、かなり高速ですよ。20,000件のデータをランダムに並べ、20,000件目のデータを検索するのに要した時間は20ミリ秒でした。CPUは1GHzでメモリは512MBの環境です。

ひとつだけマクロ例を提示しておきますね。

Sub Sample1()
    ''データの検索
    Dim buf As String
    buf = InputBox("キーは?")
    If buf = "" Then Exit Sub
    If CheckData(buf) <> "" Then    ''存在チェック
        MsgBox GetData(buf)
    Else
        MsgBox buf & "は存在しません"
    End If
End Sub
Function GetData(htKey As String)   ''既存データの検索
    Dim ST
    ST = GetTickCount
    On Error Resume Next
    GetData = Application.WorksheetFunction.VLookup(htKey, Sheets(1).Range("A1:B20000"), 2, False)
End Function
Function CheckData(htKey As String) ''存在確認
    On Error Resume Next
    CheckData = Application.WorksheetFunction.Match(htKey, Sheets(1).Range("A1:A20000"), 0)
End Function

GetDataとかCheckDataが、セルを連想配列のように使う関数です。

関数側で受け取る引数の整合性などはチェックしていません。また、データの件数は20,000件で固定しています。こんなのは、運用で簡単にカバーできる部分ですから、あえて書いていません。参照するセル範囲の大きさを可変にするなんて、VBAでは初歩的なテクニックですからね。