※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|Itemsメソッド(Dictionaryオブジェクト)

Dictionaryオブジェクトは、連想配列や辞書とよばれるオブジェクトのひとつでキー(Key)とアイテム(Item)とよばれる値をセットにして追加(登録)することができることが大きな特徴です。またDictionaryオブジェクトは、複数の便利なメソッドとプロパティをもっています。

こちらの記事では、連想配列(Dictionaryオブジェクト)のメソッドやプロパティの使いかたを紹介しています。

PR

PCでスキルアップをしたい・Excelをしっかり学んで社内の評価を高めたい人は必見!
実務をプロから学べる「ユースフル」は講座の動画は永年見放題。安心のQ&A機能で分からないを解決。

Itemsメソッドは連想配列(Dictionaryオブジェクト)のアイテムを配列にしてかえす

Itemsメソッドは、連想配列(Dictionaryオブジェクト)のアイテム(Item)を配列データとして返します。
返される配列データを利用して、アイテム(Item)の取り出しや特定のデータの抽出、計算などの処理ができます。

連想配列(Dictionaryオブジェクト)の大きな特徴は、キー(Key)とアイテム(Item)とよばれるものをセットにして追加(登録)することができる点です。これにより配列などでよく見かけるインデックスでの値の取り出しだけでなく、キー(Key)と呼ばれる文字列を使ってもアイテム(Item)の値を取り出すことができます。

また、連想配列(Dictionaryオブジェクト)はキー(Key)の重複ができないといった特徴も持っているので、この特性を活かした場面に利用できれば、今まで連想配列(Dictionaryオブジェクト)を使ったことがなくても便利さを感じられるでしょう。

※連想配列(Dictionaryオブジェクト)についてはこちら

Itemsメソッド構文

連想配列(Dictionary オブジェクト).Items

Itemではなく、Itemsであることに注意が必要です。

Itemsメソッドの構成要素と引数

要素/引数 必須/任意 説明
オブジェクト
(object)
必須 Dictionaryオブジェクトの名前を指定します。

Dictionaryオブジェクトに登録されているアイテム(Item)の配列データを返します。

Dictionaryオブジェクトのアイテム(Item)をまとめて返すことができるよ。

Itemsメソッドつかったサンプルマクロ

連想配列(Dictionaryオブジェクト)のItemsメソッドをつかったサンプルマクロを紹介します。
Itemsメソッドでアイテム(Item)の取り出しや、配列変数への代入などのシンプルなものから、特定の文字列を含むアイテム(Item)の抽出など、使いかたの参考例としてご覧ください。

ItemsメソッドでDictionaryオブジェクトのアイテムを取り出す

以下のマクロは、Itemsメソッドを利用して連想配列(Dictionary オブジェクト)である「MyDic」にアイテム(Item)を取り出します。また、Itemsメソッドはアイテム(Item)を配列データとして返すため、その配列を変数に代入して値の取り出しも行っています。

Option Explicit

Sub Dic_study1() 'DictionaryオブジェクトのItemsメソッドはアイテム(Item)を配列データにする

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic As Dictionary
Set MyDic = New Dictionary

'Addメソッドでキーとアイテムを要素として追加する
MyDic.Add "クワッス", "あお"
MyDic.Add "ホゲータ", "あか"
MyDic.Add "ニャオハ", "みどり"

'MyDicのアイテム(Item)の配列データを取り出す
Debug.Print Join(MyDic.Items, " ・ ") '実行結果>>>あお ・ あか ・ みどり

'Addメソッドでさらにキーとアイテムを要素として追加する
MyDic.Add "メッソン", "あお"
MyDic.Add "ヒバニー", "あか"
MyDic.Add "サルノリ", "みどり"

'MyDicのアイテム(Item)の配列データを代入する変数を宣言する
Dim DicItems As Variant

'Itemsメソッドを利用して配列変数にデータを代入することもできる
DicItems = MyDic.Items

'配列データを取り出す
Debug.Print Join(DicItems, " ・ ") '実行結果>>>あお ・ あか ・ みどり ・ あお ・ あか ・ みどり

'Itemsメソッドで添え字にインデックスを指定すると個別にアイテム(Item)を取り出す
Debug.Print MyDic.Items(0) '実行結果>>>あお
Debug.Print MyDic.Items(2) '実行結果>>>みどり
Debug.Print MyDic.Items(4) '実行結果>>>あか

End Sub

1度目のDebug.Printでは、Itemsメソッドを利用してアイテム(Item)に含まれる値を取り出せました。2度目のDebug.Printでは、Itemsメソッドを変数「DicItems」に代入したあとで値を取り出しています。また、Itemsメソッドでインデックスを添え字にすると個別のアイテム(Item)を取り出すこともできます。

Tips

実行結果はJoin関数を使って配列データをまとめて取り出しているよ。

Itemsメソッドを利用した1度目のDebug.Printでは3つのアイテム(Item)が取り出され、Itemsメソッドの配列データを変数に代入した2度目のDebug.Printでは、6つアイテム(Item)が取り出せています。また、MyDic.Items(0)などのインデックスを添え字にしたときのDebug.Printは個別にアイテム(Item)が返ってきます。

Itemsメソッドで条件にあうアイテム(Item)を持つキー(Key)を抜き出す

以下のマクロは、連想配列(Dictionaryオブジェクト)である「MyDic2」に登録されているキー(Key)とアイテム(Item)のうち、指定した条件にあったアイテム(Item)セットとなっているキー(Key)を取り出します。

Option Explicit

Sub Dic_study2() 'Itemsメソッドで条件にあうアイテム(Item)を持つキー(Key)を抜き出す

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic2 As Dictionary
Set MyDic2 = New Dictionary

'Addメソッドでキーとアイテムを要素として追加する
MyDic2.Add "クワッス", "あお"
MyDic2.Add "ホゲータ", "あか"
MyDic2.Add "ニャオハ", "みどり"
MyDic2.Add "メッソン", "あお"
MyDic2.Add "ヒバニー", "あか"
MyDic2.Add "サルノリ", "みどり"
MyDic2.Add "アシマリ", "あお"
MyDic2.Add "ニャビー", "あか"
MyDic2.Add "モクロー", "みどり"

'くり返し用変数の宣言
Dim i As Integer

'MyDic2のItemの数だけくり返す
For i = 0 To UBound(MyDic2.Items) 'Itemsメソッドは配列を返すためUBound関数を利用できる
'Itemsメソッドを利用してアイテム(Item)に"あ"が含まれるものを抽出
If MyDic2.Items(i) Like "*あ*" Then
Debug.Print MyDic2.Keys(i) '条件にあうキー(Key)を取り出す
End If
Next i

End Sub

MyDic2のアイテム(Item)のうち、「あ」という文字列を含むもののセットとなっているキー(Key)を取り出す処理にしています。サンプルの場合、アイテム(Item)は”あお”、”あか”、”みどり”の3種類のみなので、「あ」が含まれるものは、”あお”、”あか”のアイテム(Item)となります。

Tips

くり返す回数を指定している方法として、UBound関数はアイテム(Item)のインデックスの最大値を返します。サンプルのケースではアイテム(Item)の要素数は9つなので、最大インデックスは8になります。

条件判定で利用しているLike演算子は、文字列を比較をするときに部分一致の判定を可能にするものです。サンプルのケースではアイテム(Item)に「あ」が含まれるときは処理を実行することになります。

Ubound関数や添え字を使うなど、Itemsメソッドを配列として利用してみたよ。

アイテム(Item)のうち、「あ」が含まれる”あお”、”あか”とセットとなっているキー(Key)を取り出すことができました。

条件にあうキー(Key)の取り出しができたね。

ItemsメソッドをWorksheetFunctionのメソッド(関数)の引数にする

こちらのマクロは、Itemsメソッドで返される配列データをつかって、WorksheetFunctionオブジェクトのメソッド(関数)をつかって計算を実行しています。

WorksheetFunctionオブジェクトの関数とは、いわゆるエクセルのシート関数のことで、代表的なもので言えば、合計値を計算してくれるSum関数や、平均値を計算してくれるAverage関数などおなじみのものになります。

もちろんすべての関数の引数としてItemsメソッドがつかえるわけではありませんが、Itemsメソッドってこういった使用方法もあるため、参考例としてご覧ください。

Option Explicit

Sub Dic_study3() 'ItemsメソッドをWorksheetFunctionのメソッド(関数)の引数にする

'連想配列の宣言(参照設定「Microsoft Scripting Runtime」チェックしておく)
Dim MyDic3 As Dictionary
Set MyDic3 = New Dictionary

'Addメソッドでキーとアイテムを要素として追加する(Itemは重さ)
MyDic3.Add "クワッス", 6.1
MyDic3.Add "ホゲータ", 9.8
MyDic3.Add "ニャオハ", 4.1
MyDic3.Add "メッソン", 4
MyDic3.Add "ヒバニー", 4.5
MyDic3.Add "サルノリ", 5
MyDic3.Add "アシマリ", 7.5
MyDic3.Add "ニャビー", 4.3
MyDic3.Add "モクロー", 1.5

With Application.WorksheetFunction 'WorksheetFunctionオブジェクトのメソッド(関数)を利用する
'Sum関数
Debug.Print Format(.Sum(MyDic3.Items), "#.# kg") 'アイテム(Item)の値の和(たし算)

'Average関数
Debug.Print Format(.Average(MyDic3.Items), "#.# kg") 'アイテム(Item)の値の平均

'Product関数
Debug.Print Format(.Product(MyDic3.Items), "#,###.# kg") 'アイテム(Item)の値の積(かけ算)

'Min関数
Debug.Print Format(.Min(MyDic3.Items), "#.# kg") 'アイテム(Item)の値で最も小さい値

'Median関数
Debug.Print Format(.Median(MyDic3.Items), "#.# kg") 'アイテム(Item)の値で真ん中の値

'Max関数
Debug.Print Format(.Max(MyDic3.Items), "#.# kg") 'アイテム(Item)の値で最も大きい値

End With

End Sub

連想配列(Dictionaryオブジェクト)には、キー(Key)に名前を、アイテム(Item)に重さが登録されています。これまでのサンプルと大きく違う点としては、アイテム(Item)がすべて文字列ではなく数値になっています。そのため、Itemsメソッドで返されるものは数値の配列データとなり、この配列を引数としてワークシート関数を実行しています。

実行結果は上から、合計値、平均値、乗算(すべてを掛け算した値)、最小値、中央値、最大値が表示されています。このように、Itemsメソッドを引数としてWorksheetFunctionオブジェクトのメソッド(関数)が実行できました。

Itemsメソッドもアイディアで色々な使いかたができるので便利だね。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

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