我正在处理一个电子表格,其中第23列(w)跟踪作为日计数器的AA列。当日计数器超过14时,第23(w)栏将显示单词“过期”,而我的代码将发送一封电子邮件,表明已过期。我正在使用一个公式来使单元格读取过期,因此为什么要在代码中使用_Calculate。但是,当我尝试操纵日期跟踪器以读取过期的内容时,会出现以下错误,而且我也不知道为什么。
运行时错误91:对象变量或未设置块变量
Private Sub Worksheet_Calculate()
Dim target As Range
If target.Column = 23 And target.Value = "Overdue" Then
With CreateObject("Outlook.Application").createitem(0)
.To = "Harrywood@company.com"
.Subject = "Item OverDue"
.Body = "Dear User," & vbNewLine & vbNewLine & "An Item has been marked as Overdue. Please open up the workbook to assess."
.send
End With
End If
End Sub
答案 0 :(得分:2)
Worksheet_Calculate没有目标参数。您可能正在混搭一些相关的Worksheet_Change代码。
由于没有将Target传递到Worksheet_Calculate中,因此您决定对其进行调暗,但从不为其分配(设置)任何单元格或单元格范围。
目标什么都没有,什么也没有列或Value属性。
您可以尝试遍历W列中的值以查看是否存在过期,但这可能意味着将发送重复的电子邮件。也许在另一栏设置“ TRUE / FALSE”,以指示是否已发送电子邮件。
假设未使用Z列,则可以使用它来指示是否已发送过期电子邮件。只要关闭时保存更改,此方法就可以在关闭并重新打开工作簿后保留下来。
Option Explicit
Private Sub Worksheet_Calculate()
Dim rng As Range
For Each rng In Range(Cells(2, "W"), Cells(Rows.Count, "W").End(xlUp))
If LCase(rng.Text) = "overdue" And Not rng.Offset(0, 3) Then
With CreateObject("Outlook.Application").createitem(0)
.To = "Harrywood@company.com"
.Subject = "Item OverDue"
.Body = "Dear User," & vbNewLine & vbNewLine & "An Item has been marked as Overdue. Please open up the workbook to assess."
.send
End With
rng.Offset(0, 3) = True
End If
Next rng
End Sub
答案 1 :(得分:1)
与Selection_Change
不同,Calculate
事件与目标单元格无关(整个工作表是立即计算的)。因此,您的target
对象从不引用任何内容,因此会出现错误91(未设置对象变量)。
有一个Worksheet_Change
事件(请参阅https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.change)确实传递了一个target
,但是只有在公式更改值时,才会触发不用户直接进行更改。因此,这可能对您不起作用。
我认为您有两种选择:
Worksheet_Change
,查找用户更改的实际单元格(例如,AA列),然后重复过期的计算。Worksheet_Calculate
处理程序以遍历所有相关单元格,并检查值是否为“过期”。