連想配列からキーを使ってアイテムを抽出する
「連想配列」を使えるようになりたいという質問をいただきました。
何度か会話をしてある程度理解してもらえたのですが全体の中で少しイメージできていない作業がある様です。
「連想配列から値を取り出す」という作業です
連想配列に値を格納するまでは理解できた様ですが格納した値をどう使うのかがイメージできていない様子でした。
「連想配列から値を取り出す」方法だけ理解できてないだけでしょ?と考えてしまいますが実は大きな問題です。
なぜかと言うと「連想配列から値を取り出す」という方法は連想配列のメリットの1つだからです。
連想配列のメリットは「キーを指定したらすぐにアイテムを取り出すことができる」という点です。
このままでは質問者様は連想配列のメリットを活かすことができません。よって解説記事を作ることにしました。
本記事では連想配列に格納された値を取り出すという作業に特化して解説をします。
比較用で2次元配列だけで同様の作業を再現しました
連想配列からキー使ってアイテムを取り出す方法を理解しやすくする為に2次元配列だけで作ったコードも用意しました。
2次元配列のコードと連想配列のコードを比較すると連想配列から値を取り出す方法がいかに簡単なのかが分かります。
理由は見た目と作業時間です。
- 見た目:連想配列の方が検索時のコード量が少ない&かんたん
- 作業時間:連想配列の方が検索時間が少ない(今回の事例では確認が難しいです)
作業時間については各自でご確認ください。本事例を使ってデータ量を増やしていただくと確認することができます。
関連記事
配列に関する記事はこちらをご覧ください。
関連書籍
ご質問者様はWebスクレイピングにも興味がある様でした。
連想配列とWebスクレイピングについて記載のある書籍を紹介しておきます。
連想配列とは
こちらの記事で詳細を解説しています。(コードは用意していません)
- 連想配列とは
- 使い時
- メリット/デメリット
使い方
こちらの記事で詳細を解説しています。(コードを用意しています)
実際にコードを用意してポイントごとに解説をしています。
加えて参照設定など作業環境に関する情報も掲載しています。
事例:連想配列からキーを使ってアイテムを取り出す
連想配列をメインで使った事例を紹介します。
ワークシート
必要なワークシートは1枚。セルD3に必要な値を入れるという作業です。作業は3ステップです。
- 画像内の下の赤枠を配列に格納
- その後必要な値を連想配列に移す
- 最後に連想配列からセルD3に値を取り出す
アウトプット
セルD3には「自動車」が記入されます。(画像内上の赤枠)画像内下の赤枠の情報が元情報です。
コード
コードはこちらです。
Sub 連想配列から値を取り出す()
Dim Dic As Scripting.Dictionary
Set Dic = New Scripting.Dictionary
Dim r As Long
Dim info1 As Variant
Dim i As Long
r = Cells(Rows.Count, 2).End(xlUp).Row
info1 = Range(Cells(6, 2), Cells(r, 4))
For i = 1 To UBound(info1)
If Not Dic.Exists(info1(i, 1)) Then
Dic.Add info1(i, 2), info1(i, 3)
End If
Next
Range("D3") = Dic.Item(Range("C3").Value)
End Sub
解説
ここで解説するのは1点です。Itemプロパティです。最後のコードをご覧ください。
連想配列のItemプロパティ
キーを指定すると対応したアイテムを返してくれます。構文とパラメータはこちらです。
Item プロパティより抜粋、加工Microsoftドキュメント:
コードの中ではItemプロパティを使って「セルC3をキーとするアイテムをセルD3に記入して」と指示をしています。
キーを指定するとキーに関連したアイテムがすぐに返ってきます。便利ですよね。
このコード1行だけで連想配列内から情報を持ってくることができるので作業スピードが格段に上がります。
これが連想配列のメリットの1つである「キーを指定したらすぐにアイテムを取り出すことができる」という事です。
事例:2次元配列だけを使って必要な情報を取り出す
次は連想配列を使わずに同様の作業を再現したコードです。主となる作業は全て2次元配列を使っています。
ワークシートとアウトプット
連想配列で紹介したワークシートと同じものを使用します。当然アウトプットも同じです。
コード
コードはこちらです。
Sub 2次元配列だけを使って値を取り出す()
Dim r As Long
Dim info1 As Variant
Dim i As Long
r = Cells(Rows.Count, 2).End(xlUp).Row
info1 = Range(Cells(6, 2), Cells(r, 4))
For i = LBound(info1) To UBound(info1)
If info1(i, 2) = Range("C3") Then
Range("D3") = info1(i, 3)
Exit Sub
End If
Next
End Sub
解説
やっていることは連想配列を使ったコードと同じです。ただし連想配列を使わないので別の方法に置き換えています。
今回は値を取り出すためにFor~Nextのループを使っています。
2次元配列内の値を1つずつ確認し名前が一致したら通勤方法の情報を取り出すという具合です。
情報を取り出したあとは「Exit Sub」でコードを抜けます。
このコードの問題点
結論から申し上げますとこちらのコードの方が「圧倒的に作業速度が遅くなる」可能性があります。
本事例においては検索対象のデータは20です。検索結果を取り出すセルは1つです。
非常に少ない情報の中でコードを動かしているので問題が見つかりにくいです。
例えば「検索結果のデータが30万、検索結果は500必要」となるとこのコードではすぐに結果を出すのは難しいです。
コードの書き方やPCのスペック次第ですが目安として連想配列なら1~2秒もあれば結果を出すことができます。
まとめ
連想配列からキーを使ってアイテムを抽出する方法を解説しました。
ご覧いただいた様に非常にかんたんな方法でアイテムを取得する(取り出す)ことができます。
説明を見て分かったと思うかもしれませんが実際にコードを書いて試していただくことをおすすめします。
理由は「手を動かして自分で思考しないと身につかない」からです。根気よく作業を繰り返す様心がけてください。