Ошибка выполнения VBA 91 при выполнении кода - PullRequest
1 голос
/ 02 мая 2019

Я работаю над электронной таблицей, где столбец 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 ]

2 голосов
/ 02 мая 2019

Worksheet_Calculate не имеет целевого аргумента.Возможно, вы запутываете некоторый связанный код Worksheet_Change.

Поскольку Target не передается в Worksheet_Calculate, вы решили уменьшить его, но никогда не назначать (устанавливать) какие-либо ячейки или диапазоны ячеек.

Target is Nothing и Nothing не имеет ни столбца, ни свойства Value.

Вы можете попробовать просмотреть значения в столбце W, чтобы проверить, не является ли значение просроченным , но это может означатьчто дубликаты писем будут разосланы.Возможно, установите другой столбец, в котором значение ИСТИНА / ЛОЖЬ указывает, было ли уже отправлено письмо.

Предполагая, что столбец 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 голос
/ 02 мая 2019

В отличие от 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, чтобы пройти через все соответствующие ячейки ипроверьте для любого со значением "Просрочено".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...