执行代码时,VBA运行时错误91

时间:2019-05-02 07:40:13

标签: excel vba outlook outlook-vba

我正在处理一个电子表格,其中第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

2 个答案:

答案 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处理程序以遍历所有相关单元格,并检查值是否为“过期”。
  • li>