我发现这个问题有同样的问题。我注意到问题出现在格式化的表格中。
我取出了格式,现在它的工作除了当过期日期很远并且不需要做任何事情时它只弹出“测试文本”,只有名字和日期。
如果过期日期接近“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
答案 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列中的名称。