Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9660 / 76734 ←次へ | 前へ→

【72634】Re:数値範囲のデータから数値がその範囲にあるか、もしくは含むかを調べる方法
発言  kanabun  - 12/8/29(水) 21:35 -

引用なし
パスワード
   ▼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]


(とりあえず きょうはここまで)

4 hits

【72485】数値範囲のデータから数値がその範囲にあるか、もしくは含むかを調べる方法 T.K 12/8/15(水) 20:24 質問
【72486】Re:数値範囲のデータから数値がその範囲に... UO3 12/8/15(水) 22:09 発言
【72489】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/15(水) 22:38 発言
【72491】Re:数値範囲のデータから数値がその範囲に... UO3 12/8/15(水) 22:48 発言
【72492】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/16(木) 0:37 発言
【72493】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/16(木) 0:51 発言
【72494】Re:数値範囲のデータから数値がその範囲に... UO3 12/8/16(木) 8:16 発言
【72495】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/16(木) 9:03 発言
【72500】Re:数値範囲のデータから数値がその範囲に... UO3 12/8/16(木) 12:54 発言
【72505】Re:数値範囲のデータから数値がその範囲に... UO3 12/8/17(金) 21:25 発言
【72596】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/27(月) 21:46 質問
【72598】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/27(月) 23:55 発言
【72602】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/28(火) 9:51 質問
【72603】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/28(火) 10:07 発言
【72605】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/28(火) 10:12 発言
【72606】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/28(火) 10:38 発言
【72607】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/28(火) 11:27 お礼
【72608】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/28(火) 11:56 お礼
【72630】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 19:29 発言
【72631】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 19:43 発言
【72612】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/28(火) 15:49 質問
【72613】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/28(火) 18:37 質問
【72628】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 18:53 発言
【72629】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 19:12 発言
【72632】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 20:17 発言
【72634】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 21:35 発言
【72635】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/29(水) 21:40 発言
【72657】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/31(金) 15:49 発言
【72659】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/31(金) 16:25 発言
【72660】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/31(金) 17:30 質問
【72664】Re:数値範囲のデータから数値がその範囲に... kanabun 12/8/31(金) 19:35 発言
【72666】Re:数値範囲のデータから数値がその範囲に... T.K 12/8/31(金) 19:45 お礼

9660 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free