
下記のページを参考に、毎月の第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を表示したいのですが・・・
上記を解決するヒントを教えていただけると幸いです。
よろしくお願いいたします。
No.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

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


No.1
- 回答日時:
>ところが、2017年5月では、5月初日が月曜日であることから、5/12が第1金曜日として計算されてしまいます。
予定では5/5>を表示したいのですが・・・実際にやってみると、5/5になりますよ。(添付図参照)
添付の図では、getDateWeekNum(2017,5,6,1)を指定していることになります。

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでセル内改行の1行目...
-
エクセル 0:00 の時間をカウン...
-
エクセルでハイパーリンクのコピー
-
結合されたセルの一部を変更す...
-
エクセルのセルの右下の角の十...
-
エクセルのセル内で改行コピー...
-
エクセルの結合セル内に文章を...
-
WordからExcelへ変換しデータを...
-
エクセルで納期遅れのセルを色...
-
【VBA】PDF出力に任意のファイ...
-
PowerPointの表内のカンマ
-
EXCELでタイトル行と一番下の行...
-
エクセル 数式の無効化
-
名簿の漢字名を関数で半角カナ...
-
【エクセル】入力規則のプルダ...
-
EXCEL 連動したドロップダウン...
-
Excelでセルを次の行の先頭の列...
-
【Excel】選択したすべてのセル...
-
Wordの差し込み印刷で空白行が...
-
エクセルの計算式でコンマを付...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでセル内改行の1行目...
-
エクセルでハイパーリンクのコピー
-
結合されたセルの一部を変更す...
-
エクセルの結合セル内に文章を...
-
エクセル 0:00 の時間をカウン...
-
VBAからのHYPERLINK関数のアド...
-
VBA セル内で改行またはカンマ...
-
エクセルのセル内で改行コピー...
-
Excel vba 毎月の第○ △曜日を求...
-
エクセル教えてください。2点あ...
-
エクセルの計算について(統計学)
-
【Excel】 結合セルのコピーが...
-
複数の斜め線を引くには
-
エクセルで 来年の曜日の自動設定
-
Excel 数式 数え方について
-
アクティブセルとそのセルに隣...
-
エクセルにサイトのソースを貼...
-
エクセルの関数MAXで、非表示の...
-
excel2013 セルの内の数字のエ...
-
Excel2003からExcel2000への数...
おすすめ情報