- ベストアンサー
指定した日付が、その月の第何週かを求める方法
月曜から日曜の作業内容を 書く報告書作成画面の作成をしています。 処理の一つに、 作成したい週の月曜の年月日を入力し、 日曜までの日付を自動的に画面に出す、 というものがあります。 さらに自動的に出した日曜日の日付から、 報告書作成週はその月の第何週かを求める、 (今月ですと10/6は第1週、10/13は第2週、 10/20は第3週、10/27は第4週、となります) という処理を作成したいのですが、 良いロジックが思い浮かびません。 (処理する月の日付と曜日を配列に入れて、 ループカウントで第何週かを求める、という 方法は思いついたのですが、効率が悪いと思うので…) 何か良いロジックがありましたら、 書き込みをお願い致します。
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
usi-itiさんへ 何度も書き込みしてすみません。 それと、お礼欄への書き込みは、全ての回答者には、メールが届かないと思います。 Niiさんへの書き込みを知らない回答者もいるのではないでしょうか? 補足は全員に届くようです。 さて本題です。 Niiさんが書いていらっしゃるのと同じなので、実際のプログラムを書いてみます。 フォームに[Text1],[Label1][Label2],[Label3(0)]~[Label3(6)],[Command1]を作成し、 下記のコードを貼り付けて、実行 Text1に日付(日曜日でなくても構いません)を入力し、コマンドボタンを押す Label1に月、Label2に週、Label3(0)~Label3(6)に月~日の日付が表示されます。 今回は、Weekday(Wk_Date, vbMonday)としています。 WeekdayにvbMondayと指定すると、月曜日を1として 火曜日=2,水曜日=3,・・・日曜日=7を返します。 (NiiさんのWeekday(年月日,2)と同じです) Private Sub Command1_Click() Dim i As Integer Dim Wk_Date As Date '入力した日付 Dim Wk_Sun As Date '入力した週の日曜日 Wk_Date = DateValue(Text1) Wk_Sun = Wk_Date + (7 - Weekday(Wk_Date, vbMonday)) '日曜日の日付を求める Label1 = Month(Wk_Sun) & "月" Label2 = (Day(Wk_Sun) - 1) \ 7 + 1 & "週目" For i = 6 To 0 Step -1 Label3(i) = Day(Wk_Sun - (6 - i)) Next i End Sub 必ず日曜日の日付を入力する場合には Wk_Sun = Wk_Date + (7 - Weekday(Wk_Date, vbMonday)) '日曜日の日付を求める は削除するか、 If (Weekday(Wk_date) = 1 ) then 'この場合のWeekdayは日曜日=1になります。 として、日曜日かチェックするようにして下さい。
その他の回答 (14)
- taisuke555
- ベストアンサー率55% (132/236)
takntさんへ う~ん、どうなんでしょう? そうなのかもしれません。 が、「私の周りでは、10月の2週目の月曜日って何日?」 ときけば、14日と回答が返ってきます。 私は、どちらでもいいですけど・・・ こちらの質問者の週の決め方は、補足にもあった通りなので、 他の質問であげてみたらいかがですか? usi-itiさんへ 関係のない、回答を何度も繰り返し、すみません。
- taknt
- ベストアンサー率19% (1556/7783)
#6さんへ >体育の日は10月第2週の月曜日になっていると思いますが・・・ >今年の体育の日は、10月14日ですよね? つまんない突っ込みですが、体育の日は 第二月曜日であって、第二週目の月曜ではないと思います。 つまり、その月で 2回目の月曜ということだと思うのですが・・・。
- taknt
- ベストアンサー率19% (1556/7783)
ちょっと質問なんですが、 >今年の11月ですと、 >10/28(月)~11/3 (日)…11月第1週 >11/4 (月)~11/10(日)…11月第2週 >10/11(月)~11/17(日)…11月第3週 >11/18(月)~11/24(日)…11月第4週 この場合、10月28日と 入れたら 11月第一週と出ないとダメなんですよね? 11月25日から11月30日の場合は、12月第一週と出ればいいのでしょうか?
- Nii
- ベストアンサー率48% (79/162)
すみません、なぜか==になってたり、カレンダーを見間違えて、9/25とか書いてたり、+8では・・・ 申し訳御座いません。 とりあえず、 >今年の11月ですと、 >10/28(月)~11/3 (日)…11月第1週 >11/4 (月)~11/10(日)…11月第2週 >10/11(月)~11/17(日)…11月第3週 >11/18(月)~11/24(日)…11月第4週 ですと、 日曜日=年月日-Weekday(年月日,2)+7 月=Month(日曜日) 週=Int(Day(日曜日)*-1/7)*-1 もしくは、 週 =(Day(日曜日)-1)\7+1 でどうでしょう? 後は、 でしたら、月曜日=日曜日-6てな具合でどうでしょう?
- Nii
- ベストアンサー率48% (79/162)
月の境目を第何週にするかが明確になっていないので、見当違いの回答をしている可能性がありますが。 >自動的に出した日曜日の日付から 日曜日 = =年月日-Weekday(年月日)+1 >その月の第何週かを求める 月 = =Month(日曜日) 週 = =Int(Day(日曜日)*-1/7)*-1 ではどうでしょう? 9/25~10/5 9月5週 10/6~10/12 10月1週 になると思います。 9/25~10/5 10月1週にしたい場合は、 日曜日 = =年月日-Weekday(年月日)+8 >日曜までの日付を自動的に画面に は、元になる日曜日から、1づづプラス、もしくはマイナスした値になると思いますが。
お礼
>回答者の皆様 色々とありがとうございました。 処理の仕様として、月曜~日曜を 1週間とし、日曜を週の切替日として 作成しております。 今年の11月ですと、 10/28(月)~11/3 (日)…11月第1週 11/4 (月)~11/10(日)…11月第2週 10/11(月)~11/17(日)…11月第3週 11/18(月)~11/24(日)…11月第4週 としております。 この辺の記述が抜けていました。 申し訳ありませんでした。 宜しければ、再度書き込みを お待ちしております。
- taisuke555
- ベストアンサー率55% (132/236)
#8の回答 ??? また、新たな考え方がでてきました。 でも、10/6が1週目で、月曜~日曜日ならその考え方が一番しっくりくるような気もします。 変な解説をつけてしまったのでおかしな話題になってしまいましたが、 月曜日~日曜日を基準に考えた場合を想定し、 日曜日のみ考えた場合には、 1週目の日曜日は(1~7) 2週目の日曜日は(8~14) ・・・・になるので、以下私の#4の回答に続く に変更してください。この解説なら問題ない?とおもいます。 他の曜日を考えた場合には、先の回答で述べましたが、 考え方により、式が変わります。
やっぱり、駄目でした。 7/1 (月)~ 7/7(日)の場合、 7 \ 7 + 1 で、2週になっちゃいます。 7で割り切れると、バグちゃいます。 日曜日の日を、マイナス1しないと駄目みたいです。。。
日曜日が基準だから、10月の場合、 第1週:9/30 (月) ~ 10/6 (日) 第2週:10/7 (月)~ 10/13(日) 第3週:10/14(月)~ 10/20(日) 第4週:10/21(月) ~ 10/27(日) 第1週:6 \ 7 (=0 少数点以下切捨) + 1 = 1 第2週:13 \ 7 (=1 少数点以下切捨) + 1 = 2 第3週:20 \ 7 (=2 少数点以下切捨) + 1 = 3 第4週:27 \ 7 (=3 少数点以下切捨) + 1 = 4 となると思ったのですが、勘違いでしょうか?!
- taisuke555
- ベストアンサー率55% (132/236)
#4さんへ 体育の日は10月第2週の月曜日になっていると思いますが・・・ 今年の体育の日は、10月14日ですよね? ということは、第2週は8日~14日というのが正しいと思います。 違っていたらすみません。 質問者のusi-itiさんの考え方もあると思いますので、 1週目をカレンダーの1行目とする考え方でしたら#2さんの方法でいいと思います。 (パッと見ただけなので検証はしていません)
- taknt
- ベストアンサー率19% (1556/7783)
No4の方への疑問ですが・・・。 >#1さんや、#3さんの補足になってしまいますが、 >第1週目は 1~7日 >第2週目は 8~14日 ちなみに 今月(10月)の第二週目は 6日から12日だと思うのですが、 違うのでしょうか?
- 1
- 2
お礼
>回答者の方へ 色々とありがとうございました。 大変参考になりました!
補足
>回答者の方へ ありがとうございました。 第何週とか第何曜日とかで 皆様を惑わせてしまいました事を お詫び致します。