- ホーム
- 講座一覧
- 講座「エクセルマクロ・VBA発展編2」
- 教材「補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合」
補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合
解説
連想配列の任意のキーに対してオブジェクトへの参照を設定することができます。
ここでは、サンプルコードを示しつつ、具体例として、ワークシート、ワークシート内の図形、セルへの参照設定を .Add メソッドを使って行う場合の書き方について紹介します。
参照設定は、単体のオブジェクトに対してだけでなく、コレクション(複数オブジェクトの集合)に対しても行えます。
ここでは、サンプルコードを示しつつ、具体例として、ワークシート、ワークシート内の図形、セルへの参照設定を .Add メソッドを使って行う場合の書き方について紹介します。
参照設定は、単体のオブジェクトに対してだけでなく、コレクション(複数オブジェクトの集合)に対しても行えます。
この教材についての過去の質問・感想
11650 : 小川慶一の回答 (2019-11-05 15:30:03)
受講生 さん:
これは興味深い質問ですね。
ありがとうございます (^^*
Item, Items, Keys, と、いろいろ出てきてややこしいですね。
ということで、整理のために、以下のようなサンプルコードを書きました。
Microsoft Scripting Runtimeを参照のうえ、以下のコードをステップイン実行してみてください。
そうすれば理解が進むのでは?と思います。
もちろん、実行してみて不明なことがあればまた遠慮なく質問してください (^^*
'ポイント: '[A] dic.item(文字列) -> xxx というキーで格納された値を取得する '[B] dic.items(数値) -> キーと値のペアのうち、 xxx 番目のものの、値を取得する '[C] dic.keys(数値) -> キーと値のペアのうち、 xxx 番目のものの、キーを取得する '[OK] 以下は正常な処理の例です。 item, items という言葉の使い分けに特に注目してください。 Sub MyDicSample1_OK() Dim dic As New Scripting.Dictionary dic.Add "key_a", 100 dic.Add "key_b", 200 dic.Add "key_c", 300 '[A] 以下では、キーを使って値を取得します。 Debug.Print vbNewLine & "Get values by key" Debug.Print dic.Item("key_a") Debug.Print dic.Item("key_b") Debug.Print dic.Item("key_c") '[B] 以下では、インデックスを使って値を取得します。 Debug.Print vbNewLine & "Get values by index" Debug.Print dic.Items(0) Debug.Print dic.Items(1) Debug.Print dic.Items(2) '[C] 以下では、インデックスを使ってキーを取得します。 Debug.Print vbNewLine & "Get keys by index" Debug.Print dic.Keys(0) Debug.Print dic.Keys(1) Debug.Print dic.Keys(2) '[B], [C] を For Next 構文で書いてみました Dim c As Long Debug.Print vbNewLine & "Get items - using for structure" For c = 0 To dic.Count - 1 Debug.Print dic.Items(c) Next Debug.Print vbNewLine & "Get keys - using for structure" For c = 0 To dic.Count - 1 Debug.Print dic.Keys(c) Next End Sub '[NG] 以下は実行時エラーになります。Items, Keys, Item はありですが、 Key というのはNGなので。 Sub MyDicSample2_NG() Dim dic As New Scripting.Dictionary dic.Add "key_a", 100 dic.Add "key_b", 200 dic.Add "key_c", 300 '[OK] 以下では、キーを使って値を取得します。 '[A], [B], [C]のどれか?というと、[A]の構文ですね。 Debug.Print vbNewLine & "Get values by key" Debug.Print dic.Item("key_a") Debug.Print dic.Item("key_b") Debug.Print dic.Item("key_c") '[NG] 以下は、構文エラーです。Items, Keys, Item はありですが、 Key というのはNG。 '[A], [B], [C]のどれか?というと、どれでもない。 Debug.Print vbNewLine & "Get values by key" Debug.Print dic.Key("key_a") Debug.Print dic.Key("key_b") Debug.Print dic.Key("key_c") End Sub '[NG] 以下は論理エラーになります。 'インデックスやキーの指定で文字列型の場合、数値型の場合を混在させているので紛らわしいですが、 '発展編2講座ですので、そこはサラッと流します。 '理解できない場合はさらに質問してください。 Sub MyDicSample3_NG() Dim dic As New Scripting.Dictionary dic.Add "key_a", 100 dic.Add "key_b", 200 dic.Add "key_c", 300 '以下は、該当するキーが存在しないので、出力結果はEmpty型になります。 '[A], [B], [C]のどれか?というと、[A]の構文ですね。 Debug.Print vbNewLine & "Erros - keys not exists" Debug.Print dic.Item("0") Debug.Print dic.Item("1") Debug.Print dic.Item("2") '以下も、該当するキーが存在しないので、出力結果はEmpty型になります。 '[A], [B], [C]のどれか?というと、[A]の構文ですね。 Debug.Print vbNewLine & "Erros - keys not exists" Debug.Print dic.Item(0) Debug.Print dic.Item(1) Debug.Print dic.Item(2) '以下は、該当するインデックスが存在するので、それぞれに該当する item が出力されます。 '[A], [B], [C]のどれか?というと、[B]の構文ですね。 Debug.Print vbNewLine & "Erros - keys not exists" Debug.Print dic.Items("0") Debug.Print dic.Items("1") Debug.Print dic.Items("2") '以下も、該当するインデックスが存在するので、それぞれに該当する item が出力されます。 '[A], [B], [C]のどれか?というと、[B]の構文ですね。 Debug.Print vbNewLine & "Erros - keys not exists" Debug.Print dic.Items(0) Debug.Print dic.Items(1) Debug.Print dic.Items(2) End Sub
> モジュール2では、
> For c = 0 To dic.Count - 1
> Debug.Print dic.Keys(c), dic.Items(c) ’←★
> Next
> ★「items」と複数形でしたが
> モジュール3では、
> dic.Add "sp1", dic.Item("ws1").Shapes(2)
> dic.Item("sp1").Select ’←★★
> Debug.Print dic.Item("sp1").Width
> Debug.Print dic.Item("sp1").Height
> ★★のように「item」という単数形をとるのはどうしてですか。
11648 : 受講生さんのコメント (2019-11-05 05:40:18)
モジュール2では、
For c = 0 To dic.Count - 1
Debug.Print dic.Keys(c), dic.Items(c) ’←★
Next
★「items」と複数形でしたが
モジュール3では、
dic.Add "sp1", dic.Item("ws1").Shapes(2)
dic.Item("sp1").Select ’←★★
Debug.Print dic.Item("sp1").Width
Debug.Print dic.Item("sp1").Height
★★のように「item」という単数形をとるのはどうしてですか。

本講座の動画一覧
-
【動画1】 式と戻り値1-データ型のおさらい
-
【動画2】 式と戻り値2-「式」と「戻り値」
-
【動画3】 式と戻り値3-「式」と「戻り値のデータ型」
-
【動画4】 式と戻り値4-「式」とは(その1)
-
【動画5】 式と戻り値5-「式」とは(その2)
-
【動画6】 式と戻り値6-戻り値を返す式、戻り値を返さない式
-
【動画7】 コレクションとインデックス
-
【動画8】 配列
-
【動画9】 静的配列
-
【動画10】 動的配列1-動的配列の基本
-
【動画11】 動的配列2-Preserveキーワード
-
【動画12】 動的配列3-演習
-
【動画13】 多次元配列の基本
-
【動画14】 多次元動的配列
-
【動画15】 多次元配列のサイズを調べる
-
【動画16】 配列操作の便利関数、オプション、その他
-
【動画17】 連想配列1-Dictionaryオブジェクトの仕様
-
【動画18】 連想配列2-Dictionaryオブジェクトの使用例
-
【動画19】 連想配列3-Microsoft Scripting Runtimeのへの参照設定
-
【動画20】 「名前付き引数」と「名前なし引数」
-
【動画21】 省略可能な引数とその初期値
-
【動画22】 引数のデータ型
-
【動画23】 Functionプロシージャ
-
【動画24】 引数がひとつまたは複数のFunctionプロシージャ
-
【動画25】 Functionプロシージャ演習中
-
【動画26】 引数として配列を受け取るFunctionプロシージャ
-
【動画27】 引数を受け取らないSubプロシージャと引数つきSubプロシージャ
-
【動画28】 Subプロシージャの基本構造
-
【動画29】 モジュールレベル変数との使い分け
-
【動画30】 補講1-ディクショナリーオブジェクトのさらなる活用
-
【動画31】 補講2-ディクショナリーオブジェクトの .Count プロパティ
-
【動画32】 補講3-連想配列によるオブジェクトへの参照設定 - 新しいキーに設定する場合
-
【動画33】 補講4-連想配列によるオブジェクトへの参照設定 - 既存の値を上書きする場合
-
【動画34】 補講5-複数セルの集合を作るための便利なメソッド2つ
-
【動画35】 補講6-連想配列演習-取引先ごとに取引金額の合計を算出する
-
【動画36】 補講7-ウォッチ式の活用
-
【動画37】 補講8-ウォッチ式で配列の状態を確認する
-
【動画38】 補講9-たった1行のコードでセルのデータを配列に投入する
コメント紹介
もっと見る