| 
    
     |  | よろしくお願いします。 >ichinoseさん
 >Lindyさん
 >Jakaさん
 >皆さん ありがとうございます。
 >コードの内容はあまりわかりませんが
 >どれも完璧です。
 >コードをよーく見て少しずつ勉強します。
 >
 >★★追加で申し訳ないのですが条件がさらに増えるのですが
 >   A       B         C       D    E   F
 >1  氏名    プロジェクト    開始日    終了日  打合日 時間
 >2 佐藤太郎     AAAAA       2007/4/1   2007/10/31  水  午後
 >3 鈴木次郎    BBBBB       2007/3/1   2007/12/31  火  午後
 >4 山田三郎    CCCCC       2007/2/1    2007/9/31  金  午前
 >5 佐藤太郎    DDDDD      2007/10/1   2007/12/31  水  午後
 >6 鈴木次郎    EEEEE       2007/4/1   2007/11/30  火  午前
 >  :       :        :      :    :   :
 >
 D列までの重複した人間を対象にE、Fの重複のチェック(色を変えて表示)を
 したいのですが、難しいでしょうか?
 >よろしくお願いします。
 ichinoseさんのコードに加味したのですが
 修正方法がいまいちわかりません。
 ご教授いただけないでしょうか
 よろしくお願いします。
 
 '========================================================
 Option Explicit
 Sub main()
 Dim rng As Range
 Dim g0 As Long
 Dim g1 As Long
 Dim c_carray As Variant
 Dim st1 As Long, ed1 As Long
 Dim ret As Boolean
 Cells.Interior.ColorIndex = xlNone
 Set rng = Range("a2", Cells(Rows.Count, 1).End(xlUp))
 If rng.Row > 1 Then
 init_ovl_chk_tbl
 For g0 = 1 To rng.Count
 c_carray = get_ovl_chk_tbl(rng(g0).Value)
 If TypeName(c_carray) = "Boolean" Then
 Call add_ovl_chk_tbl(rng(g0).Value, CLng(rng(g0, 3).Value), CLng(rng(g0, 4).Value))
 Else
 st1 = CLng(rng(g0, 3).Value)
 ed1 = CLng(rng(g0, 4).Value)
 ret = True
 For g1 = LBound(c_carray) To UBound(c_carray) Step 2
 If chk_ovl(st1, ed1, c_carray(g1), c_carray(g1 + 1)) Then
 rng(g0).Resize(, 4).Interior.ColorIndex = 3
 ret = False
 Exit For
 End If
 Next g1
 If ret = True Then
 Call add_ovl_chk_tbl(rng(g0).Value, st1, ed1)
 End If
 End If
 Next g0
 term_ovl_chk_tbl
 End If
 
 End Sub
 '========================================================================
 Function chk_ovl(ByVal st1 As Long, ByVal ed1 As Long, ByVal st2 As Long, ByVal ed2 As Long) As Boolean
 '機能 : st1からed1の範囲とst2からed2の範囲で重なりの有無をチェックする
 'input : st1 ed1 st2 ed2 開始値及び、終了値
 'output: chk_ovl true 重なりあり  False 重なりなし
 ' 例
 '  st1 10 ed1 20 st2 5 ed2 16の場合、chk_ovl True
 '  st1 10 ed1 20 st2 11 ed2 16の場合、chk_ovl True
 '  st1 10 ed1 20 st2 16 ed2 30の場合、chk_ovl True
 '  st1 10 ed1 20 st2 5 ed2 9の場合、chk_ovl false
 '  st1 10 ed1 20 st2 22 ed2 32の場合、chk_ovl false
 Dim myarray As Variant
 myarray = Application.Frequency(Array(st1, ed1), Array(st2, ed2))
 If myarray(1, 1) < 2 And myarray(3, 1) < 2 Then
 chk_ovl = True
 Else
 chk_ovl = False
 End If
 Erase myarray
 End Function
 
 |  |