Networkdays VBA

时间:2017-08-25 21:08:36

标签: excel vba excel-vba date

我正在构建一个宏,它将比较AO列中的日期(日期格式为dd / mm / yyyy hh:mm)和AL列中的日期(日期格式为dd / mm / yyyy hh:mm),它将打印他们在工作日中与列AS的差异(只是天数,而不是分钟等)我搜索过并发现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

4 个答案:

答案 0 :(得分:1)

我建议使用' hybrid'因为你要使用工作表函数的方法:让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

通过这种方式,您可以避免循环,如果范围足够大,可以节省时间。

答案 1 :(得分:0)

您不需要VBA。它也可能是VBA功能,我不确定。 enter image description here

答案 2 :(得分:0)

试试这个

undefined

答案 3 :(得分:0)

如果要使用列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