Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/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
VBA中单元格范围的Networkdays函数_Vba_Excel_Date - Fatal编程技术网

VBA中单元格范围的Networkdays函数

VBA中单元格范围的Networkdays函数,vba,excel,date,Vba,Excel,Date,我正在构建一个宏,将AO列中的日期(日期格式为dd/mm/yyyy hh:mm)与AL列中的日期(日期格式为dd/mm/yyyy hh:mm)进行比较,并将它们在工作日中的差异打印到列中(仅显示天数,而不是分钟等)我已经搜索并发现NETWORKDAYS是excel中的一个函数,可以实现这一点,但我不知道如何在VBA中实现它。到目前为止,我的代码与我在网上找到的代码非常相似,但它是针对特定日期的,而不是针对某个范围。有什么想法吗?非常感谢 到目前为止,我得到的是这个,但它说在d1=cell.Off

我正在构建一个宏,将AO列中的日期(日期格式为dd/mm/yyyy hh:mm)与AL列中的日期(日期格式为dd/mm/yyyy hh:mm)进行比较,并将它们在工作日中的差异打印到列中(仅显示天数,而不是分钟等)我已经搜索并发现NETWORKDAYS是excel中的一个函数,可以实现这一点,但我不知道如何在VBA中实现它。到目前为止,我的代码与我在网上找到的代码非常相似,但它是针对特定日期的,而不是针对某个范围。有什么想法吗?非常感谢

到目前为止,我得到的是这个,但它说在d1=cell.Offset中有一个错误。。。我现在不知道为什么

Dim d1 As Range, d2 As Range, wf As WorksheetFunction
'Dim N As Long
Set wf = Application.WorksheetFunction
For Each cell In Range(Range("AT2"), Range("AT2").End(xlDown))
Set d1 = cell.Offset(0, -4)
Set d2 = cell.Offset(0, -7)
cell.Value = wf.NetworkDays(d1.Value2, d2.Value2)
Next cell

这不需要VBA。它也可能是VBA函数,我不确定

试试这个

    Dim d1 As Date, d2 As Date

    For Each Cell In Range(Range("AT2"), Range("AT2").End(xlDown))
        d1 = Cell.Offset(0, -4)
        d2 = Cell.Offset(0, -7)
        Cell.Value = Application.WorksheetFunction.NetworkDays(d1, d2)
    Next Cell

如果要使用列AL和AO,并将结果放入AS-中,范围由AT-中的内容确定,请使用以下内容:

Dim d1 As Range, d2 As Range, wf As WorksheetFunction
'Dim N As Long
Set wf = Application.WorksheetFunction
For Each cell In Range(Range("AT2"), Range("AT2").End(xlDown))
Set d1 = cell.Offset(0, -5)
Set d2 = cell.Offset(0, -8)
cell.Offset(0, -1).Value = wf.NetworkDays(d1.Value2, d2.Value2)
Next cell

我建议使用“混合”方法,因为您无论如何都要使用工作表函数:让VBA填充函数,用值替换输出:

    Sub WorkDaysDiff()
    ' w-b 2017-08-26

    Dim rng As Range, lastrow As Long

    ' assuming columns A, B hold dates, results into column C
    lastrow = ActiveSheet.Range("A1").End(xlDown).Row
    With ActiveSheet
        Set rng = .Range(.Range("C1"), .Range("C" & lastrow))
    End With

    With rng
        ' write formula into worksheet cells for whole range at once
        ' and replace it with their value after recalculation
        .FormulaR1C1 = "=NETWORKDAYS(RC[-1],RC[-2])"
        .Copy
        .PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    End With
End Sub

这样可以避免循环,如果范围足够大,则可能会节省时间。

我知道如何在excel中手动执行循环,但它是宏的一部分,因此必须在vba中!不是每个单元格的都被视为循环吗?抱歉,没有看到编辑。您需要设置范围:
Set d1=cell.Offset(0,-4)
现在它说问题出在行单元格中。Value=wf.NetworkDays(d1,d2)出现了什么错误?它说行d1=cell.Offset(0,-4)的类型不匹配这意味着您的数据不是日期类型,而是字符串。因此,您无法对数据执行日期操作。