- 締切済み
エクセルの関数で水・日・祝日をカウントしないで4日後の日付を算出したいです。
エクセルの関数で、指定日から起算して「水・日・祝日をカウントしなしで4日後」の日付の設定をしたいのですが、WORKDAY関数では、土・日・祝をカウントしない設定なので困っております。他に適切な関数がありますでしょうか。本当に困ってます。誰か助けてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
以下のようなアドインを使うと、ワークシート関数でいけるかも。 http://www.h3.dion.ne.jp/~sakatsu/ktfunc_main.htm http://www.h3.dion.ne.jp/~sakatsu/ktfunc_0403.htm http://www.h3.dion.ne.jp/~sakatsu/ktfunc_ref0503.htm ご参考まで...
- zap35
- ベストアンサー率44% (1383/3079)
#02です。先の回答では引数で与えた日数を参照していませんでした。以下に訂正します。また必要ないかもしれませんがWORKDAY関数同様「-n日」も対応できるようにしました。 Function irrWorkday(ByVal trg As Range, dt As Integer, rholiday As Range) As Date Const excptWD As String = "1,4" '日:1,月:2,火:3,水:4,木:5,金:6,土:7 Dim expWD() As String Dim cnt, inc, idx, trgWD As Integer Dim res If IsDate(trg.Value) Then expWD = Split(excptWD, ",") Do inc = inc + dt / Abs(dt) trgWD = Weekday(trg.Value + inc) '祝日Check If rholiday Is Nothing Then Set res = Nothing Else res = Application.Match(CLng(trg.Value + inc), rholiday, 0) End If '曜日Check If Not IsNumeric(res) Then For idx = 0 To UBound(expWD) If trgWD = Val(expWD(idx)) Then Exit For End If Next idx If idx > UBound(expWD) Then cnt = cnt + 1 irrWorkday = trg.Value + inc End If End If Loop Until cnt >= Abs(dt) Or Abs(inc) > 30 End If End Function
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Workday 関数は、土曜日は含まれませんので使えません。かといって、この程度のことで、他人のアドインを使うというのは、いかがかと思います。VBAユーザー定義関数では、ごく初歩的な内容なのです。(Workday関数は、標準添付の「分析ツール」のアドインです) VBAでは、以下のようなワークシート関数とは考え方が違い、1日ずつ数えて、4日になったら終了し、その終了した日付を返すという考え方をします。(日付計算は、「両入れ」です。「片入れ」でしたら、1日加えてください。「両入れ」計算のほうが、起算日が休日の場合を考えると無難だと思います。) 今回は、あえて関数で処理します。 ここでは、水曜日、日曜日、祝日ではない日を一覧で、31まで出して、その中から、少ないほうから、4つ目の日付を返すようにするわけです。 =SMALL(IF((WEEKDAY(A1+ROW($A$1:$A$31)-1)<>1)*(WEEKDAY(A1+ROW($A$1:$A$31)-1)<>4)*ISERROR(MATCH(A1+ROW($A$1:$A$31)-1,holiday,0)),(A1+ROW($A$1:$A$31)-1),""),4) 31日までの計算をします。「$A$1:$A$31」これで、31日まで調べます。 配列数式ですから、配列確定が必要です。 配列確定するとは、 「一旦式を入力したら、F2を押して、『ShiftとCtrlを押しながらEnterキー』を押して、再確定してください。」ということです。 配列数式になると、{ } (中括弧)で囲まれます。 日付は、A1 に入力しました。 最後の「,4)」 が、4日後ということです。 [holiday] は、 挿入-名前-定義で、 07/09/24 07/10/08 07/11/03 07/11/23 07/12/24 08/01/01 08/01/14 08/02/11 08/03/20 08/04/29 08/05/03 このようなリストを登録しています。(自作の関数で出したものですから、内容は合っているかは分かりません)
- zap35
- ベストアンサー率44% (1383/3079)
ワークシート関数では無理だと思いましたので、ユーザ定義関数を作ってみました。以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。 ワークシート画面に戻り =irrWorkday(起算日、日数、祝日の範囲) を入力します(WORKDAY関数と同じ使い方です) 除外する曜日を変更するなら2行目のConst宣言を変更してください。(半角カンマ区切りで曜日を並べる) Function irrWorkday(ByVal trg As Range, dt As Integer, rholiday As Range) As Date Const excptWD As String = "1,4" '日:1,月:2,火:3,水:4,木:5,金:6,土:7 Dim expWD() As String Dim cnt, inc, idx, trgWD As Integer Dim res If IsDate(trg.Value) Then expWD = Split(excptWD, ",") Do inc = inc + 1 trgWD = Weekday(trg.Value + inc) '祝日Check res = Application.Match(CLng(trg.Value + inc), rholiday, 0) '曜日Check If IsError(res) Then For idx = 0 To UBound(expWD) If trgWD = Val(expWD(idx)) Then Exit For End If Next idx If idx > UBound(expWD) Then cnt = cnt + 1 irrWorkday = trg.Value + inc End If End If Loop Until cnt >= 4 Or inc > 30 'inc>30は無限Loop防止用 End If End Function
- shut0325
- ベストアンサー率40% (490/1207)
よくある「4営業日」みたいなものですよね。 指定日+4日が水曜/土日祝ならば1日プラスして、再度判定する、、これをOK(条件クリア)になるまでループするような関数を作ってしまえばよいと思います。 私はExcel2000を使っていてWorkDay関数はないので引数や戻り値(日付?)がどうなっているか分かりませんが、日付を返すものなら、Weekday(WorkDay(指定日,4))=4(水曜日) がTrueならカウント((指定日,4)の4のこと)を1ふやして再度水曜日かどうかを判別しFalseの時の日付を返すようにすればよいかと思います。 **(指定日,4)の記述はたとえなのでそのままでは使えません。 参考までに。