| 
    
     |  | ▼UO3 さん: 
 >わたしも、領域と見なしてIntersectで判断することを一瞬考えたのですが
 >もし、数値が200万といったものだと、行数をオーバしてしまうということと
 >Sheet2の上限数値がSheet1の下限数値と同じなら、重なってはいないと見なすという
 >条件があって、ギブアップしました。
 単純に 1セルだけ重なってるだけだったら、「ハズレ」と判定
 と単純化しましたが、やっぱり 却下ですかねェ
 
 以下はこの考えは変えず、
 A列が chr1〜chr3 などのばあいです。
 
 Sub test2()
 Dim dic As Object
 Dim i As Long, n As Long
 Dim r As Range, t As Range, c As Range
 Dim v, ID
 
 Set dic = CreateObject("Scripting.Dictionary")
 Set r = Worksheets("Sheet1").Cells(1).CurrentRegion
 v = Intersect(r, r.Offset(1)).Value
 With Excel.Range("A1")
 For i = 1 To UBound(v)
 If Not dic.Exists(v(i, 1)) Then
 Set dic(v(i, 1)) = _
 CreateObject("Scripting.Dictionary")
 End If
 Set dic(v(i, 1))(v(i, 4)) = Excel.Range( _
 .Offset(v(i, 2)), .Offset(v(i, 3)))
 Next
 
 Set r = Worksheets("Sheet2").Cells(1).CurrentRegion
 v = Intersect(r, r.Offset(1)).Value
 For i = 1 To UBound(v)  'Sheet2 2行目から
 v(i, 4) = Empty
 If dic.Exists(v(i, 1)) Then
 Set t = Excel.Range( _
 .Offset(v(i, 2)), .Offset(v(i, 3)))
 v(i, 4) = "ハズレ"
 For Each ID In dic(v(i, 1)).Keys()
 Set c = Nothing
 On Error Resume Next
 Set c = Intersect(dic(v(i, 1))(ID), t)
 On Error GoTo 0
 If Not c Is Nothing Then
 If c.Count > 1 Then v(i, 4) = ID
 Exit For
 End If
 Next
 End If
 Next
 End With
 r.Item(2, 1).Resize(UBound(v), 4).Value = v
 
 End Sub
 
 |  |