難しいことを言う人だな。
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(日付、日付シリアル値)をいろいろ変えてテストを十分してみてください。