【问题标题】:Compare Date to List & Return Next Date In List将日期与列表进行比较并返回列表中的下一个日期
【发布时间】:2015-03-14 16:01:31
【问题描述】:

我又带着一个我不太确定该怎么做的人回来了。如前所述,我是一名初学者 VBA 程序员,所以很多事情对我来说并不明显。

无论如何我想做的是:

  • 让用户从下拉单元格中选择一个支付组号码(完成)

  • 让用户以 DD/MM/YYYY 格式插入终止日期。如果未选择支付组,则 MsgBox 出错(完成)

  • 如果一切正确,则将终止日期与另一个工作表数据表中与该工资组对应的日期进行比较。返回作为 MsgBox 输入的终止日期之后的下一个截止日期。

到目前为止,我有以下代码:

更大的工作表事件选择事件的一部分

ElseIf Not Intersect(Target, Range("LastDayWorkedRange")) Is Nothing Then
       Call Cutoff2015
End If

调用这个子:

Sub Cutoff2015()

'If Paygroup has not been selected when entering termination date then error message and enable events
If Range("PayGroupRange") = "Please Select" Then
        MsgBox "Error: Please select Paygroup"
        Application.EnableEvents = True

    'If paygroup is selected then
    Else: Select Case Range("PayGroupRange")
        Case 118
        MsgBox "118"

        Case 113
        MsgBox "113"

    End Select

End If

End Sub

截止日期位于名为“截止矩阵”的单独工作表上,第一行采用支付组编号进行格式化,从第二行开始按时间顺序排列日期。放入案例中的 MsgBox 以确保其正常工作。到目前为止,它确实如此。

【问题讨论】:

    标签: excel vba date comparison


    【解决方案1】:

    假设您有一个命名范围TerminationDate 并且工作表“截止矩阵”中的日期按升序排列,以下函数将为您提供下一个日期与 Range("TerminationDate") 中的日期相比的 msgbox。

    Private Function Next_Date()
    Dim rng As Range
    Dim rngFoundPayGroup As Range
    Dim cell As Range
    
    'setting the range in Cutoff Matrix from A1 to the last not empty cell to right
    Set rng = ThisWorkbook.Sheets("Cuttoff Matrix").Range("A1")
    Set rng = Range(rng, rng.End(xlToRight))
    
    'finding identified PayGroup in the previously set range
    Set rngFoundPayGroup = rng.Find(Range("PayGroupRange"), , xlValues, xlWhole)
    'Looking downwards for the date bigger than termination date
    For Each cell In Range(rngFoundPayGroup, rngFoundPayGroup.End(xlDown))
        If cell.Value > Range("TerminationDate").Value Then
            MsgBox cell.Value
            Exit For
        End If
        'If no date which is bigger, this msgbox appears
        If cell.Address = rngFoundPayGroup.End(xlDown).Address Then MsgBox "Next date not found"
    Next
    
    Set rngFoundPayGroup = Nothing
    Set rng = Nothing
    End Function
    

    在同一模块中插入此函数,并将之前的行 MsgBox "118"MsgBox "118" 更改为 Call Next_Date。或者更好,插入功能代码后,把你的这部分删掉即可:

    Select Case Range("PayGroupRange")
        Case 118
        MsgBox "118"
        Case 113
        MsgBox "113"
    End Select
    

    改用这个:Call Next_Date

    【讨论】:

    • 感谢您的帮助。这个选项似乎比根据具体情况按我的方式做更容易。我已经稍微调整了它以使用我的范围名称等,但我认为我现在需要处理日期的格式。我在这一行收到不匹配错误: If cell.Value > Range("LastDayWorkedRange").Value Then Is it to do with the dates are in DD/MM/YYYY format?
    • 我想是的。在工作簿中的任何单元格上使用 Ctrl + ;(键盘 Control 加上 分号)。您将获得适合您的操作系统版本的日期格式。因此,您需要更改将日期写入此 Excel 的方式。还是您真的需要您定义的确切格式?
    • 没关系,我想通了。我必须将 .Cells (1, 1) 放在 .Value 之前,因为该范围涵盖多个水平单元格。我认为它会进行更多调整,因为我不小心删除了一些行。
    • 好吧。乐意效劳。您能否将此答案标记为最适合您的情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2017-09-05
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多