プロが教えるわが家の防犯対策術!

下記のページを参考に、毎月の第1金曜日 といった任意の日を求めることをしたいと
考えております。

参考ページ
http://tatehide-blog.net/archives/excelvba_getda …

こちらの
--------------------------------------------------------------
Function getDateWeekNum(myYear As Integer, myMonth As Integer, _
          myWeekday As VbDayOfWeek, weekNum As Integer) As Date
  Dim firstWeekday As Integer  ' 指定した年月の1日の曜日番号
  Dim Sabun As Integer      ' 曜日番号の差分

' 指定した年月の1日の曜日番号求める
  firstWeekday = weekday(DateSerial(myYear, myMonth, 1))

'1日の曜日番号と求めたい曜日番号の差分を求める
  Sabun = myWeekday - firstWeekday
  If myWeekday < firstWeekday Then
    Sabun = Sabun + 7
  End If

' 目的の日付データを求めて返す
getDateWeekNum = DateSerial(myYear, myMonth, 1 + Sabun + 7 * (weekNum - 1))
End Function
--------------------------------------------------------------

このコードで行うと、日曜日を基準として作成してあるため、
例えば2017年4月であると、初日が4/1で土曜日のため、上記式のfirstWeekdayは土曜になり、
第1金曜日が4/7となります。
ところが、2017年5月では、5月初日が月曜日であることから、5/12が第1金曜日として計算されてしまいます。予定では5/5を表示したいのですが・・・

上記を解決するヒントを教えていただけると幸いです。
よろしくお願いいたします。

A 回答 (3件)

私も同じようなものを作ってみましたが、問題はありませんでした。


ふつうは組み込み関数でつくるとは思いますが、VBAでやってみました。

G2の数式
=FirstWeekday(A2,D2,E2)

Function FirstWeekday(ByVal myDate As Date, wkDay As Integer, Optional cycle As Integer = 0)
 Dim FirstDAY As Date
 Dim k As Integer
 Dim tmpDate As Date
 k = wkDay - 2 Mod 8 + 2
 FirstDAY = myDate - Day(myDate)
 If cycle = 0 Then cycle = 1
 FirstWeekday = FirstDAY + Weekday(k - Weekday(FirstDAY)) + (cycle - 1) * 7
End Function
「Excel vba 毎月の第○ △曜日を」の回答画像3
    • good
    • 1
この回答へのお礼

回答ありがとうございました。
No.1の方にもご指摘があり再度確認いたしましたところ、当方の変数への指定セルが誤っていることが判明いたしました。
初歩的なミスでしたが、ワークシートの図を含めてわかりやすく説明いただきましたので、こちらをベストアンサーとさせていただきました。

お礼日時:2017/04/28 15:29

こんにちは!



わざわざVBAでやる必要性が感じないので、関数でやってみました。
↓の画像のようにA1セルに「年」、C1セルに「月」の数値を入れるとします。
F1セル(実際はどこか使っていないセル)に
=DATE(A1,C1,0)
という数式を入れ前月の最終日を表示させておきます。

そしてF4セルに
=F1-WEEKDAY(F1-4,3)+7
とすれば2017年5月の最初の金曜日のシリアル値が表示されます。
=F1-WEEKDAY(F1-4,3)
の部分で前月の最終金曜日が求められますので、それに7をプラスしているだけです。
「-4」の部分の変更で
-0 → 月曜日(実際は-0は不要)
-1 → 火曜日
-2 → 水曜日
-3 → 木曜日
-5 → 土曜日
-6 → 日曜日
といった感じになります。

どうしてもVBAでやりたい!という場合は
第1週の金曜日を求めたい場合は
(年・月のセルは画像通りだとします。)

Sub Sample1()
Dim cnt As Long, myDate As Date
cnt = 1 '//★//
Do
myDate = DateSerial(Range("A1"), Range("C1"), cnt)
If WorksheetFunction.Weekday(myDate) = 6 Then Exit Do
cnt = cnt + 1
Loop
MsgBox myDate
End Sub

でメッセージボックスに表示されるはずです。
※ 第2週の場合は★の行の「1」を「8」から始めればよいと思います。m(_ _)m
「Excel vba 毎月の第○ △曜日を」の回答画像2
    • good
    • 0

>ところが、2017年5月では、5月初日が月曜日であることから、5/12が第1金曜日として計算されてしまいます。

予定では5/5>を表示したいのですが・・・
実際にやってみると、5/5になりますよ。(添付図参照)
添付の図では、getDateWeekNum(2017,5,6,1)を指定していることになります。
「Excel vba 毎月の第○ △曜日を」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています