• ベストアンサー

休暇を引いた日付を表示させたい。

例1) 今日の10/10からカレンダーの休日を引いた3日前の日付を表示させたい。 例2)(8)の日は休日 10/10日 10/9 10/(8) 10/7 10/6 10/5  表示を10/6  エクセルでやりたいのですが? 出来たら関数を使って。またはVBAの場合はサンプルを付けて詳しくお願いしたいのですが? 勝手な相談で済みませんがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Nii
  • ベストアンサー率48% (79/162)
回答No.4

とりあえず、私の例は、金融機関の7営業日前等を求めたくて作成した分です。 このままで動作確認する方法ですが、 エクセルで、【ツール】→【マクロ】→【Visial Basic Editor】で新規ウィンドウが開くと思います。 新規のウィンドウで、【挿入】→【標準モジュール】で出来たサブウィンドウに#3の"Public Function 結果は(処理日 As Date,日前 as Integer) As Date"の行から最終行までを貼り付けて下さい。 これで、【fx】ボタンで表示される関数の貼り付けの中に、結果は・銀行休業日・祝日・第一月曜日の4つの関数がユーザー定義として表示され利用できるようになると思います。 各関数で行なっている内容としては、 結果は・・・与えられた日付から銀行の休業日を除く与えられた何日前かの日付を返す。 例:A1のセルに2002/11/5、B1のセルに=結果は(A1,3)とした場合、B1のセルには、2002/10/30と表示される。(書式はyyyy/mm/ddと設定) 銀行休業日・・・与えられた日付が銀行の休みかどうかを返す。 休業日は、土・日曜日・月曜日は、当日か前日(日曜日)が祝日の場合・他の曜日は当日が祝日の場合、12月31日・1月2日・1月3日とする。 祝日・・・与えられた日付が祝日かどうかを返す。 祝日とは、1月1日・2月11日・4月29日・5月3日・5月4日・5月5日・ 7月20日・9月15日・11月3日・11月23日・12月23日・春分の日・秋分の日・成人の日・体育の日とする。 春分の日・秋分の日は、変動するので、一定の公式をもって導きだす。(ここは説明すると長くなるので省略) 成人の日・体育の日は、2000年までは、固定でしたが、現在は、1月と10月の第一月曜なので、その都度計算する。 第一月曜・・・与えられた日付の最初の月曜日を返す。 そんな所ですか?ちょっとわかりにくい説明になってしまいました。すみません。

その他の回答 (5)

  • mayurin
  • ベストアンサー率25% (49/193)
回答No.6

こんにちは。実は私もこの前似たようなことをやりました。 アドインで分析ツールを組み込んで、セルに以下のように 入力すればOKだと思います。 (ヘルプでWORKDAYを検索してみたら詳しく出てきます) =WORKDAY("02/10/10",-3) これで2002年10月10日の稼働日で3日前が返されます。 もし、他に休日扱いした日があれば、 =WORKDAY("02/10/10",03,{"2002/10/09","2002/10/08"}) というように指定できます。(例では10月9日と8日を休日扱いにする) でも、質問中の例2)のように、休日を休日扱いしないということは できなかったと思います。(10/6は日曜日ですよね?)

回答No.5

私もVBAで作ってみました   Sheet1と祝日というシートを使用します (1)シート名「祝日」をつくりA列に日曜日以外の休日を入力    下のデータは、実際にhttp://www.benri.com/calendar/2002.htmlで拾いました。    2002年~2004年まであります。(それ以降は手入力して下さい)    #3さんのように祝日を自動で算出しようとも思いましたが、    調べていたら2003年から「海の日」と「敬老の日」が第3月曜日になるそうで    この分だと他も変わるかな?と思い祝日シートを作成しました。 '02/01/01 02/01/14 02/02/11 02/03/21 02/04/29 02/05/03 02/05/04 02/05/06 02/07/20 02/09/16 02/09/23 02/10/14 02/11/04 02/12/23 03/01/01 03/01/13 03/02/11 03/03/21 03/04/29 03/05/03 03/05/05 03/07/21 03/09/15 03/09/23 03/10/13 03/11/03 03/11/24 03/12/23 04/01/01 04/01/12 04/02/11 04/03/20 04/04/29 04/05/03 04/05/04 04/05/05 04/07/19 04/09/20 04/09/23 04/10/11 04/11/03 04/11/23 04/12/23    1.上記日付をコピー貼り付け    2.データ→区切り位置→カンマやタブなどの・・・をチェック→スペースをチェック→完了    3.横に並んでいますので全て選択→コピー    4.A1セルで形式を選択して貼り付け→行列を入れ替えるをチェック→OK    で縦に並びます (2)VBAを貼り付ける    1、[Alt]+[F11]を押す。VisialBasicEditerに変更されます。    2、左上にプロジェクトと書いてある中に、       VBAProject(現在のブック名)         └Microsoft Excel Objects            ├Sheet1             ・・・            └ThisWorkbook      とあると思うので、Sheet1をダブルクリック    3.以下のコードを貼り付ける *********************************この下から********************************* Private Sub Worksheet_Change(ByVal Target As Range) With Target If (.Column = 1 And .Row > 1) Then 'A列2行目以降ならば If (IsDate(.Value)) Then '日付ならば w_date = .Value '日付をセットする CNT = 0 '日付を1日づつ前に戻し、土日、祝日かチェックし休日でなければCntを加算する 'cnt = 3(土日、祝日を除いた日が3日前になったら処理を終わる) Do Until (CNT = 3) w_date = w_date - 1 '休日のチェック(土曜日は休日に入れない場合 6→7に変更する If (Weekday(w_date, vbMonday) < 6) Then '土、日でなければ CNT = CNT + 1 'カウントの加算 '祝日のチェック With Worksheets("祝日") 'シート名[祝日]のA列の入力が入っている行を最後まで検索し 'w_date が祝日と同じ日かチェックする For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row If (w_date = .Cells(i, 1)) Then CNT = CNT - 1 '祝日の場合Cntを減算する Exit For End If Next i End With End If Loop Cells(.Row, 2) = DateValue(w_date) '入力行のB列に日付を表示 Else Cells(.Row, 2) = "***" '入力行のB列にエラー表示 End If End If End With End Sub *********************************この上まで*********************************    4.もし土曜日は休日でないならば、      '休日のチェック(土曜日は休日に入れない場合 6→7に変更する      の下の      If (Weekday(w_date, vbMonday) < 6) Then '土、日でなければ      を      If (Weekday(w_date, vbMonday) < 7) Then '日でなければ      に変更してください。 (3)[Alt]+[F11]でExcelに戻り    Sheet1のA2セルに[2002/12/10]と入力すると    B2セルに[2002/12/5]((2)の4で土曜日の処理を変更すれば[2002/12/6])    と表示されます。 なるべくプログラムにコメントをいれて修正しやすくしていますが、 わからない所などありましたら、補足してください。 長くなってしまいすみません。

  • Nii
  • ベストアンサー率48% (79/162)
回答No.3

10月の例を示して頂いていますが、2002年の10月8日がカレンダーの休日というのも変なので、12月という事ですよね? ・土曜日・日曜日・祝日を休みとカウント ・祝日が日曜日と重なった場合は、月曜日を振替休日とする。 で以前に作成した分です。 このままでは使用できないと思いますが参考にして下さい。 A1のセルから3日前を表示させたい場合は、=結果は(A1)で、セルの書式を日付にすればOKです。 Public Function 結果は(処理日 As Date,日前 as Integer) As Date Dim CNT As Integer 結果は = 処理日 Do While CNT < 日前 結果は = 結果は - 1 If Not 銀行休業日(結果は) Then CNT = CNT + 1 End If Loop End Function Public Function 銀行休業日(今日 As Date) As Integer Dim 曜日 As Integer 曜日 = Weekday(今日) Select Case 曜日 Case 1, 7 銀行休業日 = -1 Case 2 If 祝日(今日) Or 祝日(今日 - 1) Then 銀行休業日 = -1 Else 銀行休業日 = 0 End If Case Else If 祝日(今日) Then 銀行休業日 = -1 Else 銀行休業日 = 0 End If End Select Select Case Format(今日, "mmdd") Case 102, 103, 1231 銀行休業日 = -1 End Select End Function Public Function 祝日(今日 As Date) As Integer Dim 年 As Long Dim 春分の日, 秋分の日, 成人の日, 体育の日 As Date 年 = Year(今日) If 年 >= 2000 Then 成人の日 = 第一月曜(DateSerial(年, 1, 1)) + 7 体育の日 = 第一月曜(DateSerial(年, 10, 1)) + 7 Else 成人の日 = DateSerial(年, 1, 15) 体育の日 = DateSerial(年, 10, 10) End If 春分の日 = DateSerial(年, 3, Int(0.24242 * 年 - Int(年 / 4) + 35.84)) 秋分の日 = DateSerial(年, 9, Int(0.24204 * 年 - Int(年 / 4) + 39.01)) Select Case Format(今日, "mmdd") Case 101, 211, 429, 503, 504, 505, 720, 915, 1103, 1123, 1223, Format(春分の日, "mmdd"), Format(秋分の日, "mmdd"), Format(成人の日, "mmdd"), Format(体育の日, "mmdd") 祝日 = -1 Case Else 祝日 = 0 End Select End Function Public Function 第一月曜(今日 As Date) As Date 今日 = DateSerial(Year(今日), Month(今日), 1) Do Until Weekday(今日) = 2 今日 = 今日 + 1 Loop 第一月曜 = 今日 End Function

sumi-hama
質問者

補足

早速ご丁寧な回答を頂きまして有難うございます。可也な達人ですね!私の能力不足で全然意味が分かりません。 これはVBAで行う記述なのでしょうか?精々エクセルの関数を使ったやり方しか理解できません(**)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

下記大事な点が明確でないと思います。補足をお願いします。 >)(8)の日は休日 の意味は。 10月8日(平成14年)は火曜日だが、会社は火曜日が 毎週休みですか。またはその社員が休日を取ったのですかか。あるいはある年の10月8日を日曜日として仮定したときの話ですか。 >カレンダーの休日を引いた 会社の勤務日のカレンダのことですか。一般の暦の日曜日 のことですか。土曜日は休みですか。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 WORKDAY関数を使うとお望みのことが出来るかも知れません。 ただし、WORKDAY関数はアドインを使って、分析ツールを組み込まないと使えません。 詳細は、ヘルプなどを参照して下さい。 OFFICEのCD-ROMが必要になるかも知れません。

関連するQ&A

  • 日付の計算できる関数は無いですか?

    カレンダーの日付を参照して、 昨日の日付(2001-12-06)を今日の日付(2001-12-07) から見て何日前の日付であるかを確認できるような関数 はありませんか?この場合(-1)と返してくれるような。 私、PHPに関しましては素人なもので・・・ よろしくお願いいたします。

    • 締切済み
    • PHP
  • 日付の表示について

    エクセルの表に今日の日付を表示させたいのです。 いちいちその日の日付を入力するのではなくて、 その表を開いた日、今日開いたら2003/08/20で明日ひらいたら、2003/08/21という感じにできますか? よろしくお願いします。

  • Excel 日付の3日後を表示し土日は飛ばしたい

    Excel365です。 A1に「10/3(月)」と入っています ※書式(m/d(aaa))で表示 B1に、3日後の日付を表示したいです。 単純な数式だと「=A1+3」→「10/6(木)」と表示されます。 もし、3日後が土日の場合、その日を飛ばして表示することは可能でしょうか? <例> ・A1が「10/5(水)」の場合、3日後は「10/8(土)」の為、「10/10(月)」と表示。 ・A1が「10/6(木)」の場合も、3日後は「10/9(日)」の為、「10/10(月)」と表示。 ・「10/7(金)」の場合、土日は挟みますが、3日後は月曜日なので3日後の日付が表示される。 関数で可能でしょうか?

  • 日付けについて

    エクセルで見積を作成しています。 見積作成した日付を関数で表示させるように 試みています。  NOWという関数があるのですが この関数では、シートを開くと更新されてしまいますので 今日の日付になって、いつ作成をしたのか 確認ができなくなってしまいす。  関数を使って見積を作成した日を固定するにはどのような 関数を使うと良いでしょうか?  御願いします。

  • 【エクセル】今日の日付に赤枠をつけたい【Excel】

    【エクセル】今日の日付に赤枠をつけたい【Excel】 無知なわたしめにどなたかお助けお願いします! エクセルを使ったカレンダーが必要なのですが、 画像のようなカレンダーで、今日の日付のところに自動的に赤枠をつけていきたいのです。 やればやる程深みにハマっていき・・・ やはり、マクロか何かの知識が必要になってくるのでしょうか。 どなたかご指南の程よろしくおねがいします。 画像:6月16日の場合になります 日にちのところには、関数は入っておらず、ただ数字が入力してあるだけになります。

  • 日付が過ぎたら表示できる関数などを教えて下さい。

    エクセルで今日の日付が過ぎたら「未入金」と表示と色を赤く表示させたいのですが、どのように関数などを使ったら良いのでしょうか。1つのシートに2000人、分割払いの、集金日もまちまちで、入金予定日の横に「未入金」と表示させたいのです。検索で2000人の内、誰が未収金か一目で分かるように作りたいのですが、、、、。文面が分かりづらくてスミマセンが、よろしくお願い致します。

  • エクセルの日付関数について教えてください。

    エクセルの日付関数について教えてください。 A列には日付が入力されています。 B列には金額が入力されています。 C列にも日付が入力されています。 A1に入力された日付(例:2010/4/30)とC1に入力された日付(例:2010/4/30)が同じ日付のときだけ、B列の金額を抽出しD10に合算させたいと考えています。 ***【サンプル】*****************************    A   B   C   D 1 4/30  100  4/30 2 4/30  200  4/30 3 5/1   100   4 5/2   200  5/2 5 5/2   100  5/2 6 7 8 9 10            同じ日付(1)の合計 11            同じ日付(2)の合計 ******************************************* 上記の場合のD10やD11の関数は、どのような関数に すべきでしょうか? どなたかご教授をお願い致します。 【環境】 WindowsXP Pro Excel 2003

  • エクセルVBA テキストボックス 日付表示

    エクセルVBAにて入力用フォームを開いたときに フォーム内にあるテキストボックスに今日の日付が 自動で表示されるようにしたいのですが どの様に書き込めば宜しいでしょうか? また、2008.09.05 平成20年9月5日などの 日付形式の変更はどの様に書き込むのでしょうか?

  • 日時を日付のみの表示に

    201411291230のような日付と時間の表示を、 2014/11/29のように、/で区切った日付のみの表示にしたいです。 関数は色々あるのですが、関数を使用しなくても、 書式設定のユーザー定義などで簡単にできるのでしょうか。 Excelは2013または2010でお願いします。

  • Excelである日付を設定してTODAY関数で出した今日の日付がある日

    Excelである日付を設定してTODAY関数で出した今日の日付がある日付の一ヶ月前になると『一ヶ月前です』と表示にするにはどうすればいいでしょうか?

専門家に質問してみよう