アプリ版:「スタンプのみでお礼する」機能のリリースについて

期間重複チェック。コード以外での回答は遠慮下さい

VB2005+SQLServer2005で開発を行っています。
期間を3つ入力してデータを抽出する
プログラムを作っているのですが
期間重複チェックがわかりません


期間(1)~期間(3)まであります(抽出条件)
1,2,3各期間重複する場合は再入力させるとしか
仕様書に書かれておらず
プログラミングできず困っています。

期間(1)
txtStartDate1.text
txtEndDate1.text

期間(2)
txtStartDate2.text
txtEndDate2.text

期間(3)
txtStartDate3.text
txtEndDate3.text

実を言うとvisual basicのカテゴリでも同じような
質問をしたのですがプログラムコードの回答が得られず
困っています。プログラマに向いていないというような
回答も見受けられましたがどうしても
プログラムコードでの回答がほしいです
皆さんお忙しい中申し訳ありませんが
プログラムコードでのご回答をお願いいたします。
コード以外でのご回答はご遠慮ください

私はこの仕事に向いていないのでしょうか
毎日つらいです。

A 回答 (7件)

・日付1の終了日と日付2の開始日が同一の場合は重複とするのか?


・エラーが発生した場合はどういう挙動をさせるのか?
 (フォーカス遷移や、メッセージがそれぞれ異なるのか?)
・NGとしても他の検証を進め、最後にエラー内容を一挙に出力するのか?

など、仕様としては疑問に残る箇所が多々ありますが、無視してコードすると
このようになるでしょう。
ちょっと一部汚くなってしまいましたが。


私が書いたロジックは、全て調べればすぐに分かることです。
意味が理解できなければ調べましょう。
丸投げは良くありませんよ。
学習すること、考えることを放棄しているようにしか感じられません。


Public Class Form1

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' 入力値検証
    If Not Validate() Then
      MessageBox.Show("NG")
      Return
    End If

    MessageBox.Show("OK")
  End Sub

  ''' <summary>
  ''' 入力値検証メソッド
  ''' </summary>
  ''' <returns>True:OK, False:NG</returns>
  ''' <remarks></remarks>
  Private Shadows Function Validate() As Boolean
    ' ~ 予め、日付1, 2, 3が入力されている場合に、日付として妥当かなどのチェックがあったりなかったり ~


    ' 期間検証
    Dim ResultControl As Control = Nothing
    If Not IsValidDateRange(ResultControl) Then
      ResultControl.Focus()
      Return False
    End If

    Return True
  End Function

  ''' <summary>
  ''' 期間検証メソッド
  ''' </summary>
  ''' <param name="Result">エラー発生コントロール</param>
  ''' <returns>True:OK, False:NG</returns>
  ''' <remarks></remarks>
  Private Function IsValidDateRange(ByRef Result As Control) As Boolean
    Dim sdt1 As Date
    Dim edt1 As Date
    Dim sdt2 As Date
    Dim edt2 As Date
    Dim sdt3 As Date
    Dim edt3 As Date
    Dim parseResult As Boolean

    ' 日付1、日付2の重複チェック
    parseResult = True
    parseResult = parseResult And Date.TryParse(txtStartDate1.Text, sdt1)
    parseResult = parseResult And Date.TryParse(txtEndDate1.Text, edt1)
    parseResult = parseResult And Date.TryParse(txtStartDate2.Text, sdt2)
    parseResult = parseResult And Date.TryParse(txtEndDate2.Text, edt2)
    If parseResult Then
      If IsDuplicateDateRange(sdt1, edt1, sdt2, edt2) Then
        Result = txtStartDate1
        Return False
      End If
    End If

    ' 日付2、日付3の重複チェック
    parseResult = True
    parseResult = parseResult And Date.TryParse(txtStartDate2.Text, sdt2)
    parseResult = parseResult And Date.TryParse(txtEndDate2.Text, edt2)
    parseResult = parseResult And Date.TryParse(txtStartDate3.Text, sdt3)
    parseResult = parseResult And Date.TryParse(txtEndDate3.Text, edt3)
    If parseResult Then
      If IsDuplicateDateRange(sdt2, edt2, sdt3, edt3) Then
        Result = txtStartDate2
        Return False
      End If
    End If

    ' 日付3、日付1の重複チェック
    parseResult = True
    parseResult = parseResult And Date.TryParse(txtStartDate3.Text, sdt3)
    parseResult = parseResult And Date.TryParse(txtEndDate3.Text, edt3)
    parseResult = parseResult And Date.TryParse(txtStartDate1.Text, sdt1)
    parseResult = parseResult And Date.TryParse(txtEndDate1.Text, edt1)
    If parseResult Then
      If IsDuplicateDateRange(sdt3, edt3, sdt1, edt1) Then
        Result = txtStartDate3
        Return False
      End If
    End If

    Return True
  End Function

  ''' <summary>
  ''' 重複チェックメソッド
  ''' </summary>
  ''' <param name="SourceStartDate">基準開始日付</param>
  ''' <param name="SourceEndDate">基準終了日付</param>
  ''' <param name="TargetStartDate">対象開始日付</param>
  ''' <param name="TargetEndDate">対象終了日付</param>
  ''' <returns>True:重複あり, False:重複なし</returns>
  ''' <remarks></remarks>
  Private Function IsDuplicateDateRange(ByRef SourceStartDate As Date, ByRef SourceEndDate As Date, _
      ByRef TargetStartDate As Date, ByRef TargetEndDate As Date) As Boolean
    ' <--------->
    '  <---->
    If SourceStartDate <= TargetStartDate And SourceEndDate >= TargetEndDate Then
      Return True
    End If

    '<--------->
    '  <---------->
    ' と
    '   <--------->
    ' <-------------------->
    If SourceEndDate >= TargetStartDate And SourceEndDate <= TargetEndDate Then
      Return True
    End If

    '   <--------->
    ' <------>
    If SourceStartDate >= TargetStartDate And SourceStartDate <= TargetEndDate Then
      Return True
    End If

    Return False
  End Function
End Class
    • good
    • 0

>単純に上からコードを記述したらメッセージボックスが何回も出力されてしまいました。



一度でも「重複している」と判断したら、もうそれ以上判定を行ってはいけません。

当方の示したコードは

If CDate(txtStartDate1.text) = CDate(txtStartDate2.text) Then
GoTo 再入力
End If

のように、重複と判明した段階でGoTo文で飛んで、それ以上判定しないようになっています。

質問者さんの

If txtStartDate1.Text = txtStartDate2.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate1.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If
(以下略)

と言うコードでは、重複と判明したらメッセージボックスを表示するまでは良いのですが、その後もやらなくても良い判定を続けてしまいます。

日本語で表記した場合、当方のプログラムは、本来であれば

条件1が成り立ったら、再入力へ飛ぶ。
さもなくば、条件2が成り立ったら、再入力へ飛ぶ。
さもなくば、条件3が成り立ったら、再入力へ飛ぶ。
さもなくば、条件4が成り立ったら、再入力へ飛ぶ。
さもなくば、条件5が成り立ったら、再入力へ飛ぶ。
さもなくば、サーチを実行する。'←どの条件も成り立たなかった場合

と書くべきなのですが、どれか1つでも条件が成り立って「再入力へ飛ぶ」と、それ以上の判定は行わないので

条件1が成り立ったら、再入力へ飛ぶ。
次に、条件2が成り立ったら、再入力へ飛ぶ。
次に、条件3が成り立ったら、再入力へ飛ぶ。
次に、条件4が成り立ったら、再入力へ飛ぶ。
次に、条件5が成り立ったら、再入力へ飛ぶ。
次に、サーチを実行する。'←どの条件も成り立たなかった場合

と書いているのです。

一方、質問者さんのプログラムの場合は

条件1が成り立ったら、メッセージボックス表示。
次に、条件2が成り立ったら、メッセージボックス表示。
次に、条件3が成り立ったら、メッセージボックス表示。
次に、条件4が成り立ったら、メッセージボックス表示。
次に、条件5が成り立ったら、メッセージボックス表示。

となっている為、条件が成り立ってメッセージボックスを表示した後も、引き続いて「余計な判定」を続けてしまいます。

それを防ぐには、

条件1が成り立ったら、メッセージボックス表示。
さもなくば、条件2が成り立ったら、メッセージボックス表示。
さもなくば、条件3が成り立ったら、メッセージボックス表示。
さもなくば、条件4が成り立ったら、メッセージボックス表示。
さもなくば、条件5が成り立ったら、メッセージボックス表示。
さもなくば、サーチを実行する。'←どの条件も成り立たなかった場合

と「本来の書き方」をしないといけません。

実際のコードで書くと

If txtStartDate1.Text = txtStartDate2.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate2.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text < txtStartDate2.Text And txtEndDate1.Text >= txtStartDate2.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text < txtStartDate3.Text And txtEndDate1.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate2.Text < txtStartDate3.Text And txtEndDate2.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text > txtStartDate2.Text And txtStartDate1.Text <= txtEndDate2.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text > txtStartDate3.Text And txtStartDate1.Text <= txtEndDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate2.Text > txtStartDate3.Text And txtStartDate2.Text <= txtEndDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text = txtStartDate2.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate2.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text < txtStartDate2.Text And txtEndDate1.Text >= txtStartDate2.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text < txtStartDate3.Text And txtEndDate1.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate2.Text < txtStartDate3.Text And txtEndDate2.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text > txtStartDate2.Text And txtStartDate1.Text <= txtEndDate2.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
ElseIf txtStartDate1.Text > txtStartDate3.Text And txtStartDate1.Text <= txtEndDate3.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
ElseIf txtStartDate2.Text > txtStartDate3.Text And txtStartDate2.Text <= txtEndDate3.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
Else
サーチ処理をする
End If

となります。

最後が

Else
サーチ処理をする
End If

になっている事に注意しましょう。

もし

If txtStartDate1.Text = txtStartDate2.Text Then
MsgBox("期間が重複しています。")
ElseIf txtStartDate1.Text = txtStartDate3.Text Then
(略)
ElseIf txtStartDate2.Text > txtStartDate3.Text And txtStartDate2.Text <= txtEndDate3.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
End If
サーチ処理をする

だと、「重複している」とのメッセージボックスを表示した後に、サーチ処理をしてしまいます。

質問者さんは「メッセージボックスを表示したあと、サーチ処理をしないで終わらせる方法」を考えていましたか?

サーチ処理をして良いのは「メッセージボックスを1つも表示しなかった場合だけ」だと言うのを判っていましたか?

>日本語を理解する能力が不足しているために度々先輩に怒られます。

だとすると、どの職業に就いても同じように苦労すると思われます。「プログラマーに向いてない」と言うより「考えるのに向いてない」のだと思います。

芸術家とか、音楽家とか、クリエィティブな仕事だと、上手く行くような気がします。

なお、脳梁部部分欠損症などで、軽度の高次脳機能障害があると、日本語を理解する能力が不足したりするので、一度、専門医に精密検査してもらう事をお薦めします。

この回答への補足

現在、貴方様がつくられたプログラムですと
期間(1)~期間(3)全て入力されていないと(""があると重複となる)
必ず重複となってしまいます。
そこの部分をお礼に欄に書いた仕様追加したコードをご回答願えませんでしょうか
わがままをいって大変申し訳ありません

補足日時:2013/02/14 18:04
    • good
    • 0
この回答へのお礼

何度もご回答いただきありがとうございました。
もう一つ教えて欲しいことがあるのですが
貴方様が作成したプログラムに
期間(1)
txtstartdate1.textとtxtenddate1.textは
必須入力で
期間(2)
txtstartdate2.textとtxtenddate2.textは任意入力
期間(3)
txtstartdate3.textとtxtenddate3.textは任意入力

開始が入力されたら必ず終了も入力するという
仕様が抜けていました。
大変いいずらいのですがお力をおかし願いませんでしょうか
よろしくお願いいたします。

お礼日時:2013/02/14 17:58

No.3


>1.期間の組み合わせとしては以下があります。
改めて考えてみた所、ケース(6)がありました。
それは、宿題としますので自分で考えてみて下さい。
#テストケースを作る時に必要です。
    • good
    • 0

No.3


誤:(2)期間2Start < 期間1End -> 重複無し
正:(2)期間2Start > 期間1End -> 重複無し
    • good
    • 0

1.期間の組み合わせとしては以下があります。


(1)期間2End < 期間1Start -> 重複無し
期間1:______<=====>
期間2:<===>

(2)期間2Start < 期間1End -> 重複無し
期間1:____<=====>
期間2:____________<===>

(3)期間2Endが期間1Startと期間1Endの範囲内 -> 重複有り
期間1:_____<=====>
期間2:___<===>

(4)期間2Startが期間1Startと期間1Endの範囲内 -> 重複有り
期間1:_____<=====>
期間2:_________<===>

(5)期間2Endが期間1Startと期間1Endの範囲内 -> 重複有り
 (期間2Startが期間1Startと期間1Endの範囲内 -> 重複有り)
期間1:_____<=====>
期間2:______<===>
※(5)のケースは(3)(4)でチェック可能なので省略可能

2.チェックが必要な期間は3つあるので
(1)期間1と期間2
(2)期間1と期間3
(3)期間2と期間3
で比較処理を行って、1つでも重複があった場合は重複エラーとする。
但し、期間が未入力の場合はチェックは行わない。
#期間Start<=期間Endのチェックは必須
#全てが未入力だった場合をエラーとする場合は別途にチェックが必要

3.
>単純に上からコードを記述したらメッセージボックスが何回も出力されてしまいました。

  エラーNo = 1
  Do
    If 条件1 = エラー Then
      Exit Do
    End if
    .
    .
    If 条件n = エラー Then
      Exit Do
    End if

    エラーNo = 0
  Loop While 1
  If エラーNo <> 0 Then
    MsgBox("期間が重複しています。")
  End If

◆後は、上記を具体的なコードに落とすだけです。


>私はこの仕事に向いていないのでしょうか
中小企業診断士の資格をとろうと思います。
http://oshiete.goo.ne.jp/qa/7890398.html
>2年間位(仕事をしながら)勉強してとれればいいなと思っています。
↑の様な事を質問している暇があるぐらいなら、目の前の仕事を
ちゃんとこなしていきましょう!!
    • good
    • 0

追記。



>1,2,3各期間重複する場合は再入力させるとしか
>仕様書に書かれておらず

「プログラミングする」とは「処理の細分化を行う」って事です。

「1,2,3各期間重複する場合」を細分化すると「1と2が重複する場合、または、1と3が重複する場合、または、2と3が重複する場合」になります。

結局は「AとBが重複する場合」を「1と2、1と3、2と3で、合計3回やる」って事です。

「AとBが重複する場合」を細分化すると「Aが先に始まる場合」と「AとBが同時に始まる場合」と「Bが先に始まる場合」になります。

このうち「AとBが同時に始まる」ってのは明らかに重複してますから、条件判断してエラーにします。

次に「Aが先に始まる場合」を細分化して「Aが先に始まって、Aが終わる前にBが始まる」「Aが先に始まって、Aが終わると同時にBが始まる」「Aが先に始まって、Aが終わってからBが始まる」に細分化します。

このうち、「Aが先に始まって、Aが終わる前にBが始まる」「Aが先に始まって、Aが終わると同時にBが始まる」ってのは明らかに重複してますから、条件判断してエラーにします。

「Bが先に始まる場合」も同様に細分化すれば、同様に、条件が導けるようになります。

結局「言語仕様に合わせた細かさまで細分化すれば、プログラムが書ける筈」なのです。

これは、visual basicもC言語もアセンブラも同じです。

処理を「ここのメモリの内容をCPUのレジスタにロードする」って感じの所まで究極に細分化すれば、アセンブラで書く事だって可能です。
    • good
    • 0
この回答へのお礼

ご回答度々いただきありがとうございます。
日本語を理解する能力が不足しているために度々先輩に怒られます。
今回も詳しい説明をいただいているにもかかわらず理解力不足のため
?が残ります。この仕事に向いていないのかもしれません。
よくわかっています。馬鹿だなって思い自信が全く持てません。
まことにいいにくいのですがif文を入れ子にした
完成したプログラムコードでの回答をいただけませんでしょうか。
わがまま言って申し訳ありません。

お礼日時:2013/02/13 16:56

まず、期間1~3の順番について、すべてのケースを考えます。



期間1の開始<期間2の開始<期間3の開始⇒次のステップへ
期間1の開始<期間2の開始=期間3の開始⇒重複エラー
期間1の開始<期間2の開始>期間3の開始⇒次のステップへ
期間1の開始=期間2の開始<期間3の開始⇒重複エラー
期間1の開始=期間2の開始=期間3の開始⇒重複エラー
期間1の開始=期間2の開始>期間3の開始⇒重複エラー
期間1の開始>期間2の開始<期間3の開始⇒次のステップへ
期間1の開始>期間2の開始=期間3の開始⇒重複エラー
期間1の開始>期間2の開始>期間3の開始⇒次のステップへ
期間1の開始<期間3の開始<期間2の開始⇒次のステップへ
期間1の開始<期間3の開始=期間2の開始⇒重複エラー
期間1の開始<期間3の開始>期間2の開始⇒次のステップへ
期間1の開始=期間3の開始<期間2の開始⇒重複エラー
期間1の開始=期間3の開始=期間2の開始⇒重複エラー
期間1の開始=期間3の開始>期間2の開始⇒重複エラー
期間1の開始>期間3の開始<期間2の開始⇒次のステップへ
期間1の開始>期間3の開始=期間2の開始⇒重複エラー
期間1の開始>期間3の開始>期間2の開始⇒次のステップへ

結局、期間の開始で一致が起きたら、重複している、と言う事です。

コードで書くと

If CDate(txtStartDate1.text) = CDate(txtStartDate2.text) Then
GoTo 再入力
End If
If CDate(txtStartDate1.text) = CDate(txtStartDate3.text) Then
GoTo 再入力
End If
If CDate(txtStartDate2.text) = CDate(txtStartDate3.text) Then
GoTo 再入力
End If

となります。

次に

期間1の開始<期間2の開始
期間1の開始<期間3の開始
期間2の開始<期間3の開始
期間1の開始>期間2の開始
期間1の開始>期間3の開始
期間2の開始>期間3の開始

の6つのパターンについて、1つづつ個別に考えます。

期間1の開始<期間2の開始

の場合、エラーにならないのは

期間1の終了<期間2の開始

の場合だけです。

期間1の終了=期間2の開始

期間1の終了>期間2の開始

では、1の終了と2の開始が同じ日に重複しているか、1が終了する前に2が開始しています。

コードで書くと

If CDate(txtStartDate1.text) < CDate(txtStartDate2.text) And CDate(txtEndDate1.text) >= CDate(txtStartDate2.text) Then
GoTo 再入力
End If

期間1の開始<期間3の開始

の場合、エラーにならないのは

期間1の終了<期間3の開始

の場合だけです。

期間1の終了=期間3の開始

期間1の終了>期間3の開始

では、1の終了と3の開始が同じ日に重複しているか、1が終了する前に3が開始しています。

コードで書くと

If CDate(txtStartDate1.text) < CDate(txtStartDate3.text) And CDate(txtEndDate1.text) >= CDate(txtStartDate3.text) Then
GoTo 再入力
End If

期間2の開始<期間3の開始

の場合、エラーにならないのは

期間2の終了<期間3の開始

の場合だけです。

期間2の終了=期間3の開始

期間2の終了>期間3の開始

では、2の終了と3の開始が同じ日に重複しているか、2が終了する前に3が開始しています。

コードで書くと

If CDate(txtStartDate2.text) < CDate(txtStartDate3.text) And CDate(txtEndDate2.text) >= CDate(txtStartDate3.text) Then
GoTo 再入力
End If

残りの3つも同様にコードで書くと

If CDate(txtStartDate1.text) > CDate(txtStartDate2.text) And CDate(txtStartDate1.text) <= CDate(txtEndDate2.text) Then
GoTo 再入力
End If
If CDate(txtStartDate1.text) > CDate(txtStartDate3.text) And CDate(txtStartDate1.text) <= CDate(txtEndDate3.text) Then
GoTo 再入力
End If
If CDate(txtStartDate2.text) > CDate(txtStartDate3.text) And CDate(txtStartDate2.text) <= CDate(txtEndDate3.text) Then
GoTo 再入力
End If

となります。

---

こういうのを考える場合、AとBの2つの期間で、有り得る組み合わせを、すべてグラフ化してみましょう。

1.AとBが同時に始まる

1.1.AとBが同時に終わる

AAAAAAA
BBBBBBB

1.2.Aが先に終わる

AAAA
BBBBBBB

1.3.Bが先に終わる

AAAAAAA
BBBB

1.1、1.2、1.3のどれもエラーです。

If CDate(txtStartDate1.text) = CDate(txtStartDate2.text) Then
GoTo 再入力
End If

AとBで成り立つ事は、AとC、BとCでも成り立ちます。

If CDate(txtStartDate1.text) = CDate(txtStartDate3.text) Then
GoTo 再入力
End If
If CDate(txtStartDate2.text) = CDate(txtStartDate3.text) Then
GoTo 再入力
End If

2.Aが先に始まる

2.1.Aが終わる前にBが始まる

2.1.1.AとBが同時に終わる

AAAAAAAA
  BBBBBB

2.1.2.Aが先に終わる

AAAAA
  BBBBBB

2.1.3.Bが先に終わる

AAAAAAAAAAA
  BBBBBB

2.2.Aが終わる日にBが始まる

AAAAA
    BBBBBB

2.3.Aが終わってからBが始まる

AAAAA
       BBBBBB

結局、Aが終わる前にBが始まる(同時含む)とエラーです。

If CDate(txtStartDate1.text) < CDate(txtStartDate2.text) And CDate(txtEndDate1.text) >= CDate(txtStartDate2.text) Then
GoTo 再入力
End If

AとBで成り立つ事は、AとC、BとCでも成り立ちます。

If CDate(txtStartDate1.text) < CDate(txtStartDate3.text) And CDate(txtEndDate1.text) >= CDate(txtStartDate3.text) Then
GoTo 再入力
End If
If CDate(txtStartDate2.text) < CDate(txtStartDate3.text) And CDate(txtEndDate2.text) >= CDate(txtStartDate3.text) Then
GoTo 再入力
End If

3.Bが先に始まる

3.1.Bが終わる前にAが始まる

3.1.1.AとBが同時に終わる

  AAAAAA
BBBBBBBB

3.1.2.Bが先に終わる

  AAAAA
BBBBBB

3.1.3.Aが先に終わる

  AAAAAAA
BBBBBBBBBBB

3.2.Bが終わる日にAが始まる

     AAAAA
BBBBBB

3.3.Bが終わってからAが始まる

BBBBBB
       AAAAA

結局、Bが終わる前にAが始まる(同時含む)とエラーです。

If CDate(txtStartDate1.text) > CDate(txtStartDate2.text) And CDate(txtStartDate1.text) <= CDate(txtEndDate2.text) Then
GoTo 再入力
End If

AとBで成り立つ事は、AとC、BとCでも成り立ちます。

If CDate(txtStartDate1.text) > CDate(txtStartDate3.text) And CDate(txtStartDate1.text) <= CDate(txtEndDate3.text) Then
GoTo 再入力
End If
If CDate(txtStartDate2.text) > CDate(txtStartDate3.text) And CDate(txtStartDate2.text) <= CDate(txtEndDate3.text) Then
GoTo 再入力
End If

以上。
    • good
    • 0
この回答へのお礼

お忙しい中長文でのご回答ありがとうございました。
貴方様がおっしゃる様にコードを並べたのでが並べるだけではだめなようです。
単純に上からコードを記述したらメッセージボックスが何回も出力されてしまいました。
if文を入れ子にしないとだめなようです。
if文を入れ子にしたコードをご回答願えませんでしょうか
後<= の様に記述したパターンもあると助かります。本当にわがままを言って申し訳ありません
Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click
If txtStartDate1.Text = txtStartDate2.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate1.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate2.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If

If txtStartDate1.Text < txtStartDate2.Text And txtEndDate1.Text >= txtStartDate2.Text Then
MsgBox("期間が重複しています。")
End If

If txtStartDate1.Text < txtStartDate3.Text And txtEndDate1.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If

If txtStartDate2.Text < txtStartDate3.Text And txtEndDate2.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If

If txtStartDate1.Text > txtStartDate2.Text And txtStartDate1.Text <= txtEndDate2.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate1.Text > txtStartDate3.Text And txtStartDate1.Text <= txtEndDate3.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate2.Text > txtStartDate3.Text And txtStartDate2.Text <= txtEndDate3.Text Then
MsgBox("期間が重複しています。")
End If

If txtStartDate1.Text = txtStartDate2.Text Then
MsgBox("期間が重複しています。")
End If


If txtStartDate1.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate2.Text = txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If


If txtStartDate1.Text < txtStartDate2.Text And txtEndDate1.Text >= txtStartDate2.Text Then
MsgBox("期間が重複しています。")
End If


If txtStartDate1.Text < txtStartDate3.Text And txtEndDate1.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If
If txtStartDate2.Text < txtStartDate3.Text And txtEndDate2.Text >= txtStartDate3.Text Then
MsgBox("期間が重複しています。")
End If


If txtStartDate1.Text > txtStartDate2.Text And txtStartDate1.Text <= txtEndDate2.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
End If



If txtStartDate1.Text > txtStartDate3.Text And txtStartDate1.Text <= txtEndDate3.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
End If
If txtStartDate2.Text > txtStartDate3.Text And txtStartDate2.Text <= txtEndDate3.Text Then
clsDjsUtility.ShowWarningMessage("期間が重複しています。")
End If


End Sub

お礼日時:2013/02/13 16:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!