Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Excel NETWORKDAYS.INTL()函数在VBA中不起作用_Excel_Excel 2011_Vba - Fatal编程技术网

Excel NETWORKDAYS.INTL()函数在VBA中不起作用

Excel NETWORKDAYS.INTL()函数在VBA中不起作用,excel,excel-2011,vba,Excel,Excel 2011,Vba,我的宏中有这一行(Mac上的Excel 2011 VBA): 当我运行宏时,它突出显示NetworkDays,并给出: 编译错误:参数不是可选的 该公式在直接输入单元格时有效,因此它可能确实存在。似乎它没有将.INTL识别为NetworkDays功能的一部分 有什么办法吗 以下是完整的代码供参考: Sub BHSecondsBetween() Dim includeWeekends As Integer: includeWeekends = 0 Dim weekendType As I

我的宏中有这一行(Mac上的Excel 2011 VBA):

当我运行宏时,它突出显示
NetworkDays
,并给出:

编译错误:参数不是可选的

该公式在直接输入单元格时有效,因此它可能确实存在。似乎它没有将
.INTL
识别为
NetworkDays
功能的一部分

有什么办法吗

以下是完整的代码供参考:

Sub BHSecondsBetween()

  Dim includeWeekends As Integer: includeWeekends = 0
  Dim weekendType As Integer: weekendType = 7
  Dim openHour As Integer: openHour = 5
  Dim closeHour As Integer: closeHour = 24

'weekendType options: (days of week to include as weekend days)
'1   Saturday and Sunday
'2   Sunday and Monday
'3   Monday and Tuesday
'4   Tuesday and Wednesday
'5   Wednesday and Thursday
'6   Thursday and Friday
'7   Friday and Saturday
'11  Sunday
'12  Monday
'13  Tuesday
'14  Wednesday
'15  Thursday
'16  Friday
'17  Saturday

' Remove rows without responses

    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select

    Selection.Replace What:="", Replacement:="ThisIsADummyStringForMacro", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
    Selection.Replace What:="ThisIsADummyStringForMacro", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False

    Columns("Q").SpecialCells(xlBlanks).EntireRow.Delete

    Columns("M:M").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove


  Dim NumRows As Integer
  NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count
  'Debug.Print "The value of variable NumRows is: " & NumRows

  Dim pDate As Date
  Dim aDate As Date
  Dim nWeekDaysBetween As Integer
  Dim answer As Integer
  Dim pDiff As Long
  Dim aDiff As Long
  Dim pEndOfDay As Date
  Dim aStartOfDay As Date

  Dim endCell As String

  For i = 2 To NumRows
    On Error Resume Next
    'Debug.Print "The value of variable i is: " & i

    pDate = Worksheets("Sheet1").Cells(i, "F").Value
    'Debug.Print "The value of variable pDate is: " & pDate

    aDate = Worksheets("Sheet1").Cells(i, "T").Value
    'Debug.Print "The value of variable aDate is: " & aDate

    If includeWeekends = 1 Then
      nWeekDaysBetween = DateDiff("d", pDate, aDate)
    Else:
      nWeekDaysBetween = (Application.WorksheetFunction.NetworkDays_INTL(pDate, aDate, 7) - 1)
    End If
    'Debug.Print "The value of variable nWeekDaysBetween is: " & nWeekDaysBetween

    If nWeekDaysBetween < 0 Then
      answer = 0
    ElseIf nWeekDaysBetween = 0 Then
      answer = DateDiff("s", pDate, aDate)
    Else:

      If (Hour(pDate) >= closeHour) Then
        pDiff = 0
      ElseIf (closeHour = 24) Or (closeHour = 0) Then
        pEndOfDay = DateSerial(Year(pDate), Month(pDate), Day(pDate)) + TimeSerial(23, 59, 59)
        pDiff = DateDiff("s", pDate, pEndOfDay)
      Else:
        pEndOfDay = DateSerial(Year(pDate), Month(pDate), Day(pDate)) + TimeSerial(closeHour, 0, 0)
        pDiff = DateDiff("s", pDate, pEndOfDay)
      End If

      aStartOfDay = DateSerial(Year(aDate), Month(aDate), Day(aDate)) + TimeSerial(openHour, 0, 0)

      If (Hour(aDate) < openHour) Then
        aDiff = 0
      Else:
        aDiff = DateDiff("s", aStartOfDay, aDate)
      End If

      answer = pDiff + (60 * (closeHour - openHour)) * (nWeekDaysBetween - 1) + aDiff

    End If
    'Debug.Print "The value of variable answer is: " & answer

    endCell = "M" & i
    'Dim endContent As String: endContent = hours & ":" & minutes
    Range(endCell).Value = answer

  Next i

End Sub
Sub-bhsseconds中间()
将includeWeekends设置为整数:includeWeekends=0
Dim weekendType为整数:weekendType=7
将openHour设置为整数:openHour=5
Dim closeHour为整数:closeHour=24
'weekendType选项:(包括为周末的一周天数)
“1周六和周日
'2周日和周一
"3星期一和星期二
'4周二和周三
“5星期三和星期四
'6周四和周五
‘7星期五和星期六
11日星期日
'12星期一
13日星期二
14日星期三
15日星期四
16日星期五
17日星期六
'删除没有响应的行
范围(“A1”)。选择
范围(选择,选择。结束(xlToRight))。选择
范围(选择,选择。结束(xlDown))。选择
选择。替换内容:=“”,替换:=“ThisisAdminMyStringFormacro”,查看:=xlPart,搜索顺序:=xlByRows,匹配案例:=False
选择。替换内容:=“ThisIsADummyStringForMacro”,替换:=”,LookAt:=xlPart,SearchOrder:=xlByRows,MatchCase:=False
列(“Q”)。特殊单元格(xlBlanks)。EntireRow.Delete
列(“M:M”)。选择
选择。插入Shift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAbove
作为整数的Dim NumRows
NumRows=Range(“A1”,Range(“A1”).End(xlDown)).Rows.Count
“Debug.Print”变量NumRows的值为:“&NumRows”
Dim pDate As Date
日期
Dim nWeekdays介于整数之间
将答案设置为整数
Dim pDiff尽可能长
暗淡的aDiff一样长
日期
Dim aStartOfDay作为日期
作为字符串的Dim endCell
对于i=2到NumRows
出错时继续下一步
'Debug.Print“变量i的值为:”&i
pDate=工作表(“表1”).单元格(i,“F”).值
“Debug.Print”变量pDate的值为:“&pDate”
aDate=工作表(“表1”).单元格(i,“T”).值
“Debug.Print”变量aDate的值为:“&aDate”
如果includeWeekends=1,则
nWeekDaysBetween=DateDiff(“d”,pDate,aDate)
其他:
nWeekDaysBetween=(Application.WorksheetFunction.NetworkDays_INTL(pDate,aDate,7)-1)
如果结束
“Debug.Print”变量nWeekDaysBetween的值为:“&nWeekDaysBetween
如果nWeekdays之间小于0,则
答案=0
ElseIf nWeekDaysBetween=0,则
答案=DateDiff(“s”,pDate,aDate)
其他:
如果(小时(pDate)>=closeHour),则
pDiff=0
ElseIf(closeHour=24)或(closeHour=0)则
pEndOfDay=日期序列(年(pDate)、月(pDate)、日(pDate))+时间序列(23、59、59)
pDiff=DateDiff(“s”,pDate,pEndOfDay)
其他:
pEndOfDay=日期序列(年(pDate)、月(pDate)、日(pDate))+时间序列(closeHour,0,0)
pDiff=DateDiff(“s”,pDate,pEndOfDay)
如果结束
aStartOfDay=DateSerial(年、月、日))+时间序列(开放小时,0,0)
如果(小时数)<开放小时数),则
aDiff=0
其他:
aDiff=DateDiff(“s”,aStartOfDay,aDate)
如果结束
答案=pDiff+(60*(关闭时间-开放时间))*(nWeekDaysBetween-1)+aDiff
如果结束
“Debug.Print”变量answer的值为:“&answer”
endCell=“M”和i
'将endContent设置为字符串:endContent=hours&':“&minutes
范围(端单元格)。值=答案
接下来我
端接头

您需要在VBA中使用
\uuu
而不是
来编写函数

nWeekDaysBetween = (Application.WorksheetFunction.NetworkDays_Intl(pDate, aDate, 7) - 1)

使用内置intellisense始终有助于准确了解如何编写属性、方法等。

请添加以下函数以访问Excel VBA中的
Networkdays\u intl()
函数: 这是我在MSDN网站上找到的VB代码

声明

 Function NetworkDays_Intl ( _
        Arg1 As Object, _
        Arg2 As Object, _
        Arg3 As Object, _
        Arg4 As Object _
    ) As Double
用法

Dim instance As WorksheetFunction
Dim Arg1 As Object
Dim Arg2 As Object
Dim Arg3 As Object
Dim Arg4 As Object
Dim returnValue As Double

returnValue = instance.NetworkDays_Intl(Arg1, _
    Arg2, Arg3, Arg4)
End Function

这需要时间,所以无论你不使用哪一个,请留下一个
?@findwindow-最后两个参数是可选的,因此不需要任何额外的逗号(除非你想设置第四个参数而不设置第三个参数)。是的,你表达得更好。我实际上已经尝试过了-然后它突出显示了NetworkDays\u INTL并说“找不到方法或数据成员”。真的吗?我刚刚在我的Excel 2011 for Mac中对其进行了测试,它工作得很好。这真的很奇怪。我刚刚将我的完整代码添加到原始文章的上下文中-变量集是否不正确?有什么想法吗?大体上看,一切看起来都不错。你调试了代码(逐行调试)吗并确定所有值都如您所期望的那样)?
Dim instance As WorksheetFunction
Dim Arg1 As Object
Dim Arg2 As Object
Dim Arg3 As Object
Dim Arg4 As Object
Dim returnValue As Double

returnValue = instance.NetworkDays_Intl(Arg1, _
    Arg2, Arg3, Arg4)
End Function