当记录在30秒内到期时,宏会发出警告

时间:2015-04-19 11:30:19

标签: excel vba

我发现这个问题有同样的问题。我注意到问题出现在格式化的表格中。

我取出了格式,现在它的工作除了当过期日期很远并且不需要做任何事情时它只弹出“测试文本”,只有名字和日期。

如果过期日期接近“40”范围,则会给出正确的消息,其中包含“测试文本”以及名称和日期。

Sub popup()

    Dim lstRow As Long
    Dim i As Long
    Dim msg As String
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("sheet1") ' rename as required

    With ws
        msg = "test text " & vbCrLf & vbCrLf
        lstRow = .Cells(.Rows.Count, "S").End(xlUp).Row
        For i = 2 To lstRow
            If .Range("S" & i) - (Date) <= 40 Then
                msg = msg & .Range("B" & i).value & " in " & .Range("S" & i).value - Date & " days" & vbCrLf
            End If
        Next i
    End With

    MsgBox msg
    'Call settimer
End Sub

1 个答案:

答案 0 :(得分:0)

在1899年12月31日之后的每一天,日期都被视为带有 1 的数字。如果您只计算天数,则不需要使用DateDiff;你可以简单地从日期中减去相关日期以获得天数。

您声明您的“过期日期”已经过期了。在C列中,但您在代码中使用了列S.我猜这与它有关。 VBA有一个IsDate可以很好地猜测一个值是否是一个日期。

如果使用Integer来管理行号,那么代码就很旧了。最好使这些长整数覆盖XLSX的1,048,576行(​​即使你现在还没有使用它们)。

Private Sub Workbook_Open()
    Dim LRow As Long
    Dim LName As String
    Dim LResponse As String
    Dim LDiff As Long
    Dim LDays As Long

    LRow = 2   'start at row 2
    LDays = 50 'Warning - Number of days to check for expiration

    With Sheets("Sheet1")
        'Check the first 37 rows in column C
        While LRow < 37

            'Only check for expired certificate if value in column S is not blank
            If IsDate(.Range("C" & LRow)) Then
                LDiff = .Range("C" & LRow).Value2 - Date
                If (LDiff > 0) And (LDiff <= LDays) Then
                    'Get  names
                    LName = .Range("B" & LRow).Value
                    LResponse = LResponse & LName & " will expire in " & LDiff & " days." & Chr(10)
                End If
            End If

            LRow = LRow + 1
        Wend
        If CBool(Len(LResponse)) Then _
            MsgBox "These insurance certificate(s) are nearing expiration:" & Chr(10) & LResponse, vbCritical, "Warning"
    End With
End Sub

我通过一些带有C日期日期的样本数据来运行它,它似乎在接近到期日期时正确地报告了B列中的名称。