带有日期的循环的 Excel VBA 脚本

Posted

技术标签:

【中文标题】带有日期的循环的 Excel VBA 脚本【英文标题】:Excel VBA script for loop with dates 【发布时间】:2013-02-07 15:09:57 【问题描述】:

我正在计算两个给定日期之间的工作时间(上午 8 点到晚上 8 点),不包括周末和公共假期,但我的代码语法不正确。

样本数据:

开始日期:17/06/2011 08:00:00 AM

结束日期:19/06/2011 08:00:00 PM

Sub SLA_Days_Resolved_F()
    Dim x As Integer
    ' Set numrows = number of rows of data.
    NumRows = Range("F2", Range("F2").End(xlDown)).Rows.Count

    Dim total As Integer 'to count the total hours
    Dim st As String 'start date cell
    Dim en As String 'end date cell
    Dim destCell As String
    Dim d As Date ' for the loop

    total = 0

    ' Establish "For" loop to loop "numrows" number of times.
    For x = 2 To NumRows + 1
        st = "G" & CStr(x) 'reference to the cells
        en = "D" & CStr(x)
        'loop from start date to end date
        For d = Date(Range(st)) To Date(Range(en))
            'check if the current date is found is a Public holiday in the range or if a weekend
            If ((Vlookup(d,lookups!$o$3:$p$26,2,false))=1) or (weekend(d))Then
                'minus 8 to remove hours before 8am.
                total = (total + Hour(d) + minutes(d) / 60) - 8
            End If
        Next
    Next
End Sub

【问题讨论】:

@David Zemmens:我缺少参考 st 和 en 变量的这行代码。 st = "G" & CStr(x) 和 en = "D" & CStr(x)。我已经在主帖上编辑了这个。 为什么不将sten 标注为范围变量,并使用.offset(x,0)For x... 循环中重新定义它们。它将为您节省大量额外的编码。 【参考方案1】:

您没有为变量sten 分配任何值。

Date 不是 VBA 中可用的函数。您可能需要使用 DateSerial 函数。这是一个循环日期的简单示例,您应该可以修改它。

Sub LoopDates()
Dim d As Date
'Loop the days beteween today and March 1, 2013.
For d = DateSerial(Year(Now), Month(Now), Day(Now)) To DateSerial(2013, 3, 1)

    Debug.Print d  'Prints the "d" value in the immediate window.
Next

End Sub

此外,您不能只将工作表公式放入 VBA。这一行对于 Vlookup 来说绝对是错误的语法,Weekend 不是我知道的公式(测试它似乎确认它不是工作表或 VBA 中的有效调用。

If ((Vlookup(d,lookups!$o$3:$p$26,2,false))=1) or (weekend(d))Then

改写为:

If Application.WorksheetFunction.Vlookup(d,Sheets("lookups").Range("$o$3:$p$26"),2,false)=1 _
    or Not Application.WorksheetFunction.Weekday(d) Then

另一个示例的日期循环,我以我认为更有效的方式对变量进行了标注:

Sub Test()

Dim st As Range
Dim x As Integer
Dim stDate As Date
Dim enDate As Date
Dim d As Date
Dim numRows as Long

NumRows = Range("F2", Range("F2").End(xlDown)).Rows.Count

For x = 0 To NumRows-2
'SET YOUR VARIABLES HERE
' This may seem redundant or unnecessary for this case, but it makes structuring nested
' loops easier to work with, and then there are fewer places to make changes, 
' if you need to make changes.

    Set st = Range("G2").Offset(x, 0)
    Set en = Range("D2").Offset(x, 0)
    stDate = DateSerial(Year(st), Month(st), Day(st))
    enDate = DateSerial(Year(en), Month(en), Day(en))

    'Then, loop through the dates as necessary
    For d = stDate To enDate
        Debug.Print d
        'Do your code here.
    Next

Next


End Sub

【讨论】:

我按照建议修改了for循环。For d = DateSerial(Year(Range(f)), Month(Range(f)), Day(Range(f))) To DateSerial(Year(范围(g)),月(范围(g)),日(范围(g)))。在此行引发错误。 我以不同的方式处理我的问题。我正在放弃这个。感谢您的建议。

以上是关于带有日期的循环的 Excel VBA 脚本的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel宏保存为带有日期的单元格的一部分

如何使用 VBA 在 Excel 注释中查找和替换日期格式

Excel VBA:错误 Goto 语句在 For-Loop 中不起作用

excel用vba宏处理一些日期时间

excle vba,如何查找一个已知值的行号和列号?

在excel的VBA里如何获取日期和星期几