2010年2月11日 星期四

F003-2 計算有補上班日的工作日-WorkdayPlus

先前在F003-1 計算有補上班日的工作日-NetWorkdaysPlusA011 用目標搜尋求解困難的公式 我們可以利用 NetworkdaysPlus 函數反求有補上班日的工作天日期. 但是這種方法不能用在同一個工作表的多個儲存格上. 我們必須要想辦法將它寫成 VBA 函數才可以.

我們要做 WorkdayPlus 函數有四個參數:
  1. start_date 日期: 參考日期
  2. days 數字: 要找的向前或向後多少工作天數
  3. holidays 範圍(選擇性): 包含額外的假日清單
  4. workdays 範圍(選擇性): 包含額外的補班日清單
有了NetWorkdayPlus 函數, 我們就不再反覆搜尋假日和補班日的清單了. 演算法如下
  1. 將 start_date 加上 days, 成為第一個猜測的結果 result
  2. 檢查 start_date 和 result 之間的工作天數 (用 NetWorkdaysPlus), 與 days 的差異有幾天 diff
  3. 如果 diff 不是零, 將 result 加上 diff 之後, 重新執行第二個步驟
  4. 如果 diff 是零, result 就是結果
試算的工作表如下. 我們計算 2010/1/1 起算的第30個工作天日期, 結果是 2010/2/11.

將演算法寫成 VBA. 另外我還修改了 NetWorkdaysPlus 的參數型態, start_date 和 end_date 原本是 Range, 但為了要讓 WorkdayPlus 呼叫, 改為純量值的 Date.

我們就可以在工作表上使用函數型式的 WorkdayPlus 了.

下載: 範例檔案

沒有留言:

張貼留言