| 
    
     |  | ▼kanabun さん: ありがとうございます。ここまでの説明でちょっとずつ仕組みが分かりました。細かい部分がまだ分からないですが、続きの解説楽しみにしています。よろしくお願いします。
 >▼T.K さん:
 >[sheet1]に 以下のようにあるとします。
 >  A    B      C      D
 >1 class  start    end       ID
 >2 chr1  1048371    1049797    ER_1_Carrol
 >3 chr1  1054645    1055778    ER_2_Carrol
 >4 chr1  1285749    1286349    ER_3_Carrol
 >5 chr1  243097903  243098610    ER_396_Carrol
 >6 chr1  243121865  243122466    ER_397_Carrol
 >7 chr1  243604797  243605398    ER_398_Carrol
 >8 chr2  250722     251323    ER_399_Carrol
 >9 chr2  1650212    1650812    ER_400_Carrol
 >10 chr2  1660654    1661254    ER_401_Carrol
 >11 chr3  58431890   58432547    ER_756_Carrol
 >12 chr3  61588283   61588993    ER_757_Carrol
 >13 chr3  61595330   61595989    ER_758_Carrol
 >14 chr3  61605662   61606263    ER_759_Carrol
 >15 chr3  61649269   61649870    ER_760_Carrol
 >16 chr3  61768126   61769266    ER_761_Carrol
 >17 chr3  62137944   62138544    ER_762_Carrol
 >
 >コード【72606】を見てください。
 >Dictionary オブジェクトを作成したあとのコードは↓こうなってます。
 >>   Set r = Worksheets("Sheet1").Cells(1).CurrentRegion
 >>   v = Intersect(r, r.Offset(1)).Value
 >まず 「.Cells(1).CurrentRegion」で表領域[A1:D17]が変数rに
 >セットされます。2行目で この範囲から先頭行を除外した正味
 >データ範囲[A2:D17]の「Value を」変数v に格納します。
 >
 >さてその次からDictionaryにデータを登録している部分ですが、
 >ここは込み入ってる(Dictionaryのなかで また子供のDictionary
 >を作ってそれを親のDictionaryのItemに登録しています)ので、
 >実際のコードでなく、外側の(最初宣言した)親Dictionaryのやっ
 >ていることを説明します。
 >外側のdicのやっていることは まずもってA列のclass名から
 >《重複しないclass名を取得する》ことです。
 >Dictionaryとはバケツの集合のようなものです。ただしそれぞれの
 >バケツ表面にはKeyと呼ばれるラベルが貼ってあり、このラベルは
 >他のバケツと重複した名前を持つことが許されてません。重複をカ
 >ットしたリストを得るにはDictionaryのこの性質を利用します。
 >具体的には
 >1 class
 >2 chr1
 >3 chr2
 >4 chr1
 >5 chr3
 >6 chr1
 >7 chr2
 >8 chr3
 >のようなリストがあるとき、
 >2行目から 8行目までLoopして順に
 >  For i = 2 To 8
 >    dic("i行目のデータ") = Empty
 >  Next
 >という構文を使って処理します。たとえば 2行目なら
 >    dic("chr1") = Empty
 >です。このとき Dictionaryのなかに "chr1" というラベルを
 >もったバケツが用意されます。右辺には バケツの中に容れたい
 >アイテムを書きますが、今回はとくに内容物は入れないので、
 >Emptyとしておきます。
 >3行目のとき
 >    dic("chr2") = Empty
 >が実行され、これでDictionaryのなかは
 >   ┃    ┃  ┃    ┃
 >   ┃    ┃  ┃    ┃
 >   ┃    ┃  ┃    ┃
 >   ┃    ┃  ┃    ┃
 >   ┗━━━━┛  ┗━━━━┛
 >    [chr1]      [chr2]
 >のようなイメージになります。[chr1] や [chr2]のバケツに付された
 >ラベルのことを Key といい、内容物を Item といいます。今回は
 >Itemはどのバケツも「空」です。バケツの中には何でも入れることが
 >できます。数値でも、文字でも、なんでも。。。そう、Dictionary
 >のItemには またDictionaryオブジェクトを入れることだってできる
 >のです(→【72606】ではDictionaryのなかにDictionaryを入れてます)。
 >(簡単な例のほうにもどって)
 >4行目のとき またKeyは "chr1" で、
 >    dic("chr1") = Empty
 >を実行しますが、このときは「すでに"chr1"というkeyは在るので
 >そのバケツに Empty を入れます」。つまり、何もしない、と同じこと
 >になります。こうしてDictionaryにまだ無いときだけ新しいラベル(
 >key)をもったバケツが追加されます。
 >8行目まで同様の処理を繰り返したあと辞書は以下のようになって
 >います。
 >   ┃    ┃  ┃    ┃  ┃    ┃
 >   ┃    ┃  ┃    ┃  ┃    ┃
 >   ┃    ┃  ┃    ┃  ┃    ┃
 >   ┃    ┃  ┃    ┃  ┃    ┃
 >   ┗━━━━┛  ┗━━━━┛  ┗━━━━┛
 >    [chr1]      [chr2]     [chr3]
 >
 >辞書に何項目入っているかは dic.Count でわかります。
 >Countプロパティは Keyの数を返します。→ 3
 >どんなKey が登録されているのかは Keys()メソッドでリスト
 >できます。
 >   Dim v As Variant
 >   For Each v In dic.Keys()
 >     Debug.Print v
 >   Next
 >こうするとイミディエイト・ウィンドウには
 > chr1
 > chr2
 > chr3
 >が表示されます。
 >DictionaryはKeyごとの出現回数を調べたいときなどにも
 >重宝します。
 >さきほどのサンプルデータを使って、
 >1 class
 >2 chr1
 >3 chr2
 >4 chr1
 >5 chr3
 >6 chr1
 >7 chr2
 >8 chr3
 >Keyごとの出現回数をカウントするには、
 >
 >  For i = 2 To 8
 >    dic("i行目のデータ") = dic("i行目のデータ") + 1
 >  Next
 >とします。これを実行した後、
 >   Dim v As Variant
 >   For Each v In dic.Keys()
 >     Debug.Print v, dic(v)
 >   Next
 >を実行すれば、イミディエイト・ウィンドウには こんどは
 > chr1  3
 > chr2  2
 > chr3  2
 >と表示されるはずです。dic(v) は dic.Item(v) の省略された
 >書き方で、この文によって vという名の(Keyの,バケツの) Item
 >(内容物)が指定されています。
 >
 >先ほどいいましたように dicの Item には いろんなものを入れる
 >ことができます。
 >たとえば、"ER_1_Carrol" という名前(Key) のついたバケツに
 >{1048371, 1049797} という数値配列を入れるときは
 >  dic("ER_1_Carrol") = Array(1048371, 1049797)
 >とします。
 >  内容物を取り出すときは
 >  dic("ER_1_Carrol")(0) とすると 1048371 が、
 >  dic("ER_1_Carrol")(0) とすると 1049797 が取り出せます。
 >
 >たとえば、"chr1"というバケツの内容物にDictionaryを入れようと
 >するときは
 >  dic("chr1") = CreateObject("Scripting.Dictionary")
 >とします。
 >
 >   ┃    ┃    ┃│  │ ┃
 >   ┃    ┃    ┃│  │ ┃
 >   ┃1049797 ┃    ┃│  │ ┃
 >   ┃1048371 ┃    ┃└──┘ ┃
 >   ┗━━━━┛    ┗━━━━━┛
 >    [ER_1_Carrol]    [chr1]
 >
 >
 >(とりあえず きょうはここまで)
 
 
 |  |