VB6です。
カレンダーを作っています。
その月の、第2、第3月曜日が何日かを求める関数を作っています。
が、ループ処理で一つ一つ確認するコードしか浮かびません。
一発で求められるような関数がありましたらご教授願います。
月初日の曜日を求めて、そこからゴリゴリやってみると・・・
Dim str1stDay as String
Dim datToday as Date
Dim intWeek as Integer
Dim 2ndMonday as integer
Dim 3rdMonday as integer
str1stDay = "2005/09/01" '←これは決め打ちではなくきちんと取得するほうが良いですね
datToday = DateValue(str1stDay)
intWeek = Weekday(datToday)
Select Case intWeek
Case 1 '日曜日
'第2月曜
2ndMonday = intweek + 8
'第3月曜
3rdMonday = intweek + 15
Case 2 '月曜日
'第2月曜
2ndMonday = intweek + 7
'第3月曜
3rdMonday = intweek + 14
Case 3 '火曜日
'第2月曜
2ndMonday = intweek + 13
'第3月曜
3rdMonday = intweek + 20
Case 4 '水曜日
'第2月曜
2ndMonday = intweek + 12
'第3月曜
3rdMonday = intweek + 19
Case 5 '木曜日
'第2月曜
2ndMonday = intweek + 11
'第3月曜
3rdMonday = intweek + 18
Case 6 '金曜日
'第2月曜
2ndMonday = intweek + 10
'第3月曜
3rdMonday = intweek + 17
Case 7 '土曜日
'第2月曜
2ndMonday = intweek + 9
'第3月曜
3rdMonday = intweek + 16
End Select
こんな感じかなぁ?(全然スマートじゃないなぁ・・・)
うわ・・・インデントが滅茶苦茶だorz
見づらくてスミマセン
Dim intWeek As Integer
Dim objDate As Date
objDate = "2005/09/01"
intWeek = Weekday(objDate)
If intWeek <= 2 Then
intWeek = 10 - intWeek
Else
intWeek = 17 - intWeek
End If
Debug.Print intWeek & "日が第2月曜日"
Debug.Print intWeek + 7 & "日が第3月曜日"
debug.print objDate + intWeek - 1
でyyyy/mm/ddの形で出力されます。
文字列型を日付型に直すのはかなりの時間が掛かるのでDateSerialを用いて
xxxx/xx/01を作ったほうが早いですね。
ちょこ㌧ さんのプログラムを改造すると↓見たいな感じ。
'呼び出し側の例えとして Test(2005,9) とする。
Private Sub Test(lngYear As Long, lngMonth As Long)
Dim intWeek As Integer
intWeek = Weekday(DateSerial(lngYear, lngMonth, 1))
If intWeek <= 2 Then
intWeek = 10 - intWeek
Else
intWeek = 17 - intWeek
End If
Debug.Print intWeek & "日が第2月曜日"
Debug.Print intWeek + 7 & "日が第3月曜日"
End Sub
下記ではいかが。
Debug.Print ((9 - Weekday("2005/09")) Mod 7) + 1 '第一月曜日
Debug.Print ((9 - Weekday("2005/09")) Mod 7) + 8 '第二月曜日
Debug.Print ((9 - Weekday("2005/09")) Mod 7) + 15 '第三月曜日
皆さんのコードを参考にさせて頂き、曜日指定型の関数作ってみました。
Private Sub Command1_Click()
Dim intWeek As Integer
Dim objDate As Date
Dim strWork As String
objDate = Me.Text1.Text '2005/09/1
intWeek = WeekDaysFirst(objDate, vbMonday)
strWork = Format(DateSerial(Year(objDate), Month(objDate), intWeek), "aaaa")
Debug.Print intWeek + 7 & "日が第2" & strWork
Debug.Print intWeek + 14 & "日が第3" & strWork
End Sub
Private Function WeekDaysFirst(DateX As Date, WeekX As VbDayOfWeek) As Integer
Dim intWeek As Integer
If WeekX = vbUseSystemDayOfWeek Then WeekX = vbSunday
intWeek = Weekday(DateSerial(Year(DateX), Month(DateX), 1))
WeekDaysFirst = ((7 + WeekX - intWeek) Mod 7) + 1
End Function
>特攻隊長まるるう
お疲れ様です。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200509/05090150.txt
こっちの記事に私も興味あるんですが分かりかねますか?
さん付け忘れ、言葉足らずで申し訳ないです。
訂正致します。
>特攻隊長まるるうさん
お疲れ様です。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200509/05090150.txt
こちらの質問にも興味があるのですが分かりかねますでしょうか?
はい、分かりかねます。
ボクには興味の無い分野ですので。
それに質問掲示板で回答者を名指しするのは
どんなに丁寧な言葉を使ったところで回答を
強要する事になります。常識的な考え方が
できる人は普通しません。
だいたいこのスレッドに関係ない話題ですよね?。
こーゆー自分勝手な行動をしなくて済むように
ボクはメアドを公開してますので、どうぞ
ご利用下さい。
ところで、頭が飽和さんの問題は解決したのでしょうか?
気になります。
>特攻隊長まるるう [E-Mail] 2005/09/29(木) 09:18:51
>はい、分かりかねます。
>ボクには興味の無い分野ですので。
>
>それに質問掲示板で回答者を名指しするのは
>どんなに丁寧な言葉を使ったところで回答を
>強要する事になります。常識的な考え方が
>できる人は普通しません。
>
>だいたいこのスレッドに関係ない話題ですよね?。
>こーゆー自分勝手な行動をしなくて済むように
>ボクはメアドを公開してますので、どうぞ
>ご利用下さい。
何が言いたいんだろうか。
> ぬるぽ^^
ん…呼びました?
ツイート | ![]() |