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