Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 工作日假期争论不存在';不接受数组_Arrays_Vba_Excel - Fatal编程技术网

Arrays 工作日假期争论不存在';不接受数组

Arrays 工作日假期争论不存在';不接受数组,arrays,vba,excel,Arrays,Vba,Excel,我试图将vba声明的日期数组传递到excel函数WorkDay中的Holidays参数中。从目前的研究来看,传递一个范围是可能的,TechontheNet建议传递一组日期序列号是可能的。 下面的代码在workday函数被执行之前都是很好的,在这个点上,我们可以 注意:EasterDate和HolidayDate是返回值“date”格式的函数,我也尝试过在没有设置这些值的情况下运行,但没有什么区别 Function WorkDayFiveA(DateofSpend As Date) As Bool

我试图将vba声明的日期数组传递到excel函数WorkDay中的Holidays参数中。从目前的研究来看,传递一个范围是可能的,TechontheNet建议传递一组日期序列号是可能的。 下面的代码在workday函数被执行之前都是很好的,在这个点上,我们可以

注意: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
函数WorkDayFiveA(DateofSpend As Date)为布尔值
尺寸WD5作为日期,参考日期作为日期
黯淡假期(9)截止日期
将wf设置为工作表功能
'加载假日数组
假日(0)=日期序列(年(日期)-1、12、25)“最后一个圣诞节
假日(1)=日期序列(年(日期)-1、12、26)的最后节礼日
假日(2)=日期序列(年(日),1,1)'新闻年日
假日(3)=东部(年(日),1)“耶稣受难日”
假期(4)=东部(年(日),2)“复活节星期一”
假日(5)=公共假日日期(年(日),1)“五一”
假日(6)=公共假日日期(年(日),2)“春季假日
假日(7)=公共假日日期(年(日),3)“春季假日
假日(8)=日期序列(年(日期),12,25)“下一个圣诞节
假日(9)=日期序列(年(日期),12,26)'下一节
设置wf=Application.WorksheetFunction
WDFive=wf.WorkDay(日期序列(年(日期)、月(日期)、1)、4、假日)
如果日期

感谢您的帮助。

此问题似乎有时出现在Excel 2016中,并且总是出现在Excel 2013和早期版本中

一种可能的解决方案-Holdiay数组应由常量序列号组成,以便工作,例如,将其声明为
Long
,而不是
Date

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
Public Sub TestMe()

    Dim wf              As WorksheetFunction
    Dim holidays(3)     As Long 'As Date does not work
    Dim wdFive          As Date

    Set wf = Application.WorksheetFunction

    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

    wdFive = wf.WorkDay(DateSerial(Year(Date), Month(Date), 1), 4, holidays)
    Debug.Print wdFive

End Sub
:

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


对于我(Excel2013x32),此代码有效,但如果我将
假日(3)声明为日期,则此代码无效:

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
Public Sub TestMe()

    Dim wf              As WorksheetFunction
    Dim holidays(3)     As Long 'As Date does not work
    Dim wdFive          As Date

    Set wf = Application.WorksheetFunction

    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

    wdFive = wf.WorkDay(DateSerial(Year(Date), Month(Date), 1), 4, holidays)
    Debug.Print wdFive

End Sub

尝试创建命名范围为“假日”的隐藏工作表。把所有的假日日期都放在那里。(如果您的函数EasterDate和PublicHolidayDate是公共函数,则可以将它们作为常规函数使用)。在您的代码中,而不是加载假日数组:

 Set Holidays = Names("Holidays").RefersToRange

您能添加错误消息并告诉我们哪一行负责吗?“在爆炸发生的哪一点”清楚地描述了此处发生的情况……不是。删除
EasterDate
PublicHolidayDate
条目并在此处运行,可以使函数运行到完成。问题不在于你怎么想。请阅读并编辑您的问题,以提供相关数据。填充数组后,运行
Holiday
Dim i,只要:For i=LBound(Holidays)to UBound(Holidays):调试。打印“Holidays(i)=”和Holidays(i):Next i
以检查即时窗口中的输出。确保所有日期都是有效日期。没有错误消息。我在“set wf=…”处添加了一个切换断点行,然后逐行执行,代码执行到workday函数行,然后在调用它的电子表格单元格中返回#值。在这里,假日声明为日期时,似乎可以正常工作。我可以确认数组项的类型
Date
也适用于我。此外,您只引用了一半的文档,下面的更多文档还说“重要:应该使用DATE函数输入日期”。所以一系列的约会应该很好。盖伊的,谢谢你的帮助。我是这个论坛的新手,在VBA中自学成才,因此,对于帖子中的不清晰以及可能的非常规代码,我深表歉意。将声明更改为长期工作!虽然是奇数,因为我以前尝试将其作为整数,但没有成功。再次表示感谢。@Vityata使用Windows Excel 2016 x64,无论是使用
Long
还是
Date
,效果都是一样的。如果它对您不起作用,这真的很奇怪。@Vityata我有Office365(32位)订阅(VBA 7.1;Excel版本1712)和您的代码,复制/粘贴并仅将
假日
数据类型更改为
日期
,在这里工作正常。必须是2013年和2016年之间的差异。有趣的区别。