
下記のページを参考に、毎月の第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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) 週毎の集計 2 2023/08/04 16:56
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでセル内改行の1行目...
-
エクセルでハイパーリンクのコピー
-
VBAからのHYPERLINK関数のアド...
-
結合されたセルの一部を変更す...
-
【Excel】 色の一致するセル数...
-
エクセル 0:00 の時間をカウン...
-
エクセルの結合セル内に文章を...
-
VBA セル内で改行またはカンマ...
-
セルの左上に出る三角マークは...
-
セルに落書きしたいのですが・・・
-
エクセルのセル内で改行コピー...
-
エクセル 行も列もバラバラの入...
-
VBA ダブルクリックでセルの真...
-
エクセル 数式の無効化
-
PowerPointの表内のカンマ
-
Wordの差し込み印刷で空白行が...
-
EXCELでタイトル行と一番下の行...
-
エクセルで休日の「休」という...
-
【VBA】PDF出力に任意のファイ...
-
EXCEL 連動したドロップダウン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでハイパーリンクのコピー
-
エクセルでセル内改行の1行目...
-
結合されたセルの一部を変更す...
-
エクセルの結合セル内に文章を...
-
アクティブセルとそのセルに隣...
-
エクセル 0:00 の時間をカウン...
-
エクセルのセル内で改行コピー...
-
VBA セル内で改行またはカンマ...
-
エクセルで 来年の曜日の自動設定
-
VBAからのHYPERLINK関数のアド...
-
エクセル 行も列もバラバラの入...
-
Excel vba 毎月の第○ △曜日を求...
-
【Excel】 色の一致するセル数...
-
VBA ダブルクリックでセルの真...
-
エクセルのセルの右下の角の十...
-
行ごとの最大値に色付けし、列...
-
Excel VBAで可視セルをコピーし...
-
Word文書にパスワードをマクロ...
-
至急excelに関して質問です。 ...
-
Excel セル貼り付けができません
おすすめ情報