|
少し内容が煩雑なので具体例で示したいと思います。
以下のようなデータがsheet1にあるとします。
start end ID
0 1000 1
2000 3000 2
4000 5000 3
6000 7000 4
8000 9000 5
10000 11000 6
12000 13000 7
14000 15000 8
16000 17000 9
18000 19000 10
Sheet2において以下のようなデータをセットします。
start end ID
20 100
500 1200
1500 1800
2500 3500
8000 8700
13500 14000
15000 15400
14000 15500
17500 19000
5500 7500
その際ID列に以下のようにsheet1のIDがふられるようにしたいです。
start end ID 状態の説明
20 100 1 1の範囲に包括されている
500 1200 1 1の範囲に一部重なっている
1500 1800 ハズレ 範囲内に無い
2500 3500 2 2の範囲に一部重なっている
8000 8700 5 5の範囲に一部重なっている
13500 14000 ハズレ 8のstart値とend値が一致しているが範囲外とする
15000 15400 ハズレ 8のend値とstart値が一致しているが範囲外とする
14000 15500 8 8の範囲を包括している
17500 19000 10 10の範囲を包括している
5500 7500 4 4の範囲を包括している
VLOOKUPで
=IF(A3="","",VLOOKUP(A3,sheet1!$B$2:$D$202,3,TRUE))のようにして行ってはみたものの、抜け番のデータをデータベースに入れなくてはいけなかったり、
5500 7500 4 4の範囲を包括している
という最後のパターンのようなものを判別することは難しく、そもそもVLOOKUPでどうこうしようとすることが不適当なのだと思っていますが、手法が思いつきません。
簡単な説明は以上ですが、実際のデータはもう少し列があり、それを含めた検索をしたいと考えております。
本来のデータはsheet1に
class start end ID
chr1 0 1000 1
chr1 2000 3000 2
chr1 4000 5000 3
chr1 6000 7000 4
chr1 8000 9000 5
chr1 10000 11000 6
chr1 12000 13000 7
chr1 14000 15000 8
chr1 16000 17000 9
chr1 18000 19000 10
chr2 0 1000 11
chr2 2000 3000 12
chr2 4000 5000 13
chr2 6000 7000 14
chr2 8000 9000 15
chr2 10000 11000 16
chr2 12000 13000 17
chr2 14000 15000 18
chr2 16000 17000 19
chr2 18000 19000 20
chr3 1300 1500 21
chr3 1700 2000 22
chr3 2300 2500 23
chr3 2800 3000 24
chr3 3300 3500 25
chr3 3800 4000 26
chr3 4300 4500 27
chr3 4800 5000 28
chr3 5300 5500 29
chr3 5800 6000 30
このような形になっていて、いちばん左のクラスが存在し、
sheet2の検索側も
class start end ID
chr1 20 100
chr1 500 1200
chr1 1500 1800
chr1 2500 3500
chr1 8000 8700
chr1 13500 14000
chr1 15000 15400
chr1 14000 15500
chr1 17500 19000
chr1 5500 7500
としたいです。つまり、
class start end ID
chr1 20 100
chr1 500 1200
chr1 1500 1800
chr1 2500 3500
chr3 20 100
chr3 500 1200
chr3 1500 1800
chr3 2500 3500
という風に検索をしようとしたときにIDにはsheet1のclassを認識してその部分だけを検索対象にしてほしく、先ほどのデータベースだとするならば結果として以下のようになるような感じなVBAを考えております。
class start end ID
chr1 20 100 1
chr1 500 1200 1
chr1 1500 1800 ハズレ
chr1 2500 3500 2
chr3 20 100 ハズレ
chr3 500 1200 ハズレ
chr3 1500 1800 22
chr3 2500 3500 24
VBAで何とかするしかないかと思っています。どなたか教えていただけませんか?
|
|