|
▼T.K さん:
>以下のようなデータが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がふられるようにしたいです。
1案ですが、
数値の範囲が重なってるか、外れてるか、調べるのを
セルの範囲が重なってるか、外れてるか、調べることによって
代用したらどうでしょう。
たとえば、 start=20 End=100 という範囲は
[A20:A100]というA列のセル範囲と考えるわけです。
これと調べたいSheet1に書かれた複数範囲と比較するわけです。
含まれるかどうかは Intersectメソッドというのを使います。
(ただし A0 というセルは無いので、もとの数値に +1 した行を
セル範囲として比較します)
Sub test()
Dim CRange() As Range
Dim i As Long, n As Long
Dim v
With Worksheets("Sheet1")
v = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 2).Value
End With
n = UBound(v)
ReDim CRange(1 To n)
For i = 1 To n
Set CRange(i) = Excel.Range("A" & (v(i, 1) + 1), "A" _
& (v(i, 2) + 1))
Next
Dim c As Range
Dim t As Range, x As Range
Dim ok As Long
With Worksheets("Sheet2")
For Each c In .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
Set t = Excel.Range("A" & (c.Value + 1), "A" & _
(c.Offset(, 1).Value + 1))
ok = 0
For i = 1 To n
Set x = Nothing
On Error Resume Next
Set x = Intersect(CRange(i), t)
On Error GoTo 0
If Not x Is Nothing Then
If x.Count = 1 Then
c.Offset(, 2).Value = "ハズレ"
Else
c.Offset(, 2).Value = i
End If
ok = 1
Exit For
End If
Next
If ok = 0 Then
c.Offset(, 2).Value = "ハズレ"
End If
Next
End With
End Sub
|
|