Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10634 / 13646 ツリー ←次へ | 前へ→

【20698】任意の日付が休日かを判断し、休日の場合は前日に繰り上げるには きどっち 04/12/15(水) 18:34 質問[未読]
【20703】Re:任意の日付が休日かを判断し、休日の場... [名前なし] 04/12/15(水) 23:09 回答[未読]
【20707】Re:任意の日付が休日かを判断し、休日の場... [名前なし] 04/12/16(木) 0:20 発言[未読]
【20705】Re:任意の日付が休日かを判断し、休日の場... かみちゃん 04/12/15(水) 23:36 回答[未読]
【20706】Re:任意の日付が休日かを判断し、休日の場... 角田 04/12/15(水) 23:37 回答[未読]
【20709】Re:任意の日付が休日かを判断し、休日の場... きどっち 04/12/16(木) 2:35 お礼[未読]

【20698】任意の日付が休日かを判断し、休日の場合...
質問  きどっち  - 04/12/15(水) 18:34 -

引用なし
パスワード
   初めての投稿です。下記のような処理をしたいのですが、
1.まず任意の日付を指定します。
2.その日から指定した日数だけさかのぼり、その日が営業日であるかを判断。
3.もしその日が休業日であれば、営業日になるまで1日ずつ繰り上げる。
何とかExcelの持つ関数と数式で何とかならないものかと思案しておりましたが、「2〜3」の処理がループとなる為、VBAでユーザー定義関数を作るしかないかなと思っています。

土日祝祭日については参考になりそうなものがありましたので、何とかなりそうです。また会社の休日は毎年更新する為ワークシートにおいてリストにしますので、関数と引数は、BDAY(任意の日付,何日前か,土日祝祭日を除く会社の休業日)と考えています。
VBAによるユーザー定義関数は簡単な加減乗除程度しか出来ない為、ご教授頂ければと。よろしくお願いします。

【20703】Re:任意の日付が休日かを判断し、休日の...
回答  [名前なし]  - 04/12/15(水) 23:09 -

引用なし
パスワード
   考え方は下の感じでいいと思うのですが。

Function BDAY(任意の日付 As Date, 何日前か As Double, 土日祝祭日を除く会社の休業日 As Range)
 Dim BeforeDate As Date
 Dim 休業日チェック As Boolean
 Dim 土日祝祭日チェック As Boolean
 
 BeforeDate = 任意の日付 - (何日前か + 1) '下で1日足すので、1日多く引いておく
 Do
  BeforeDate = BeforeDate + 1 '1日足す
  '土日祝祭日を除く会社の休業日の範囲内にBeforeDateが1つもなければTrue
  休業日チェック = Application.CountIf(土日祝祭日を除く会社の休業日, BeforeDate) = 0
  土日祝祭日チェック = 土日祝祭日にBeforeDateがなければTrue
 Loop Until 休業日チェック And 土日祝祭日チェック '両方ともTrueになるまでループ
 BDAY = BeforeDate '最終的なBeforeDateを返す
End Function

「土日祝祭日にBeforeDateがなければTrue」はおわかりになってるんですよね?
ご自分で組み込んでみてください。
検証はしてません・・・っていうか出来ません。

【20705】Re:任意の日付が休日かを判断し、休日の...
回答  かみちゃん  - 04/12/15(水) 23:36 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>1.まず任意の日付を指定します。
>2.その日から指定した日数だけさかのぼり、その日が営業日であるかを判断。
>3.もしその日が休業日であれば、営業日になるまで1日ずつ繰り上げる。

以下のURLにある「祝日判定関数」ktHolidayNameを利用して、祝日を判定する
ものとした場合、以下のコードで実現できます。
http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm

Option Explicit

Public Function GetBeforDay(ByVal TargetDate As Date, DayCount As Integer) As Date
 Dim c As Range
 
 TargetDate = TargetDate - DayCount
  
 '求める日付が確定するまで繰り返す(無限ループ)
 Do While True
  '祝祭日でない場合
  'ktHolidayName関数を利用
  '参考URL http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm
  If ktHolidayName(TargetDate) = "" Then
   '土曜日日曜日以外の場合
   If Weekday(TargetDate) <> 1 And Weekday(TargetDate) <> 7 Then
    '独自休業日の検索 … A列に設定してある場合
    'A列の書式設定は、yyyy/m/dにしてあるものとする。
    With Columns("A")
     Set c = .Find(Format(TargetDate, "yyyy/m/d"), LookIn:=xlValues)
     '独自休業日が設定してある場合
     If c Is Nothing Then
      'TargetDateの繰上がりを終了する … 求めるTargetDateの確定
      Exit Do
     End If
    End With
   End If
  End If

  '日付を1日繰り上げる
  TargetDate = TargetDate - 1
 Loop
 
 GetBeforDay = TargetDate
End Function

あとは、=GetBeforDay("2004/12/25",2)
で、2004/12/22が取得できます。
(動作確認済みです)

【20706】Re:任意の日付が休日かを判断し、休日の...
回答  角田 WEB  - 04/12/15(水) 23:37 -

引用なし
パスワード
   こんにちは。
「土日+祝日+会社休日」であれば
分析ツールのWORKDAYで充分ですよ。

> 会社の休日は毎年更新する為ワークシートにおいてリストにしますので
祝日一覧の中に会社休日の日付を含めれば良いだけです。

> 2.その日から指定した日数だけさかのぼり、その日が営業日であるかを判断。
> 3.もしその日が休業日であれば、営業日になるまで1日ずつ繰り上げる
「ある日が休業日なら前営、営業日ならそのまま」というのは
【ある日の翌日から見て1営業日前】です。

逆に、「ある日が休業日なら翌営、営業日ならそのまま」というのは
【ある日の前日から見て1営業日後】です。

> BDAY(任意の日付,何日前か,土日祝祭日を除く会社の休業日)
  ↓
WORKDAY(任意の日付-日数+1,-1,[祝日+会社休日]のセル範囲)

【20707】Re:任意の日付が休日かを判断し、休日の...
発言  [名前なし]  - 04/12/16(木) 0:20 -

引用なし
パスワード
   うーん、なるほど。他の人の回答を見ると勉強になるなぁ。
ということで、自分の回答はあまり参考にならないと思いますです。
申し訳ないです。

【20709】Re:任意の日付が休日かを判断し、休日の...
お礼  きどっち  - 04/12/16(木) 2:35 -

引用なし
パスワード
   早速の回答ありがとうございます。
WORKDAY関数が比較的作り易そうですね。ヘルプには「稼動日とは、土曜、日曜、および指定された祭日を除く日のこと」とありますが、ということは引数で指定する祭日は土日以外と考えていいのでしょうかね。(試してみるのが手っ取り早いんでしょうけど…)そうだとしたら私の目論見に近い処理になりますね。
また、これを機会に今後はVBAなども積極的に取り入れていくべく、ご紹介頂いたコードを参考にいろいろな方法を試してみたいと思います。

10634 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free