- 締切済み
vbaで日付から曜日と祝日を求める方法
vbaでWeekday関数を使わないで日付から曜日と祝日を求める方法を教えてください 課題でカレンダーを作らなきゃいけないんですが関数は使わないでと言われています
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
難しいことを言う人だな。 vbaまで使いながら、エクセル関数はダメとはこれ如何に。WorksheetFinctionでWeekdayを使うのはどうなのか。だめ? ーーー 下記はエクセルの、「日付シリアル値」という考え・仕組みを十分に判っている必要がある。 曜日は日付シリアル値を7でわった余りで判別できる。 Sub test02() x = Date - Int(Date / 7) * 7 - 1 MsgBox Format(x, "0") End Sub Sub test03() x = #4/1/2021# - Int(#4/1/2021# / 7) * 7 - 1 MsgBox Format(x, "0") End Sub 上記では今年の4月1日は4となり、木曜日です。 これで判別したら。 ===== ユーザー関数を作ると 例データ A1:C12 のA列、BC列は関数やVBA実行の結果です。 日付 Weekday関数 私製関数 2021/4/1 4 4 2021/4/2 5 5 2021/4/3 6 6 2021/4/4 7 7 2021/4/5 1 1 2021/4/6 2 2 2021/4/7 3 3 2021/4/8 4 4 2021/4/9 5 5 2021/4/10 6 6 2021/4/11 7 7 B列B2には関数 =WEEKDAY(A2,2) 下方向に式を複写。 ーー 標準モジュールに ユーザー関数 Function weekdy(x) x = x - 2 x = (x Mod 7) + 1 weekdy = x End Function を作る。 標準モジュールに Sub test05() For i = 2 To 12 x = Cells(i, "A") Cells(i, "C") = weekdy(x) Next i End Sub 実行するとC列のようになり、B列のエクセル関数と一致するのでOKかと思う。 ==== さて祝日打がの判定だが、年によって、国によって、変わる。 だから日本国用のその年のテーブルを作って、それを使って、VLOOKUP検索のようなことをせざるを得ない.毎年祝日のテーブルのメンテが必要。 どこかのシートに 祝日 2021/01/01 元旦 2021/01/11 成人の日 2021/02/11 建国記念日の日 2021/02/23 天皇誕生日 2021/03/20 春分の日 2021/04/29 昭和の日 2021/05/03 憲法記念日 2021/05/04 みどりの日 2021/05/05 こどもの日 2021/07/22 海の日 2021/07/23 スポーツの日 2021/08/08 山の日 2021/08/09 振替休日(山の日が日曜日のため) 2021/09/20 敬老の日 2021/09/23 秋分の日 2021/11/03 文化の日 2021/11/23 勤労感謝の日 を作り(情報はWEBから) 標準モジュールに、ユーザ関数 Function shuku(x As Date) Set fnd = Worksheets("Sheet2").Range("a2:A18").Find(what:=x) If fnd Is Nothing Then shuku = "n" Else shuku = "Y" End If End Function を作って、テスト用に Sub test07() Dim d As Date d = "2021/2/12" MsgBox shuku(d) End Sub d(日付、日付シリアル値)をいろいろ変えてテストを十分してみてください。
- _kappe_
- ベストアンサー率68% (1581/2304)
年月日から計算で曜日を求める方法としては、ツェラーの公式というのが有名です。「ツェラーの公式 VBA」でググってください。 https://www.google.com/search?q=%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F+VBA 既に回答がついているとおり年月日から祝日を計算で求めることはできません。たとえば春分の日・秋分の日は国立天文台がその都度決めるものなので厳密には予測できませんし、去年・今年のようなオリンピック関連の変則運用もあります。 課題であるなら、祝日を判定する方法についてもヒントが与えられているのではないかと思います。たとえば、祝日の判定をしなければいけない範囲を1990年〜2021年の間に限定するなど。
- NuboChan
- ベストアンサー率47% (785/1650)
No1さんの回答に付加して、 祝日の判断は、 固定日(毎年変わらない祝日) - ハッピーマンデー(第〇月曜日) - 振替休日 - 春分の日、秋分の日(毎年変わるが計算で求められる) - 国民の休日(祝日で挟まれた日) なので直近の年にならないと判断できない。 (プログラムも変更がずっと無くは無理。) 直近の祭日は、 休日として別シートに書き出すなど事前に準備して VBAで日付比較で祝日判断を別途設ける ------------------------ 課題や趣味の領域ならWeekday関数を使わないが前提なら 厄介な判断を網羅するようなコードになります。
- watanabe04
- ベストアンサー率18% (295/1598)
ある年の1/1を基準にして ・1年経てば曜日が1つ右にずれる。 ・うるう年なら更に1日右にずれる。 (4年に一度うるう年、100年に一度は平年、400年に一度はうるう年) 1月から先月までの日数ぶん右にずれる。 祝日は ・日付指定(1/1、2/23など) ・月曜指定(1月2週成人の日など) ・年によって変わる(春分の日、秋分の日) ですね。