工作日假期参数不接受数组

时间:2018-01-23 13:30:28

标签: arrays excel vba excel-vba

我试图将vba声明的日期数组传递给excel函数WorkDay中的Holidays Argument。从目前为止的研究中可以通过Range和TechontheNet建议可以传递一系列日期序列号。 下面的代码可以很好地执行工作日功能 - 在这一点上炸弹......

注意:EasterDate和HolidayDate是返回值" date"格式,我也试过没有设置这些值的运行,但它没有区别......

Function WorkDayFiveA(DateofSpend As Date) As Boolean
    Dim WDFive As Date, RefDate As Date
    Dim Holidays(9) As Date
    Dim wf As WorksheetFunction

' load holiday array
    Holidays(0) = DateSerial(Year(Date) - 1, 12, 25)    ' last Christmas
    Holidays(1) = DateSerial(Year(Date) - 1, 12, 26)    ' Last Boxing day
    Holidays(2) = DateSerial(Year(Date), 1, 1)          ' News year day
    Holidays(3) = EasterDate(Year(Date), 1)             ' Good Friday
    Holidays(4) = EasterDate(Year(Date), 2)             ' Easter Monday
    Holidays(5) = PublicHolidayDate(Year(Date), 1)      ' May day
    Holidays(6) = PublicHolidayDate(Year(Date), 2)      ' Spring Holidays
    Holidays(7) = PublicHolidayDate(Year(Date), 3)      ' Spring Holidays
    Holidays(8) = DateSerial(Year(Date), 12, 25)        ' next Christmas day
    Holidays(9) = DateSerial(Year(Date), 12, 26)        ' next Boxing

    Set wf = Application.WorksheetFunction

    WDFive = wf.WorkDay(DateSerial(Year(Date), Month(Date), 1), 4, Holidays)

    If Date < WDFive Then
        RefDate = DateSerial(Year(WDFive), Month(WDFive) - 1, 1)
    Else
        RefDate = DateSerial(Year(WDFive), Month(WDFive), 1)
    End If

    If DateofSpend < RefDate Then
        WorkDayFiveA = True
    Else
        WorkDayFiveA = False
    End If
End Function

感激不尽的任何帮助。

2 个答案:

答案 0 :(得分:2)

此问题似乎有时出现在 Excel 2016 中,并始终出现在 Excel 2013 和早期版本中。

一种可能的解决方案 - Holdiay阵列应该由常数序列号组成,例如,将其声明为from docx import Document document = Document() table = document.add_table(rows=4, cols=2) table.style = 'Table Grid' ,而不是Long

Date

The documentation of WorkDay

假期 - 要从工作日历中排除的一个或多个日期的可选列表,例如州和联邦假日和浮动假期。该列表可以是包含日期的一系列单元格,也可以是表示日期的序列号的数组常量。

对我来说( Excel 2013 x32)此代码有效,但如果我声明Dim Holidays(9) As Long Holidays(0) = DateSerial(Year(Date) - 1, 12, 25) ' last Christmas Holidays(1) = DateSerial(Year(Date) - 1, 12, 26) ' Last Boxing day Holidays(2) = DateSerial(Year(Date), 1, 1) ' News year day 则不起作用:

holidays(3) as Date

答案 1 :(得分:0)

尝试创建具有命名范围的隐藏工作表&#34;假期&#34;在上面。把所有的假日日期都放在那里。 (如果公共的话,你可以将你的函数EasterDate和PublicHolidayDate用作常规函数)。在你的代码而不是加载假日数组put:

 Set Holidays = Names("Holidays").RefersToRange