Excel VBA質問箱 IV

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

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


5400 / 13646 ツリー ←次へ | 前へ→

【50935】期間が重複していないか確認する方法 やました 07/8/22(水) 21:00 質問[未読]
【50937】Re:期間が重複していないか確認する方法 neptune 07/8/22(水) 21:28 発言[未読]
【50943】Re:期間が重複していないか確認する方法 やました 07/8/22(水) 23:36 お礼[未読]
【50944】Re:期間が重複していないか確認する方法 ssc 07/8/23(木) 0:23 発言[未読]
【50946】Re:期間が重複していないか確認する方法 じゅんじゅん 07/8/23(木) 6:51 発言[未読]
【50947】Re:期間が重複していないか確認する方法 ichinose 07/8/23(木) 7:47 発言[未読]
【50950】Re:期間が重複していないか確認する方法 訂... ichinose 07/8/23(木) 9:33 発言[未読]
【50951】Re:期間が重複していないか確認する方法 じゅんじゅん 07/8/23(木) 9:37 発言[未読]
【50953】Re:期間が重複していないか確認する方法 neptune 07/8/23(木) 9:54 回答[未読]
【50957】Re:期間が重複していないか確認する方法 じゅんじゅん 07/8/23(木) 10:40 発言[未読]
【50955】Re:期間が重複していないか確認する方法 Lindy 07/8/23(木) 10:24 発言[未読]
【50962】Re:期間が重複していないか確認する方法 ssc 07/8/23(木) 14:22 質問[未読]
【50963】すみませんでした。 Jaka 07/8/23(木) 15:04 発言[未読]
【51008】Re:期間が重複していないか確認する方法 ssc 07/8/24(金) 17:50 質問[未読]
【51012】Re:期間が重複していないか確認する方法 ichinose 07/8/25(土) 7:31 発言[未読]
【51013】Re:期間が重複していないか確認する方法 ssc 07/8/25(土) 12:37 質問[未読]
【51014】Re:期間が重複していないか確認する方法 ichinose 07/8/25(土) 14:45 発言[未読]
【51016】Re:期間が重複していないか確認する方法 ssc 07/8/25(土) 16:23 発言[未読]
【51017】Re:期間が重複していないか確認する方法 ssc 07/8/25(土) 16:38 お礼[未読]
【51025】Re:期間が重複していないか確認する方法 ssc 07/8/26(日) 0:10 質問[未読]
【51026】Re:期間が重複していないか確認する方法 ichinose 07/8/26(日) 0:19 発言[未読]
【51027】Re:期間が重複していないか確認する方法 ssc 07/8/26(日) 0:34 質問[未読]
【51028】Re:期間が重複していないか確認する方法 ichinose 07/8/26(日) 0:45 発言[未読]
【51030】Re:期間が重複していないか確認する方法 ssc 07/8/26(日) 1:55 質問[未読]
【51050】Re:期間が重複していないか確認する方法 ichinose 07/8/26(日) 22:18 発言[未読]
【51052】Re:期間が重複していないか確認する方法 ssc 07/8/26(日) 22:54 質問[未読]
【51053】Re:期間が重複していないか確認する方法 ssc 07/8/26(日) 23:15 質問[未読]
【51054】Re:期間が重複していないか確認する方法 ichinose 07/8/27(月) 8:04 発言[未読]
【51059】Re:期間が重複していないか確認する方法 ssc 07/8/27(月) 9:45 お礼[未読]

【50935】期間が重複していないか確認する方法
質問  やました  - 07/8/22(水) 21:00 -

引用なし
パスワード
   下記のようなことはできますでしょうか。
自分で調べて見ましたが、方法が見つかりませんでした。
お手数ですが、ご教授お願い致します。

 氏名   所属プロジェクト      期間
佐藤太郎     AAAAA      2007/4/1〜2007/10/31
鈴木次郎    BBBBB      2007/3/1〜2007/12/31
山田三郎    CCCCC      2007/2/1〜2007/9/31
佐藤太郎    DDDDD      2007/10/1〜2007/12/31
田中一郎    EEEEE      2007/4/1〜2007/11/30
  ・      ・           ・
  ・      ・           ・
  ・      ・           ・
  ・      ・           ・
※500行くらいあります。

上記のようなリストで、
1. 同一人物が、同期間に複数のプロジェクトに所属して
 いないかチェック(上記の場合、佐藤太郎の2007/10/1〜10/31が該当)

2. 1.で複数プロジェクトに所属していた場合、エラーとしてその氏名を返す。

宜しくお願い致します。

【50937】Re:期間が重複していないか確認する方法
発言  neptune  - 07/8/22(水) 21:28 -

引用なし
パスワード
   ▼やました さん:
こんにちは
>下記のようなことはできますでしょうか。
出来ると思いますよ。

>上記のようなリストで、
>1. 同一人物が、同期間に複数のプロジェクトに所属して
> いないかチェック(上記の場合、佐藤太郎の2007/10/1〜10/31が該当)
>
>2. 1.で複数プロジェクトに所属していた場合、エラーとしてその氏名を返す。
>宜しくお願い致します。
このままでは丸投げです。

先ず、コード化を考えずに、頭の中でどうやって判断、計算しているか
を順番に整理して、纏めましょう。
又は、VBAを使わずにExcelの機能でやるにはどうやるかを。

コード化はその後です。

そして、纏めたものをキチンと整理して、書き込んで見ましょう。

プログラムは
・考えを纏める、整理する
・コード化
・検証
ですので、最低限「考えを纏める、整理する」はご自分でやってみましょう。
そうすれば、沢山のアドバイスをいただけると思います。

【50943】Re:期間が重複していないか確認する方法
お礼  やました  - 07/8/22(水) 23:36 -

引用なし
パスワード
   返信ありがとございます。

>このままでは丸投げです。
すみませんでした。
もう一度考えてみます。

【50944】Re:期間が重複していないか確認する方法
発言  ssc  - 07/8/23(木) 0:23 -

引用なし
パスワード
   よこから失礼いたします。
この質問に仕事柄同じような状況がありますので
非常に興味をもちました是非ご教授お願いします。

いつもは工程表のようなものを作り重複をチェック
しているのですが。vbaで出来るのであればかなり便利かと
思った次第です。
検索後、列(A:D)に色を付けられると最高です。
よろしくお願いします。

   A       B         C       D
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
  :       :        :      :

【50946】Re:期間が重複していないか確認する方法
発言  じゅんじゅん  - 07/8/23(木) 6:51 -

引用なし
パスワード
   データの並び替えを行なう。
1.氏名順
2.開始日順 (昇順)

同じ名前の人の2つめのプロジェクトの開始日から、
1つめのプロジェクトの終了日を引いた日数が、
マイナスなら”ダブり”、
日数が0以上であれば”ダブりでない”となるかと。

一案程度に。

【50947】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/23(木) 7:47 -

引用なし
パスワード
   ▼ssc さん:
おはようございます。


>   A       B         C       D
>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
>  :       :        :      :

開始日と終了日が分かれているのでその分だけ処理が楽になりますね!!
データをどのように配置するかは、かなり重要なことですよね?

標準モジュールに

'========================================================
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

別の標準モジュールに
'=================================================================
Option Explicit
Private dic As Dictionary
'=================================================================
Sub init_ovl_chk_tbl()
'重なりチェックリストテーブルの初期化
  Set dic = CreateObject("scripting.dictionary")
End Sub
'=================================================================
Sub term_ovl_chk_tbl()
'重なりチェックリストテーブルの終了処理
  Set dic = Nothing
End Sub
'=================================================================
Sub add_ovl_chk_tbl(c_key As Variant, st As Long, ed As Long)
'重なりチェックリストテーブルへのチェックデータの追加
  Dim ans As Variant
  If dic.Exists(c_key) Then
    ans = dic(c_key)
    ReDim Preserve ans(1 To UBound(ans) + 2)
    ans(UBound(ans) - 1) = st
    ans(UBound(ans)) = ed
    dic(c_key) = ans
  Else
    ReDim ans(1 To 2)
    ans(1) = st
    ans(2) = ed
    dic.Add c_key, ans
    End If
End Sub
'=================================================================
Function get_ovl_chk_tbl(c_key As Variant) As Variant
'重なりチェックリストテーブルへからチェックデータの取得
  If dic.Exists(c_key) Then
    get_ovl_chk_tbl = dic(c_key)
  Else
    get_ovl_chk_tbl = False
    End If
End Function


上記のようなデータが配置されているシートをアクティブな状態で
mainを実行してみてください。
期間に重なりのある行が赤く塗りつぶされます。
上記のデータ例だと5行目の佐藤太郎が塗りつぶし対象になります。
尚、データのソートの必要はありません。


試してみてください。

【50950】Re:期間が重複していないか確認する方法...
発言  ichinose  - 07/8/23(木) 9:33 -

引用なし
パスワード
   >標準モジュールに
>
>'========================================================
>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
>
>別の標準モジュールに
>'=================================================================
>Option Explicit
Private dic As object '←これに訂正してください そうしないと
'            参照設定が必要になってしまうので
>'=================================================================
>Sub init_ovl_chk_tbl()
>'重なりチェックリストテーブルの初期化
>  Set dic = CreateObject("scripting.dictionary")
>End Sub
>'=================================================================
>Sub term_ovl_chk_tbl()
>'重なりチェックリストテーブルの終了処理
>  Set dic = Nothing
>End Sub
>'=================================================================
>Sub add_ovl_chk_tbl(c_key As Variant, st As Long, ed As Long)
>'重なりチェックリストテーブルへのチェックデータの追加
>  Dim ans As Variant
>  If dic.Exists(c_key) Then
>    ans = dic(c_key)
>    ReDim Preserve ans(1 To UBound(ans) + 2)
>    ans(UBound(ans) - 1) = st
>    ans(UBound(ans)) = ed
>    dic(c_key) = ans
>  Else
>    ReDim ans(1 To 2)
>    ans(1) = st
>    ans(2) = ed
>    dic.Add c_key, ans
>    End If
>End Sub
>'=================================================================
>Function get_ovl_chk_tbl(c_key As Variant) As Variant
>'重なりチェックリストテーブルへからチェックデータの取得
>  If dic.Exists(c_key) Then
>    get_ovl_chk_tbl = dic(c_key)
>  Else
>    get_ovl_chk_tbl = False
>    End If
>End Function


【50951】Re:期間が重複していないか確認する方法
発言  じゅんじゅん  - 07/8/23(木) 9:37 -

引用なし
パスワード
   ichinose さん、コード参考にさせて頂きました。

ところで、
Private dic As Dictionary
の部分で、
”コンパイルエラー ユーザー定義型は定義されてません”とでます。

Private dic As Object
にすると正常に動くのですが、Excelのバージョンによるのでしょうか?
当方はExcel2002です。
あと、特に参照設定も行なってません。

かなり興味深いサンプルでした。

【50953】Re:期間が重複していないか確認する方法
回答  neptune  - 07/8/23(木) 9:54 -

引用なし
パスワード
   ▼じゅんじゅん さん:
こんにちは

>ichinose さん、コード参考にさせて頂きました。
>
>ところで、
>Private dic As Dictionary
>の部分で、
>”コンパイルエラー ユーザー定義型は定義されてません”とでます。
参照設定で
microsoft scripting runtime
にチェックしてみましょう。

【50955】Re:期間が重複していないか確認する方法
発言  Lindy  - 07/8/23(木) 10:24 -

引用なし
パスワード
   みなさんこんにちは

半分遊びというか、こんな発想は受け入れられるのか?
というコードなのですがどうでしょうか?
1900/1/1〜2079/6/5の期間限定で日付のシリアル値をRowとして
Rangeに格納後Intersectで重複判定してみました。

発想の転換で楽しくコード勉強中です。


Sub test()
'####### 1900/1/1〜2079/6/5の期間限定 #######
'日付のシリアル値をRowとしてRangeに格納後Intersectで重複判定

Dim myDic As Object, i As Long, j As Long
Dim dat As Variant, key_name As Variant, item_row As Variant
Dim myRng As Range, chk_Rng As Range
Dim key_row() As String, hit_name As String

Cells.Interior.ColorIndex = xlNone
dat = Range("A2", Range("D65536").End(xlUp)).Value
Set myDic = CreateObject("Scripting.Dictionary")
j = 0
ReDim key_row(j)
For i = 1 To UBound(dat)
 If Not myDic.exists(dat(i, 1)) Then
  j = j + 1
  myDic.Add dat(i, 1), j
  ReDim Preserve key_row(j)
  key_row(j) = i
 Else
  key_row(myDic.Item(dat(i, 1))) = _
      key_row(myDic.Item(dat(i, 1))) & "," & i
 End If
Next i
key_name = myDic.keys
For i = 0 To UBound(key_name)
 item_row = Split(key_row(i + 1), ",")
 If UBound(item_row) > 0 Then
  Set myRng = Range(Cells(CLng(dat(item_row(0), 3)), 1), _
           Cells(CLng(dat(item_row(0), 4)), 1))
  For j = 1 To UBound(item_row)
   Set chk_Rng = Range(Cells(CLng(dat(item_row(j), 3)), 1), _
            Cells(CLng(dat(item_row(j), 4)), 1))
   If Not Application.Intersect(myRng, chk_Rng) Is Nothing Then
    Cells(item_row(j) + 1, 1).Resize(, 4).Interior.ColorIndex = 6
    hit_name = hit_name & vbLf & key_name(i)
   End If
   Set myRng = Union(myRng, chk_Rng)
  Next j
 End If
Next i
MsgBox "重複者リスト" & vbLf & hit_name
Set myDic = Nothing
Set myRng = Nothing
Set chk_Rng = Nothing
End Sub

【50957】Re:期間が重複していないか確認する方法
発言  じゅんじゅん  - 07/8/23(木) 10:40 -

引用なし
パスワード
   ▼neptune さん:ありがとうございます。

>▼じゅんじゅん さん:
>こんにちは
>
>>ichinose さん、コード参考にさせて頂きました。
>>
>>ところで、
>>Private dic As Dictionary
>>の部分で、
>>”コンパイルエラー ユーザー定義型は定義されてません”とでます。
>参照設定で
>microsoft scripting runtime
>にチェックしてみましょう。
承知致しました。勉強になりました。

【50962】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/23(木) 14:22 -

引用なし
パスワード
   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の重複のチェック(色を変えて表示)を
したいのですが、難しいでしょうか?
よろしくお願いします。

【50963】すみませんでした。
発言  Jaka  - 07/8/23(木) 15:04 -

引用なし
パスワード
   ▼ssc さん:
>Jakaさん
>コードの内容はあまりわかりませんが
>どれも完璧です。
すみません。
私のは、完璧じゃありませんでした。
(検証不足)
なので、消しました。

【51008】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/24(金) 17:50 -

引用なし
パスワード
   よろしくお願いします。
>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

【51012】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/25(土) 7:31 -

引用なし
パスワード
   ▼ssc さん:
おはようございます。

>>
>>★★追加で申し訳ないのですが条件がさらに増えるのですが
>>   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の重複のチェック(色を変えて表示)を
>したいのですが、難しいでしょうか?
難しいか否かはともかく、可能です。

が、仕様キチンと記述してください。
今回の投稿、neptuneさんは、

>このままでは丸投げです。

とおっしゃっていますね!!
これに異論を唱えるわけではありません。
丸投げ禁止は、この質問箱の規約ですから・・・。


が、

ある程度仕様が正確に書かれていれば私はこの「丸投げ」の対象から外しています。
だって、私が仕事を請け負う時はこの仕様書作成も立派な仕事の範囲です。
(これが出来れば、3/1は出来たつもりでいます)

加えて、これがキチンと記述されていない質問がここ最近多いことが気になっています。
これは、質問するマナーなどという観点からではなく、
プログラミング作成という工程の中の技術的な部分として「仕様をわかりやすく記述する」ことは、重要ななことだという思いからです。

この点でやましたさんの投稿は分かりやすく仕様が書かれていたので
投稿をすることにしました。

で、ssc さんの場合、やましたさんの投稿に相乗りしたことになりますね?

しかも、処理条件が追加されています。

例もその分、追加して掲載してください。

例えば、

>>   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  火  午前

この例では、結果どのように色を付けるのですか?

1結果がこの場合は xx色

2結果がこの場合は yy色

という定義からはじめてください。

さらに

 1   氏名  プロジェクト  開始日  終了日  打合日  時間
 2  佐藤太郎  AAAAA   2007/4/1 2007/10/31  金  午後
 3  鈴木次郎  BBBBB   2007/3/1 2007/12/31  火  午後
 4  山田三郎  CCCCC   2007/2/1 2007/9/30   金  午前
 5  佐藤太郎  DDDDD   2007/11/1 2007/12/31  水  午後
 6  鈴木次郎  EEEEE   2007/4/1 2007/11/30  火  午前
 7  佐藤太郎  fffff   2007/10/1 2007/12/31  水  午後


この場合は、どのような結果になるのですか?
これ以外のも考えて例を掲載してください。


>ichinoseさんのコードに加味したのですが
>修正方法がいまいちわかりません。

大きくはどこを修正するつもりですか?

見当も付かないと次に条件追加が出てきたらどうするのですか?

なんてこともちょっと頭をよぎりましたが、
これは私が心配することではないですね??
お互い社会人ですから・・・。

【51013】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/25(土) 12:37 -

引用なし
パスワード
   ichinoseさん
返事ありがとうございます。
丸投げと解っているのですがこのように難しいコードは
私の力量では、とても完成させる力はございませんので

お願いした次第です。(-_-;)
その上でよろしくお願いします。

説明不足ですみません、再度整理したものを書きます。
No.・氏名・プロジェクトの項目列は2行目から

1.期間重複のチェック
このこの段階で 4佐藤太郎 6鈴木一男 7佐藤太郎が期間重複に
該当します。(薄い緑色)

2.打合せ日重複のチェック
期間重複該当の佐藤太郎・鈴木一男を対象に打合せ日の重複をチェック
下表の場合鈴木一男が該当F4:G4とF8:G8が重複していますので色付(黄色)
※佐藤太郎の場合打合せ日の曜日は重複していますが午前・午後でG4・G9
異なりますのでチェックにはかかりません。
こんな仕上がりを希望しています。
こんな説明でわかりますか?
重ね重ねよろしくお願いします。

A   B      C      D      E      F     G
No. 氏  名 プロジェクト   開始日    終了日   打合せ日  時間   
1 佐藤太郎 あああ      2007/4/1    2007/10/31    水    午後
2 鈴木一男 いいい      2007/3/1    2007/12/31    火    午後
3 山田次郎 ううう      2007/2/1    2007/8/31    木    午後
4 佐藤太郎 えええ      2007/10/1    2008/3/31    月    午前
5 田村三郎 おおお      2007/4/1    2007/11/30    水    午後
6 鈴木一男 かかか      2007/5/1    2008/5/31    火    午後
7 佐藤太郎 ききき      2007/8/20    2008/3/31    水    午前
8 山田次郎 くくく     2007/11/20    2008/5/31    火    午後
下へ続く

【51014】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/25(土) 14:45 -

引用なし
パスワード
   ▼ssc さん:
こんにちは。

>No.・氏名・プロジェクトの項目列は2行目から
>
>1.期間重複のチェック
>このこの段階で 4佐藤太郎 6鈴木一男 7佐藤太郎が期間重複に
>該当します。(薄い緑色)
>
>2.打合せ日重複のチェック
>期間重複該当の佐藤太郎・鈴木一男を対象に打合せ日の重複をチェック
>下表の場合鈴木一男が該当F4:G4とF8:G8が重複していますので色付(黄色)
>※佐藤太郎の場合打合せ日の曜日は重複していますが午前・午後でG4・G9
>異なりますのでチェックにはかかりません。
>こんな仕上がりを希望しています。


>
>A   B      C      D      E      F     G
>No. 氏  名 プロジェクト   開始日    終了日   打合せ日  時間   
>1 佐藤太郎 あああ      2007/4/1    2007/10/31    水    午後
>2 鈴木一男 いいい      2007/3/1    2007/12/31    火    午後
>3 山田次郎 ううう      2007/2/1    2007/8/31    木    午後
>4 佐藤太郎 えええ      2007/10/1    2008/3/31    月    午前
>5 田村三郎 おおお      2007/4/1    2007/11/30    水    午後
>6 鈴木一男 かかか      2007/5/1    2008/5/31    火    午後
>7 佐藤太郎 ききき      2007/8/20    2008/3/31    水    午前
>8 山田次郎 くくく     2007/11/20    2008/5/31    火    午後

上記のデータが入力データとして、

標準モジュールに
'============================================================
Option Explicit
'============================================================
Sub main()
  Dim rng As Range
  Dim g0 As Long
  Dim g1 As Long
  Dim c_array 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_array = get_ovl_chk_tbl(rng(g0, 2).Value)
     If TypeName(c_array) = "Boolean" Then
       Call add_ovl_chk_tbl(rng(g0, 2).Value, CLng(rng(g0, 4).Value), _
                 CLng(rng(g0, 5).Value), rng(g0, 6).Value, _
                 rng(g0, 7).Value)
     Else
       st1 = CLng(rng(g0, 4).Value)
       ed1 = CLng(rng(g0, 5).Value)
       ret = True
       For g1 = LBound(c_array) To UBound(c_array) Step 4
         If chk_ovl(st1, ed1, c_array(g1), c_array(g1 + 1)) Then
          rng(g0).Resize(, 7).Interior.ColorIndex = 35
          If rng(g0, 6).Value = c_array(g1 + 2) And _
            rng(g0, 7).Value = c_array(g1 + 3) Then
            rng(g0).Resize(, 7).Interior.ColorIndex = 6
            End If
          ret = False
          Exit For
          End If
         Next g1
       If ret = True Then
        Call add_ovl_chk_tbl(rng(g0, 2).Value, st1, ed1, _
                   rng(g0, 6).Value, rng(g0, 7).Value)
        End If
       End If
     Next g0
    term_ovl_chk_tbl
    End If
   
End Sub
'mainは多少ですが変更があります。
'============================================================
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 = st1 = ed1 And ed1 = st2 And st2 = ed2
'   前回の投稿にバグがありました↑これに変えてください
    End If
  Erase myarray

End Function


別の標準モジュールに
'=================================================================
Option Explicit
'=================================================================
Private dic As Object
Sub init_ovl_chk_tbl()
'重なりチェックリストテーブルの初期化
  Set dic = CreateObject("scripting.dictionary")

End Sub
'=================================================================
Sub term_ovl_chk_tbl()
'重なりチェックリストテーブルの終了処理
  Set dic = Nothing
End Sub
'=================================================================
Sub add_ovl_chk_tbl(ByVal c_key As Variant, ByVal st As Long, _
          ByVal ed As Long, ByVal chkdate As Variant, _
          ByVal chktime As Variant)
'重なりチェックリストテーブルへのチェックデータの追加
  Dim ans As Variant
  If dic.Exists(c_key) Then
    ans = dic(c_key)
    ReDim Preserve ans(1 To UBound(ans) + 4)
    ans(UBound(ans) - 3) = st
    ans(UBound(ans) - 2) = ed
    ans(UBound(ans) - 1) = chkdate
    ans(UBound(ans)) = chktime
    dic(c_key) = ans
  Else
    ReDim ans(1 To 4)
    ans(1) = st
    ans(2) = ed
    ans(3) = chkdate
    ans(4) = chktime
    dic.Add c_key, ans
    End If
End Sub
'=================================================================
Function get_ovl_chk_tbl(c_key As Variant) As Variant
'重なりチェックリストテーブルへからチェックデータの取得
  If dic.Exists(c_key) Then
    get_ovl_chk_tbl = dic(c_key)
  Else
    get_ovl_chk_tbl = False
    End If
End Function

'打合せ日と時間をチェックリストとして登録できるように変更しました。

テストしてみてください。

【51016】Re:期間が重複していないか確認する方法
発言  ssc  - 07/8/25(土) 16:23 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。
実行結果のですが
実行時エラー13
型が一致しませんが
出ます。
デバッグしましたが原因解りません
よろしくお願いします。

>>No.・氏名・プロジェクトの項目列は2行目から

>>A   B      C      D      E      F     G
>>No. 氏  名 プロジェクト   開始日    終了日   打合せ日  時間   
>>1 佐藤太郎 あああ      2007/4/1    2007/10/31    水    午後
>>2 鈴木一男 いいい      2007/3/1    2007/12/31    火    午後
>>3 山田次郎 ううう      2007/2/1    2007/8/31    木    午後
>>4 佐藤太郎 えええ      2007/10/1    2008/3/31    月    午前
>>5 田村三郎 おおお      2007/4/1    2007/11/30    水    午後
>>6 鈴木一男 かかか      2007/5/1    2008/5/31    火    午後
>>7 佐藤太郎 ききき      2007/8/20    2008/3/31    水    午前
>>8 山田次郎 くくく     2007/11/20    2008/5/31    火    午後
>
>上記のデータが入力データとして、
>
>標準モジュールに
>'============================================================
>Option Explicit
>'============================================================
>Sub main()
>  Dim rng As Range
>  Dim g0 As Long
>  Dim g1 As Long
>  Dim c_array 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_array = get_ovl_chk_tbl(rng(g0, 2).Value)
>     If TypeName(c_array) = "Boolean" Then
============================ここから======================
>       Call add_ovl_chk_tbl(rng(g0, 2).Value, CLng(rng(g0, 4).Value), _
>                 CLng(rng(g0, 5).Value), rng(g0, 6).Value, _
>                 rng(g0, 7).Value)
===========================-===ここまで=====================
★黄色反転です。

>     Else
>       st1 = CLng(rng(g0, 4).Value)
>       ed1 = CLng(rng(g0, 5).Value)
>       ret = True
>       For g1 = LBound(c_array) To UBound(c_array) Step 4
>         If chk_ovl(st1, ed1, c_array(g1), c_array(g1 + 1)) Then
>          rng(g0).Resize(, 7).Interior.ColorIndex = 35
>          If rng(g0, 6).Value = c_array(g1 + 2) And _
>            rng(g0, 7).Value = c_array(g1 + 3) Then
>            rng(g0).Resize(, 7).Interior.ColorIndex = 6
>            End If
>          ret = False
>          Exit For
>          End If
>         Next g1
>       If ret = True Then
>        Call add_ovl_chk_tbl(rng(g0, 2).Value, st1, ed1, _
>                   rng(g0, 6).Value, rng(g0, 7).Value)
>        End If
>       End If
>     Next g0
>    term_ovl_chk_tbl
>    End If
>   
>End Sub
>'mainは多少ですが変更があります。
>'============================================================
>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 = st1 = ed1 And ed1 = st2 And st2 = ed2
>'   前回の投稿にバグがありました↑これに変えてください
>    End If
>  Erase myarray
>
>End Function
>
>
>別の標準モジュールに
>'=================================================================
>Option Explicit
>'=================================================================
>Private dic As Object
>Sub init_ovl_chk_tbl()
>'重なりチェックリストテーブルの初期化
>  Set dic = CreateObject("scripting.dictionary")
>
>End Sub
>'=================================================================
>Sub term_ovl_chk_tbl()
>'重なりチェックリストテーブルの終了処理
>  Set dic = Nothing
>End Sub
>'=================================================================
>Sub add_ovl_chk_tbl(ByVal c_key As Variant, ByVal st As Long, _
>          ByVal ed As Long, ByVal chkdate As Variant, _
>          ByVal chktime As Variant)
>'重なりチェックリストテーブルへのチェックデータの追加
>  Dim ans As Variant
>  If dic.Exists(c_key) Then
>    ans = dic(c_key)
>    ReDim Preserve ans(1 To UBound(ans) + 4)
>    ans(UBound(ans) - 3) = st
>    ans(UBound(ans) - 2) = ed
>    ans(UBound(ans) - 1) = chkdate
>    ans(UBound(ans)) = chktime
>    dic(c_key) = ans
>  Else
>    ReDim ans(1 To 4)
>    ans(1) = st
>    ans(2) = ed
>    ans(3) = chkdate
>    ans(4) = chktime
>    dic.Add c_key, ans
>    End If
>End Sub
>'=================================================================
>Function get_ovl_chk_tbl(c_key As Variant) As Variant
>'重なりチェックリストテーブルへからチェックデータの取得
>  If dic.Exists(c_key) Then
>    get_ovl_chk_tbl = dic(c_key)
>  Else
>    get_ovl_chk_tbl = False
>    End If
>End Function
>
>'打合せ日と時間をチェックリストとして登録できるように変更しました。
>
>テストしてみてください。

【51017】Re:期間が重複していないか確認する方法
お礼  ssc  - 07/8/25(土) 16:38 -

引用なし
パスワード
   標準モジュールに
'============================================================
Option Explicit
'============================================================
Sub main()
  Dim rng As Range
  Dim g0 As Long
  Dim g1 As Long
  Dim c_array 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))
          ↑a3に変えてうまくいきました。★★

  If rng.Row > 1 Then
    init_ovl_chk_tbl
    For g0 = 1 To rng.Count
     c_array = get_ovl_chk_tbl(rng(g0, 2).Value)
     If TypeName(c_array) = "Boolean" Then
       Call add_ovl_chk_tbl(rng(g0, 2).Value, CLng(rng(g0, 4).Value), _
                 CLng(rng(g0, 5).Value), rng(g0, 6).Value, _
                 rng(g0, 7).Value)

【51025】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/26(日) 0:10 -

引用なし
パスワード
   ichinoseさん
何度も質問すみませんが
項目のNo.はチェック対象からはずせるのでしょうか
No.は先に記入してあるため
No.以外は空値のときに重複対象の黄色が表示されてしまうのですが

よろしくお願いします。

【51026】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/26(日) 0:19 -

引用なし
パスワード
   ▼ssc さん:
>何度も質問すみませんが
>項目のNo.はチェック対象からはずせるのでしょうか
ん?Noは、そもそもチェック対象になっていません。

>No.は先に記入してあるため
>No.以外は空値のときに重複対象の黄色が表示されてしまうのですが
これが不具合なら、この不具合が再現できる例を記述して下さい。
もちろん、本来なら、こういう結果がほしという正解もね!!

【51027】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/26(日) 0:34 -

引用なし
パスワード
   ▼ichinose さん:
返事ありがとうございます。

>>何度も質問すみませんが
>>項目のNo.はチェック対象からはずせるのでしょうか
>ん?Noは、そもそもチェック対象になっていません。
>
>>No.は先に記入してあるため
>>No.以外は空値のときに重複対象の黄色が表示されてしまうのですが
>これが不具合なら、この不具合が再現できる例を記述して下さい。
>もちろん、本来なら、こういう結果がほしという正解もね!!

不具合と言うことではないのですが
No.列(A列は)先に1〜120ぐらいまで先に連番で記入済みにしたあるのですが
このとき氏名から時間列はまだ未記入状態ののときに
ここでmainを実行すると、今回の表を例にしたばあい
No.10以降が全て黄色になってしまいます。
↑これを避けたいのですが修正箇所がいまいち
わかりませんでした。
何度も申し訳ないのですが
よろしくお願いします。

【51028】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/26(日) 0:45 -

引用なし
パスワード
   ▼ssc さん:
>>>No.は先に記入してあるため
>>>No.以外は空値のときに重複対象の黄色が表示されてしまうのですが
>>これが不具合なら、この不具合が再現できる例を記述して下さい。
>>もちろん、本来なら、こういう結果がほしという正解もね!!
>
>不具合と言うことではないのですが
>No.列(A列は)先に1〜120ぐらいまで先に連番で記入済みにしたあるのですが
>このとき氏名から時間列はまだ未記入状態ののときに
>ここでmainを実行すると、今回の表を例にしたばあい
>No.10以降が全て黄色になってしまいます。
なるほど、これは現在セル範囲を取得するのに
A列に着眼して取得しているのが原因です。
B列の名前で取得してみてはいかがですか?

  Set rng = Range("b2", Cells(Rows.Count, 2).End(xlUp))

勿論基準が違ってきますから、それ以降の例えば

c_array = get_ovl_chk_tbl(rng(g0, 2).Value)

というコードも

c_array = get_ovl_chk_tbl(rng(g0, 1).Value)

としなければなりませんが・・。

今回は全部修正しませんので、上記の記述でご自分で修正してみてください


>↑これを避けたいのですが修正箇所がいまいち
>わかりませんでした。
>何度も申し訳ないのですが
>よろしくお願いします。

【51030】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/26(日) 1:55 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。
一様自分なりに修正してみました。
結果もいい感じなのですが
間違いないでしょうかチョット自信がありません
確認宜しくお願いします。
'============================================================
Option Explicit
'============================================================
Sub main()
  Dim rng As Range
  Dim g0 As Long
  Dim g1 As Long
  Dim c_array As Variant
  Dim st1 As Long, ed1 As Long
  Dim ret As Boolean
  
  Set rng = Range("A3", Cells(Rows.Count, 6).End(xlUp))
  rng.Interior.ColorIndex = xlNone
  
'Cells.Interior.ColorIndex = xlNone★項目行色設定のため上記コードに変更
  Set rng = Range("b3", Cells(Rows.Count, 2).End(xlUp))
  If rng.Row > 1 Then
    init_ovl_chk_tbl
    For g0 = 1 To rng.Count
     c_array = get_ovl_chk_tbl(rng(g0, 1).Value)
     If TypeName(c_array) = "Boolean" Then
       Call add_ovl_chk_tbl(rng(g0, 1).Value, CLng(rng(g0, 3).Value), _
                 CLng(rng(g0, 4).Value), rng(g0, 5).Value, _
                 rng(g0, 6).Value)
     Else
       st1 = CLng(rng(g0, 3).Value)
       ed1 = CLng(rng(g0, 4).Value)
       ret = True
       For g1 = LBound(c_array) To UBound(c_array) Step 4
         If chk_ovl(st1, ed1, c_array(g1), c_array(g1 + 1)) Then
          rng(g0).Resize(, 6).Interior.ColorIndex = 35
          If rng(g0, 5).Value = c_array(g1 + 2) And _
            rng(g0, 6).Value = c_array(g1 + 3) Then
            rng(g0).Resize(, 6).Interior.ColorIndex = 6
            End If
          ret = False
          Exit For
          End If
         Next g1
       If ret = True Then
        Call add_ovl_chk_tbl(rng(g0, 1).Value, st1, ed1, _
                   rng(g0, 5).Value, rng(g0, 6).Value)
        End If
       End If
     Next g0
    term_ovl_chk_tbl
    End If
  
End Sub

【51050】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/26(日) 22:18 -

引用なし
パスワード
   ▼ssc さん:
こんばんは。
>一様自分なりに修正してみました。
>結果もいい感じなのですが
>間違いないでしょうかチョット自信がありません

>'============================================================
>Option Explicit
>'============================================================
>Sub main()
>  Dim rng As Range
>  Dim g0 As Long
>  Dim g1 As Long
>  Dim c_array As Variant
>  Dim st1 As Long, ed1 As Long
>  Dim ret As Boolean
>  
>  Set rng = Range("A3", Cells(Rows.Count, 6).End(xlUp))
>  rng.Interior.ColorIndex = xlNone
>  
>'Cells.Interior.ColorIndex = xlNone★項目行色設定のため上記コードに変更
>  Set rng = Range("b3", Cells(Rows.Count, 2).End(xlUp))
'           ↑これは、実データは、3行目からなのですか?
'           だとしたら・・・、
  If rng.Row > 1 Then 'rng.Row>2 
>    init_ovl_chk_tbl
>    For g0 = 1 To rng.Count
>     c_array = get_ovl_chk_tbl(rng(g0, 1).Value)
>     If TypeName(c_array) = "Boolean" Then
>       Call add_ovl_chk_tbl(rng(g0, 1).Value, CLng(rng(g0, 3).Value), _
>                 CLng(rng(g0, 4).Value), rng(g0, 5).Value, _
>                 rng(g0, 6).Value)
>     Else
>       st1 = CLng(rng(g0, 3).Value)
>       ed1 = CLng(rng(g0, 4).Value)
>       ret = True
>       For g1 = LBound(c_array) To UBound(c_array) Step 4
>         If chk_ovl(st1, ed1, c_array(g1), c_array(g1 + 1)) Then
>          rng(g0).Resize(, 6).Interior.ColorIndex = 35
'           A列が塗りつぶされないでしょ? 良いのですか?
'           A列も塗りつぶすなら考えてください
>          If rng(g0, 5).Value = c_array(g1 + 2) And _
>            rng(g0, 6).Value = c_array(g1 + 3) Then
>            rng(g0).Resize(, 6).Interior.ColorIndex = 6
>            End If
>          ret = False
>          Exit For
>          End If
>         Next g1
>       If ret = True Then
>        Call add_ovl_chk_tbl(rng(g0, 1).Value, st1, ed1, _
>                   rng(g0, 5).Value, rng(g0, 6).Value)
>        End If
>       End If
>     Next g0
>    term_ovl_chk_tbl
>    End If
>  
>End Sub

【51052】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/26(日) 22:54 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。
>>'============================================================
>>Option Explicit
>>'============================================================
>>Sub main()
>>  Dim rng As Range
>>  Dim g0 As Long
>>  Dim g1 As Long
>>  Dim c_array As Variant
>>  Dim st1 As Long, ed1 As Long
>>  Dim ret As Boolean
>>  
>>  Set rng = Range("A3", Cells(Rows.Count, 6).End(xlUp))
>>  rng.Interior.ColorIndex = xlNone
>>  
>>'Cells.Interior.ColorIndex = xlNone★項目行色設定のため上記コードに変更
>>  Set rng = Range("b3", Cells(Rows.Count, 2).End(xlUp))
>'           ↑これは、実データは、3行目からなのですか?
>'           だとしたら・・・、
>   If rng.Row > 1 Then 'rng.Row>2 ★okできました
>>    init_ovl_chk_tbl
>>    For g0 = 1 To rng.Count
>>     c_array = get_ovl_chk_tbl(rng(g0, 1).Value)
>>     If TypeName(c_array) = "Boolean" Then
>>       Call add_ovl_chk_tbl(rng(g0, 1).Value, CLng(rng(g0, 3).Value), _
>>                 CLng(rng(g0, 4).Value), rng(g0, 5).Value, _
>>                 rng(g0, 6).Value)
>>     Else
>>       st1 = CLng(rng(g0, 3).Value)
>>       ed1 = CLng(rng(g0, 4).Value)
>>       ret = True
>>       For g1 = LBound(c_array) To UBound(c_array) Step 4
>>         If chk_ovl(st1, ed1, c_array(g1), c_array(g1 + 1)) Then
>>          rng(g0).Resize(, 6).Interior.ColorIndex = 35
>'           A列が塗りつぶされないでしょ? 良いのですか?
            ★塗るつぶす方でrng(g0).Resize(-1, 6)としてみたので             すがうまくいきませんでした。修正箇所違いますか?
             よろしくお願いします。
>'           A列も塗りつぶすなら考えてください
>>          If rng(g0, 5).Value = c_array(g1 + 2) And _
>>            rng(g0, 6).Value = c_array(g1 + 3) Then
>>            rng(g0).Resize(, 6).Interior.ColorIndex = 6
>>            End If

【51053】Re:期間が重複していないか確認する方法
質問  ssc  - 07/8/26(日) 23:15 -

引用なし
パスワード
   ▼ichinose さん:
下記でいかがでしょうか
       For g1 = LBound(c_array) To UBound(c_array) Step 4
         If chk_ovl(st1, ed1, c_array(g1), c_array(g1 + 1)) Then
          rng(g0).Offset(0, -1).Resize(, 7).Interior.ColorIndex = 35
          
          If rng(g0, 5).Value = c_array(g1 + 2) And _
            rng(g0, 6).Value = c_array(g1 + 3) Then
            rng(g0).Offset(0, -1).Resize(, 7).Interior.ColorIndex = 6
            End If
          ret = False
          Exit For
          End If

【51054】Re:期間が重複していないか確認する方法
発言  ichinose  - 07/8/27(月) 8:04 -

引用なし
パスワード
   ▼ssc さん:

おはようございます。

よいと思います。

ひとつだけ・・・。

私もよくするミスですが、

同じオブジェクトを表現するのに違う書式使わないことです。

c_array = get_ovl_chk_tbl(rng(g0, 1).Value)



rng(g0, 1)



rng(g0).Offset(0, -1).Resize(, 7).Interior.ColorIndex = 35



rng(g0)

は同じセルを指していますよね?

この場合、どちらかに統一しましょう!!

後で読み返すと

「何故書き方を変えたのだろう? 深い意味があるかもしれない」

なんて要らぬ推測に頭を悩ませなければならないかもしれませんから・・・。

こんなところです。

【51059】Re:期間が重複していないか確認する方法
お礼  ssc  - 07/8/27(月) 9:45 -

引用なし
パスワード
   ▼ichinose さん:
長時間にわたり、vba素人の私にお付き合いいただき
誠にありがとうございました。
安心しました・・・
少しづつですが、理解していこうと思ってます。
また、お尋ねすることもあると思いますが
よろしくお願いします。
解決です!!
>おはようございます。
>
>よいと思います。
>
>ひとつだけ・・・。
>
>私もよくするミスですが、
>
>同じオブジェクトを表現するのに違う書式使わないことです。
>
>c_array = get_ovl_chk_tbl(rng(g0, 1).Value)
>
>の
>
>rng(g0, 1)
>
>と
>
>rng(g0).Offset(0, -1).Resize(, 7).Interior.ColorIndex = 35
>
>の
>
>rng(g0)
>
>は同じセルを指していますよね?
>
>この場合、どちらかに統一しましょう!!
>
>後で読み返すと
>
>「何故書き方を変えたのだろう? 深い意味があるかもしれない」
>
>なんて要らぬ推測に頭を悩ませなければならないかもしれませんから・・・。
>
>こんなところです。

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