У меня есть ячейка B8, которая проверяет, введены ли данные в диапазон ячеек за день, и выводит число в зависимости от количества. Он проверяет наличие пустых записей, и, очевидно, в начале заполнения листа все ячейки за день будут пустыми, я хочу, чтобы он выполнял проверку только после сохранения рабочего листа.

Код, который я создал для Франкенштейна, готовит электронное письмо в тот момент, когда условие выполняется, и я не уверен, как изменить его в соответствии с моими потребностями.

Sub Mail_with_outlook()
Dim OutApp As Object
Dim OutMail As Object
Dim emlto As String, emlcc As String, emlbcc As String
Dim emlsub As String, emlbody As String

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

emlto = "email@abc.def"
emlcc = ""
emlbcc = ""
emlsub = "Raw Material Projection"
emlbody = "Good Day" & vbNewLine & vbNewLine & _
          "There might be an issue with the data inputed in today's sheet"


With OutMail
    .To = emlto
    .CC = emlcc
    .BCC = emlbcc
    .Subject = emlsub
    .Body = emlbody
    .Display    '  use .Send once tested
End With

Set OutMail = Nothing
Set OutApp = Nothing
End Sub





Private Sub Worksheet_Calculate()
Dim FormulaRange As Range
Dim NotSentMsg As String
Dim MyMsg As String
Dim SentMsg As String
Dim MyLimit As Double

NotSentMsg = "Not Sent"
SentMsg = "Sent"

'Above the MyLimit value it will run the macro
MyLimit = 10

'range with the Formula that I want to check
Set FormulaRange = Me.Range("B8")

On Error GoTo EndMacro:
For Each FormulaCell In FormulaRange.Cells
    With FormulaCell
        If IsNumeric(.Value) = False Then
            MyMsg = "Not numeric"
        Else
            If .Value > MyLimit Then
                MyMsg = SentMsg
                If .Offset(0, 1).Value = NotSentMsg Then
                    Call Mail_with_outlook
                End If
            Else
                MyMsg = NotSentMsg
            End If
        End If
        Application.EnableEvents = False
        .Offset(0, 1).Value = MyMsg
        Application.EnableEvents = True
    End With
Next FormulaCell

ExitMacro:
Exit Sub

EndMacro:
Application.EnableEvents = True

MsgBox "Some Error occurred." _
     & vbLf & Err.Number _
     & vbLf & Err.Description

End Sub
3
LafaMan 31 Окт 2018 в 16:42

1 ответ

Лучший ответ

Я бы поместил вашу логику в событие BeforeSave .

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
   'your logic goes here
End Sub

Если вы только проверяете, есть ли что-то в диапазоне, тогда как раньше он был полностью пустым, рассмотрите возможность использования функций COUNTA/COUNT.

Примечания:

Происходит перед сохранением книги.

Выражение синтаксиса. Перед сохранением ( SaveAsUI , Отмена )

Expression (выражение) Переменная, представляющая объект Workbook.

Параметры

SaveAsUI: обязательный, логический, Описание: True, если диалоговое окно «Сохранить как» будет отображаться из-за внесенных изменений, которые необходимо сохранить в книге.

Отмена: обязательно, логическое значение, Описание: ложно при возникновении события. Если процедура обработки события устанавливает для этого аргумента значение True, книга не сохраняется после завершения процедуры.

5
Community 20 Июн 2020 в 09:12