
発注関係のプログラムをVBAで作成しています。
月の中で、1週間で月~土のある週のうち、最終週を求めたいと考えています。
伝わりにくいのですが、例えば2024年であれば
9月:第5週まであるが、月~土まであるのは9/22の週
10月:10/20の週
といったようにして求めたいと考えています。
if文のフラグとして使う予定です。
Weekday関数なのか、Eomonth関数なのか、どれを組み合わせるとスマートな方法に
なるでしょうか。
ヒントをいただければと思います。
No.4ベストアンサー
- 回答日時:
こんな感じでも。
Function LastWeek(y, m) As Date
Dim dt As Date
dt = DateSerial(y, m + 1, 1)
LastWeek = dt - Weekday(dt) - 6
End Function
【使用例】
? LastWeek(2024,9)
2024/09/22
No.6
- 回答日時:
こんにちは
指定月の最終土曜日を求めて、その6日前(=日曜日)がお求めの日になると考えられます。
指定する月を 年、月で指定するとして、
Function lastWeekSet(ByRef y As Integer, ByRef m As Integer) As Date
lastWeekSet = DateSerial(y, m + 1, 0) ' 月末日
lastWeekSet = lastWeekSet - 6 - (Weekday(lastWeekSet) Mod 7)
End Function
のような関数を作成しておけば良いでしょう。
使い方は、上記の通りで、例えば 2024/9 なら
dd = lastWeekSet(2024, 9)
とすれば、変数 dd には 2024/9 で、一週が全部含まれている週の日曜日である 2024/9/22 のシリアル値が返されます。
No.5
- 回答日時:
No2です。
No4の方の回答のほうが、すっきりしてますね。
そちらを採用してください。
こちらにて、皆様へのお礼とさせていただきます。
色々と教えていただき、ありがとうございました。
皆様からの共通なものとして、翌月初日からのweekday分と、そこから定数である土曜日のweekday分の6を引くという考え方がよくわかりました。
こちらが難しく考えていたようで、決まった法則で処理することができますね。勉強になります、ありがとうございました。
No.3
- 回答日時:
回答を投稿したのですが、画像審査中のため、回答が表示されていませんが、回答が表示されたら、この回答を読んでください。
Private Function getLastSunday(ByVal yyyy As Long, ByVal mm As Long) As Date
の中に
Debug.Print Lastday
の行がありますが、これは確認用の行です。
コメントアウトするか、削除するかしておいてください。
No.2
- 回答日時:
以下は、西暦年、月が指定された時、該当する日曜日の日付を
返す関数 getLastSunday
とその関数の呼び出し例です。
添付図のA列が西暦年、B列が月になっています。この時、西暦年と月から
該当する日曜日の日付を求め、C列に表示しています。
呼び出し側のプロシージャである月土最終週()はテストのために作成したものです。実際に使用するのは、getLastSundayになります。
getLastSundayの考え方は以下の通りです。
①指定年月の月末日を取得
②月末日から1日に向かって、以下の判定を繰り返す。
その日が土曜日かを判定し、土曜日なら、その日付から6日を引いた日付が、求める日付となる。(繰り返し終了)
その日が、土曜日でないなら、更にその日の前日の日付について同様に判定を行う。
------------------------------------------------
Public Sub 月土最終週()
Dim ws As Worksheet
Dim yyyy As Long
Dim mm As Long
Set ws = ActiveSheet
For wrow = 2 To 13
yyyy = ws.Cells(wrow, 1).Value
mm = ws.Cells(wrow, 2).Value
ws.Cells(wrow, 3).Value = getLastSunday(yyyy, mm)
Next
End Sub
Private Function getLastSunday(ByVal yyyy As Long, ByVal mm As Long) As Date
Dim Lastday As Date
Dim wday As Date
'月末日を求める
Lastday = DateSerial(yyyy, mm + 1, 1) - 1
Debug.Print Lastday
'月末日に最も近い土曜日の日付を探す
For wday = Lastday To Lastday - 7 Step -1
If Weekday(wday) = 7 Then
'探した土曜日の日付から6日減算する
getLastSunday = wday - 6
Exit Function
End If
Next
End Function

No.1
- 回答日時:
西暦年と月が与えられた時、該当する日曜日の日付を返すような関数があれば良いのでしょうか。
例
年=2024
月=9の時
戻り値=2024/9/22
年=2024
月=10の時
戻り値=2024/10/20
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dir関数のDo Whileステートメン...
-
【マクロ】【画像あり】ファイ...
-
5単位で繰り上げしたい
-
【マクロ】【画像あり】4つの...
-
【マクロ】【画像あり】4つの...
-
Excelで4択問題を作成したい
-
【マクロ】数式を入力したい。...
-
エクセルのVBAで集計をしたい
-
vba テキストボックスとリフト...
-
エクセルのリストについて
-
Office2021のエクセルで米国株...
-
【マクロ】【配列】3つのシー...
-
【マクロ】左のブックと右のブ...
-
【マクロ】元データと同じお客...
-
【マクロ】【相談】Excelブック...
-
【マクロ】実行時エラー '424':...
-
セルにぴったし写真を挿入
-
オートフィルターの絞込みをし...
-
他のシートの検索
-
【画像あり】オートフィルター...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】元データと同じお客...
-
エクセルの関数について
-
【画像あり】オートフィルター...
-
エクセルのVBAで集計をしたい
-
エクセルのリストについて
-
【マクロ】数式を入力したい。...
-
【マクロ】【相談】Excelブック...
-
Office2021のエクセルで米国株...
-
【マクロ】実行時エラー '424':...
-
他のシートの検索
-
エクセルの複雑なシフト表から...
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
【マクロ】左のブックと右のブ...
-
【マクロ】変数に入れるコード...
-
エクセルシートの見出しの文字...
-
【マクロ】別ファイルへマクロ...
-
【関数】同じ関数なのに、エラ...
-
Amazonでマイクロソフトオフィ...
-
ページが変なふうに切れる
おすすめ情報
回答ありがとうございます。
そうですね、その戻り値があれば、inputboxで指定した日付と比較ができます。
それを基にして、該当日以前なら通常処理を、該当日よりも後であれば、戻り値を基準に処理をする
といったプログラムになります。