質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

期間内に選択された曜日があるかどうかチェックする方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 974

score 14

前提・実現したいこと

excelで選択された曜日があるかどうかチェックしたいのですが、やり方がわかりません。
調べても出てこないのでお知恵をお貸しください。

下のようなものをエクセルで作成しており、

開始日~終了日の期間中の
〇曜日の〇時~〇曜日の〇時まで知らせる、というシステムを作っているのですが、

その開始日~終了日に存在しない曜日が選ばれたとき、
その曜日は期間中に無いよという感じのエラーを表示させるということをしたいのですが
やり方がわかりません。

どのようなコードを書けば判定してもらえるのでしょうか。
よろしくお願いいたします。

『〇〇』などはプルダウンで数字を選択できるようにしており、
曜日の横の『□』もプルダウンで、選ばれたとき『■』になるようになっております。

開始日 〇〇〇〇 〇〇 〇〇 〇曜日 〇〇 〇〇
終了日 〇〇〇〇 〇〇 〇〇 〇曜日 〇〇 〇〇
:
開始 □日 □月 □火 □水 □木 □金 □土 〇〇 〇〇
終了 □日 □月 □火 □水 □木 □金 □土 〇〇 〇〇
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/03/26 10:52

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • torisan

    2019/03/26 12:09

    おせっかいと思いつつ、経験上苦労したことがあるので書いておきます。

    根本的な話になりますが、そもそもこの機能本当に必要ですか?
    使い方によりますが邪魔になりそうな気がします。

    日付の範囲を指定するのはよくある要件ですが、
    時刻まで絡んでくると(しかも日付と別枠の場合)
    仕様をきちんと決めておかないと予想外の動作になりがちです。

    <気になる所>
    ・質問者様は曜日しか気にしていないようですが、時刻についてはノーチェックで良いですか?
     (上は火曜20:00~で下は火曜8:00~ 等)
    ・曜日を決めた後に上の日付時刻の範囲を変えた場合の挙動はどうなりますか?
    ・上記、日付を変えた場合は、エラーメッセージはどのような内容どのような表示になりますか?

    キャンセル

回答 3

+2

自分で作るならどんな感じかと考えたてたら出来てしまったのでコードを載せておきます。
日付入力値をDate型の変数化をします。
JudgeWeek関数に開始日・終了日と曜日に対応した番号(日曜日が1~土曜日が7です)を渡すと結果が戻ります。
一発で判定できるといいのですが、いい案が浮かばずループで回してしまいました。

Sub test()
    Debug.Print JudgeWeek(CDate("2019/3/26 12:00"), CDate("2019/3/31 10:00"), 2)
End Sub

Function JudgeWeek(st As Date, ed As Date, wd As Integer) As Boolean

    JudgeWeek = True

    ' 日数を算出
    term = Int(ed) - Int(st) + 1

    ' 期間が7日以上のときは無条件にOK(指定曜日が含まれる)
    If term >= 7 Then Exit Function

    ' 期間内の曜日が指定曜日と一致していたらOK(指定曜日が含まれる)
    For n = 0 To term - 1
        If Weekday(st + n) = wd Then Exit Function
    Next

    ' いずれにも一致しないのでNG(指定曜日は含まれる)
    JudgeWeek = False

End Function

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

携帯からなので見にくかったらすみません
曜日は期間って難しかった気がするので、発想だけ回答として記載しますね!

そもそも期間が7日以上あればスルーですよね?
7日以内なら、fortoや…最悪ごり押ししてもいいのかもしれないです

■例えば3/26~3/29ならば期間中の日数を最大nとしてforToすると
n = to - from +1
(n = 3/29-3/26 +1 = 4日間の意味)
for i = 1 to n
など

■期間中に対応する曜日を、リスト格納
例えば、日付を from(3/26)+i-1 とするとiに応じて
3/26~3/29と動く
その日付の曜日をリスト格納

■◻️のプルダウンに応じて、リスト格納された曜日ならアラートなし
リスト格納されてない曜日ならアラート
ここはまあ、if文で可能ですかね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

Dim Sunday

            Sunday = "日曜日"

            If Range("K23").Value = "■" Then  '日曜日がチェックされたら
                SyuDate1 = Format(Range("I19"), "00") & "/" & Format(Range("K19"), "00") & "/" & Format(Range("F19"), "0000") '開始日
                SyuDate2 = Format(Range("I21"), "00") & "/" & Format(Range("K21"), "00") & "/" & Format(Range("F21"), "0000") '終了日
                Nod = DateDiff("d", SyuDate1, SyuDate2) '日数差抜き出し


                For l = 0 To Nod
                    Datead = Dateadd("d", l, SyuDate1)
                    Week = WeekdayName(Weekday(Datead))

                    If Sunday = Week Then Exit For

                Next l

                If Sunday = Week Then

                    Dim SyuTime
                    Dim StrTime
                    Dim EndTime

                    SyuTime = Format(Range("V25"), "00") & Format(Range("X25"), "00")
                    StrTime = Format(Range("P19"), "00") & Format(Range("R19"), "00")
                    EndTime = Format(Range("P21"), "00") & Format(Range("R21"), "00")

                    If Range("M19").Value = "(日)" And Range("M21").Value = "(日)" And Range("X25").Value <> "" Then

                    ElseIf Range("M19").Value = "(日)" And Range("X25").Value <> "" Then

                        If SyuTime < StrTime Then
                            MsgBox ("静観期間外です")
                            Range("V25,X25").ClearContents
                        End If

                    ElseIf Range("M21").Value = "(日)" And Range("X25").Value <> "" Then

                        If SyuTime > EndTime Then

                            MsgBox ("期間外です")
                            Range("V25,X25").ClearContents
                        End If

                    End If



                Else
                    MsgBox ("期間内に存在しない曜日です")
                    Range("K23").Value = "□"

                End If

            End If

ループで繰り返して1つ1つ見せていけばできました。
ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る