• 締切済み

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

期間重複チェック。コード以外での回答は遠慮下さい 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のカテゴリでも同じような 質問をしたのですがプログラムコードの回答が得られず 困っています。プログラマに向いていないというような 回答も見受けられましたがどうしても プログラムコードでの回答がほしいです 皆さんお忙しい中申し訳ありませんが プログラムコードでのご回答をお願いいたします。 コード以外でのご回答はご遠慮ください 私はこの仕事に向いていないのでしょうか 毎日つらいです。

みんなの回答

回答No.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

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.6

>単純に上からコードを記述したらメッセージボックスが何回も出力されてしまいました。 一度でも「重複している」と判断したら、もうそれ以上判定を行ってはいけません。 当方の示したコードは 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つも表示しなかった場合だけ」だと言うのを判っていましたか? >日本語を理解する能力が不足しているために度々先輩に怒られます。 だとすると、どの職業に就いても同じように苦労すると思われます。「プログラマーに向いてない」と言うより「考えるのに向いてない」のだと思います。 芸術家とか、音楽家とか、クリエィティブな仕事だと、上手く行くような気がします。 なお、脳梁部部分欠損症などで、軽度の高次脳機能障害があると、日本語を理解する能力が不足したりするので、一度、専門医に精密検査してもらう事をお薦めします。

tkwavek
質問者

お礼

何度もご回答いただきありがとうございました。 もう一つ教えて欲しいことがあるのですが 貴方様が作成したプログラムに 期間(1) txtstartdate1.textとtxtenddate1.textは 必須入力で 期間(2) txtstartdate2.textとtxtenddate2.textは任意入力 期間(3) txtstartdate3.textとtxtenddate3.textは任意入力 開始が入力されたら必ず終了も入力するという 仕様が抜けていました。 大変いいずらいのですがお力をおかし願いませんでしょうか よろしくお願いいたします。

tkwavek
質問者

補足

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

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

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

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.4

No.3 誤:(2)期間2Start < 期間1End -> 重複無し 正:(2)期間2Start > 期間1End -> 重複無し

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

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://okwave.jp/qa/q7890398.html >2年間位(仕事をしながら)勉強してとれればいいなと思っています。 ↑の様な事を質問している暇があるぐらいなら、目の前の仕事を ちゃんとこなしていきましょう!!

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.2

追記。 >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のレジスタにロードする」って感じの所まで究極に細分化すれば、アセンブラで書く事だって可能です。

tkwavek
質問者

お礼

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

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

まず、期間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 以上。

tkwavek
質問者

お礼

お忙しい中長文でのご回答ありがとうございました。 貴方様がおっしゃる様にコードを並べたのでが並べるだけではだめなようです。 単純に上からコードを記述したらメッセージボックスが何回も出力されてしまいました。 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

関連するQ&A

  • 期間重複チェックがわかりません

    2年目の若手プログラマです 2年目にもなってこんなこともできないのかと 毎日のように怒られています VB2005+SQLServer2005で開発を行っています。 期間を3つ入力してデータを抽出する プログラムを作っているのですが 期間重複チェックがわかりません 期間(1)~期間(3)まであります(抽出条件) 1,2,3各期間重複する場合は再入力させるとしか 仕様書に書かれておらず プログラミングできず困っています。 期間(1) txtStartDate1.text txtEndDate1.text 期間(2) txtStartDate2.text txtEndDate2.text 期間(3) txtStartDate3.text txtEndDate3.text

  • 従事期間の重複チェック、表示

    エクセルで多人数の技術者の配置開始日、終了日を入力した表から、特定技術者を抽出しその者の重複期間をチェック、表示させたいのです。定年過ぎのソフト初心者が出来そうなやり方を教えて下さい。

  • VB6 重複チェックについて

    お世話になります。 次の処理をVisual Basic6.0で教えてください。 1.Text1にキー入力した値をコマンドボタンクリックすると、Text1の値を保存します。 2.次にText1に新たに入力してコマンドボタンクリックで前項で保存した値と重複して   いないかチェックして重複無しならText1の値を保存します。 3.Text1に新たに入力して・・・・重複チェックして・・・・ といった具合に保存する値と重複チェックする対象の値がどんどん増えていきます。 さすがに10,000件はいかないですが。 保存先は読み書き込みの時間も考慮してVB内のTextBOXが第1希望、外部のtxtファイルやcsvファイルは第2希望としたいです。 If Text1=保存値 Then  処理 else  処理 End If 保存値をText2として行いましたが、完全一致でないとダメでした。 入力値:保存値=1:n(入力値が複数の保存値と重複したかどうか)が知りたいです! お手数おかけしますが、何卒よろしくお願いします。

  • DataGridViewの特定列に入力されている重複チェックをしたい

    VisualBasic2005です。 例えばDataGridViewの3列目にコードが入力されるとします。 その列のコードには重複入力をさせたくないのです。 重複チェックをするのは、そのセルの入力が確定したときでも、 特定のボタンが押されたときでもかまわないので、 チェックする方法はないでしょうか? よろしくお願いいたします。

  • エクセルで重複のチェックをしたい

    初心者なので、拙い内容ですが教えてください。 ・エクセル2003 二つのシートにそれぞれA列に企業名、B列に支店名、 C列に郵便番号、D列に住所が入力されています。 二つのシートはほぼ同じ内容で、シート1は3000件の全データ、 シート2は抽出された1300件のデータが入力されています。 やりたいことは3000件のうちの1300件の重複データを シート1の全データの空白列に「重複」や  重複データには行に色をつけて表示させる、などとにかく 重複をわかりやすく表示させたいのです。 過去ログみましたが、いまいち理解できませんでしたので わかりやすく教示してくださると助かります! ちなみに二つのデータをひとつにし、フィルタオプションの 「重複するレコードは・・」は検討違いだったようでうまくいきませんでした・・ ひとつの列に対する重複チェックは理解できたのですが.. 支店によって住所が違ってくるので、たちどまってしまいました。

  • 重複チェックプログラム

    ご経験ある方いらっしゃいましたらアドバイスください。 環境:linux, gcc 64bitの整数データ(符号なし)を入力とし、64bitの整数データを出力する関数を作成中です。 入力データに対して、出力データは絶対に重複しないという条件で関数を作成したのですが、 (入力と出力は1対1になる) その条件のチェックができない状態で困っています。 試した方法は、以下のとおりです。 (1)すべての入力データに対する出力データをテキストファイルに書き出す。 (2)再びすべての入力データを計算するのだが、今度は出力データを(1)で作成したテキストファイルと比較していく。 そのときテキストファイル内に出力データと同じデータが2つ以上あれば重複が存在する。 しかし、(1)の時点でlinuxのファイル制限2.1GBに引っかかってしまい、 これ以上進めることができませんでした。 同じような大量のデータに対して重複確認することは不可能なのでしょうか? もし、linuxのファイル制限がなくてもHDDの容量制限に引っかかってしまいそうです。 このような制限に依存せず、重複確認できる方法がありましたら教えてください。 質問が不明、不足な点がある場合にもご指摘おねがいします。宜しくお願いします。

  • VB.net 重複チェックがしたいです

    DB接続しない前提です。 データセットを用いてグリッドビュー内で重複チェックをしたいです。 リストボックス内にファイル毎にテキストを取り込み、任意の日付を抽出しテーブルに登録。 テーブルに重複あるか確認してboolenで判定したいのですが、構文がエラーになります。 For i = 0 To ListBox1.Items.Count - 1 ST = ListBox1.Items.Item(i) GT = GetText(ST) Dim strSearchChardate As String = "Date " Dim datetxt As String = GT.Substring(lngPointdate + 5, 10) Dim dsdt = DataSet1.DataTable1 Dim checktxt As DateTime = DateTime.Parse(datetxt) Dim check As Boolean = dsdt.Contains(datetxt)    ←ここのdatetxtエラー ’グリッドビューに重複なければ書き込み dsdt.AddDataTable1Row(datetxt, code) という風に進めたいのですが、修正を含め違うやり方等ありましたら教えていただきたいです。 現在はエラー処理でしておりますがこれをやめたいです。 '日付の重複処理 Try dsdt.AddDataTable1Row(datetxt, code) '日付をユニークキーにしているため Catch ex As System.Data.ConstraintException MsgBox("同一日付があります") End Try よろしくお願いします。

  • フォーム入力値の重複チェック

    初心者です。 フォームに入力された数値の重複チェックをしたいのですが、どうしたらよいのでしょうか?品番+商品コードが重複する場合、アラートを表示させたいと考えています。     (列名) (行数)--品番---商品コード--価格--  1  --1000---1234--------1500yen--  2  --1434---1234--------500yen--  3  --1000---1234--------1500yen--   :  --1111---5098--------1500yen--  : --1299---4288--------1500yen-- 20 --1000---1234--------1500yen-- //1、3、20行目が重複する場合アラートを表示させたいと考えています。 よろしくお願いします。

  • ACCESS重複のチェック

    ACCESSで重複チェックをしたいと思います。 現在は電話番号テーブルだけしかありません。 電話番号のテーブルを主キーを使って重複している場合エラーメッセージを出すというものです。保存ボタンもありません。 Private Sub text電話番号_BeforeUpdate(Cancel As Integer) If IsNumeric(text電話番号) = False Then '数字チェック。 MsgBox "電話番号は数字で入力して下さい。", vbCritical Cancel = True ' 処理を取り消します。 Me.Undo End If Dim strmsg As String strmsg = "重複しています" If Not IsNull(DLookup("[電話番号]", "ダブリチェックテーブル", "[電話番号] = [text電話番号]")) Then MsgBox strmsg, 16, "ダブリチェック" Cancel = True '処理を取り消します。 Me.Undo '元に戻します。 Else Cancel = False '処理を続行します。 End If End Sub これに、企業名と出発日という項目を増やしたいと思います。 ですが、何万とある電話番号を一気に入力して調べているので、一回一回企業名と出発日を入れていると生産性が落ちます。 ですので、企業名と出発日は最初の入力だけで次のレコードに移動してを継続させたいのです。そして電話番号以外にカーソルを行かないようにしたいです。 何か良い方法があればご教授お願いします。 ちなみにいろいろ自分なりに試したのですが、重複してエラーを出した場合に企業名にカーソルが飛んだししてうまくいきませんでした。

  • Access2000での重複チェック

    前回も質問させていただきましたがどうしてもわからないので質問させていただきます。 DCount("規定金額", "ワークテーブル", "規定金額= '" & Me!txt規定金額.Value & "'") <> 0 Then 歩合入力フォームにsub歩合入力サブフォームが張り付いてます。ワークテーブルのフィールドは規定金額、歩率です。規定金額が重複してるかどうか調べたいのですが、上のコードではエラーがでてしまいます。間違ってるのでしょうか?sub歩合入力のForm_BeforeUpdateに書いています。エラーの内容は「抽出条件でデータ型が一致しません」です。よろしくお願いします

専門家に質問してみよう