Excel VBA質問箱 IV

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

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


3419 / 13644 ツリー ←次へ | 前へ→

【62351】時間外、時間内の判別方法 さくら 09/7/13(月) 16:49 質問[未読]
【62352】Re:時間外、時間内の判別方法 もも 09/7/13(月) 16:55 発言[未読]
【62353】Re:時間外、時間内の判別方法 さくら 09/7/13(月) 17:03 発言[未読]
【62354】Re:時間外、時間内の判別方法 kanabun 09/7/13(月) 17:27 発言[未読]
【62356】Re:時間外、時間内の判別方法 kanabun 09/7/13(月) 21:45 発言[未読]
【62358】Re:時間外、時間内の判別方法 Yuki 09/7/14(火) 7:52 発言[未読]
【62360】Re:時間外、時間内の判別方法 さくら 09/7/14(火) 10:42 お礼[未読]
【62361】Re:時間外、時間内の判別方法 kanabun 09/7/14(火) 10:56 発言[未読]
【62363】Re:時間外、時間内の判別方法 さくら 09/7/14(火) 13:40 お礼[未読]

【62351】時間外、時間内の判別方法
質問  さくら  - 09/7/13(月) 16:49 -

引用なし
パスワード
   こんにちは。
力をお貸しください。

A列には[2009/7/13 8:00:00]
といったdate型の値が記入してあります。

平日: 9:00〜17:30以外
土日祝日: 全日

を時間外として表示するものを作りたいのですが
曜日判別はうまくいったものの、時間をうまく認識してくれません。
どこに問題があるのかご指南いただけますでしょうか。

また、祝日を認識するにはどのような手段があるか、
ヒントをいただけると助かります。

※祝日リストをシートに作って期日が合致するかどうか見るしかないかなあ、と現時点では考えていますが…もっとスマートな方法があればそちらを取りたいと思っています。


sub test()

Dim Gyou As Long
Dim sday As Date
Dim ws1 As Worksheet

Set ws1 = ThisWorkbook.Worksheets("DATE")

Gyou = InputBox("何行目を見ますか")

sday = ws1.Range("A" & Gyou)

Select Case Weekday(sday, vbSunday)
  Case 2, 3, 4, 5, 6 '月火水木金
    If TimeSerial(9, 0, 0) > sday > TimeSerial(17, 30, 0) Then
      MsgBox "時間外"
    Else
      MsgBox "時間内"
    End If
  Case 1, 7 '土日
    MsgBox "時間外"
  End Select

End Sub


If TimeSerial(9, 0, 0) > sday > TimeSerial(17, 30, 0) Then
の[sday]の部分を[Format(sday, "HH:NN:SS")]に変更しても駄目でした。

どうぞよろしくお願いいたします。

【62352】Re:時間外、時間内の判別方法
発言  もも  - 09/7/13(月) 16:55 -

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

細かくは見ていませんが、

>If TimeSerial(9, 0, 0) > sday > TimeSerial(17, 30, 0) Then

の部分を

If TimeSerial(9, 0, 0) > sday And sday > TimeSerial(17, 30, 0) Then
こうしたらどうでしょう?

判別式をAndでつなげます

【62353】Re:時間外、時間内の判別方法
発言  さくら  - 09/7/13(月) 17:03 -

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

ORやANDは既に試してみたのですが、やはり駄目でした。
ANDですと9時以前、17時以後両方満たしていないと駄目になってしまうし、
ORの場合は…わかりませんがやはりうまくいきません。

念のためにもう一度試してみたのですが、やはり8時であるにも関わらず
ANDの場合は「時間内」になってしまうし、
ORの場合はsdayを何時に設定しても「時間外」になってしまうようです。

【62354】Re:時間外、時間内の判別方法
発言  kanabun  - 09/7/13(月) 17:27 -

引用なし
パスワード
   ▼さくら さん:
>ORの場合はsdayを何時に設定しても「時間外」になってしまうようです。

> Dim sday As Date
なので、sday には DateValue + TimeValue が入っています。
TimeValue だけとりだして、
こんな風に分岐したらどうでしょう

 Dim sday As Date
 'sday = #7/7/2009 5:05:00 AM#
 sday = #7/8/2009 11:50:00 AM#
 Select Case Weekday(sday, vbSunday)
  Case 2 To 6 '月火水木金
    Select Case TimeValue(sday)
     Case TimeSerial(9, 0, 0) To TimeSerial(17, 30, 0)
       MsgBox "時間内"
     Case Else
       MsgBox "時間外"
    End Select
  Case Else '土日
    MsgBox "時間外"
  End Select

【62356】Re:時間外、時間内の判別方法
発言  kanabun  - 09/7/13(月) 21:45 -

引用なし
パスワード
   > A列には[2009/7/13 8:00:00]
> といったdate型の値が記入してあります。

すべてシリアル値で考えてみたらどうでしょ?

2009/7/13 8:00:00 をシリアル値にすると
                40007.3333333 です。
一方、
TimeSerial(9, 0, 0) のシリアル値は 0.375 です。
TimeSerial(17, 30, 0)のシリアル値は 0.729166666666667
です。

したがって
>------------------------------------------------
>    If TimeSerial(9, 0, 0) > sday Or _
>      sday > TimeSerial(17, 30, 0) Then
>      MsgBox "時間外"
>------------------------------------------------
の部分は、
>------------------------------------------------
  もし  0.375 > 40007.3333333 であるか
  または 40007.3333333 > 0.729166666666667 なら
     "時間外です"
>------------------------------------------------
と判定していることになります。
9:00 は A列の日付より常に大きいので Orの前は「偽」ですが、
17:00 はA列のDate+Timeより常に小さいので第2項は「真」となるため、
このIf文は常にTrueとなり、
>>ORの場合はsdayを何時に設定しても「時間外」になってしまう
となります。

>[sday]の部分を[Format(sday, "HH:NN:SS")]に変更しても駄目でした。
文字列とTimeSerialを比較しても不条理だと思います。

【62358】Re:時間外、時間内の判別方法
発言  Yuki  - 09/7/14(火) 7:52 -

引用なし
パスワード
   ▼さくら さん:
>A列には[2009/7/13 8:00:00]
>といったdate型の値が記入してあります。
>
>を時間外として表示するものを作りたいのですが
>曜日判別はうまくいったものの、時間をうまく認識してくれません。
>どこに問題があるのかご指南いただけますでしょうか。

参考にして下さい。
Select Case Weekday(sday, vbSunday)
  Case 2, 3, 4, 5, 6 '月火水木金
    If (TimeValue(sday) >= TimeValue(#9:00:00 AM#)) _
    And (TimeValue(sday) <= TimeValue(#5:00:00 PM#)) Then
      MsgBox "時間内"
    Else
      MsgBox "時間外"
    End If
  Case 1, 7 '土日
    MsgBox "時間外"
End Select

【62360】Re:時間外、時間内の判別方法
お礼  さくら  - 09/7/14(火) 10:42 -

引用なし
パスワード
   もも様、kanabun様、Yuki様、ありがとうございます!
皆様の助言を下に一応以下で望む動作はできましたが、力技すぎるかもしれません。
まだまだ精進をしたいと思います。

参考までに稚拙ではありますが(おそらく)成功コードです。
もし、おかしなところや、改善点等ございましたら
ご指摘いただけると助かります。

たくさんの助言、本当にありがとうございました!


DATEシートのA列には[2009/7/13 8:00:00]
祝日シートのA2〜A50には祝日のdateが入っています。

sub test()

Dim Gyou As Long
Dim sday As Date
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim j As Integer, a As Integer

Set ws1 = ThisWorkbook.Worksheets("DATE")
Set ws2 = ThisWorkbook.Worksheets("祝日")

Gyou = InputBox("何行目を見ますか")

sday = ws1.Range("A" & Gyou)

a = 0
For j = 2 To 50
If ws2.Cells(j, 1).Value = DateValue(sday) Then
    MsgBox "時間外"
    a = 1
End If
Next j

If a < 1 Then
  Select Case Weekday(sday, vbSunday)
    Case 2 To 6 '月火水木金
      Select Case TimeValue(sday)
    Case TimeSerial(9, 0, 0) To TimeSerial(17, 30, 0)
      MsgBox "時間内"
    Case Else
      MsgBox "時間外"
    End Select
  Case Else '土日
    MsgBox "時間外"
  End Select
End If

End Sub

【62361】Re:時間外、時間内の判別方法
発言  kanabun  - 09/7/14(火) 10:56 -

引用なし
パスワード
   ▼さくら さん:
こんにちは(^^

>参考までに稚拙ではありますが(おそらく)成功コードです。

祝日判別のところですが、
>a = 0
>For j = 2 To 50
>If ws2.Cells(j, 1).Value = DateValue(sday) Then
>    MsgBox "時間外"
>    a = 1
     Exit For
>End If
>Next j

祝日だったら、Exit For でFor〜Loopを抜けるように
しておくほうが能率いいかと思います。(^^


【62363】Re:時間外、時間内の判別方法
お礼  さくら  - 09/7/14(火) 13:40 -

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

>祝日だったら、Exit For でFor〜Loopを抜けるように

確かに、該当があったのにループを続けるのは無駄でしたね。
ご指摘ありがとうございます!

前回から引き続き、助けていただいてありがとうございました。

まだまだ、こちらでお力をお借りすることもあるかと思いますが、
いずれは私も人を助けられるよう頑張ります!

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