Электронная рассылка выбранного диапазона в Excel/Outlook

У меня есть следующий код (любезно предоставленный Роном де Брейном), и я пытаюсь выяснить, как настроить его для своего собственного использования.

Когда я запускаю код, ничего не происходит (из-за обработчика ошибок, который останавливает макрос при ошибке "Subscript out of range"),

Однако, когда я меняю строку:

ActiveWorkbook.EnvelopeVisible = False

чтобы:

ActiveWorkbook.EnvelopeVisible = True

Видимый конверт позволяет мне сделать выбор и выбрать, кому я отправляю и т. Д.

Мне интересно, почему он сталкивается с ошибкой "вне диапазона", и если возможно, чтобы процесс проходил автоматически без необходимости вводить данные после того, как событие сработало [оно запускается из события Workbook_Open() - если это что-то меняет, и выбор делается на другом листе (Worksheet("ValLog")) в той же книге]

Код, который я запускаю:

Private Sub workbook_open()

Dim AWorksheet As Worksheet
Dim Sendrng, rng As Range
Dim answer As Integer

On Error GoTo StopMacro

answer = MsgBox("Do you want to send e-mail notifications of upcoming tours?", vbYesNo)

If answer = vbYes Then

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

Set Sendrng = Worksheets("ValLog").Range("B5:K12").Select

With Sendrng

    'Select the range you want to mail
    Range("B5:K12").Select

    ' Create the mail and send it
    ActiveWorkbook.EnvelopeVisible = True
    With .Parent.MailEnvelope

        .Introduction = "Test Test Test"

        With .Item
            .To = "myemail@blahblah.com"
            .CC = ""
            .BCC = ""
            .Subject = "Why, Error?"
            .Send
        End With

    End With

StopMacro:
With Application
    .ScreenUpdating = True
    .EnableEvents = True
End With
ActiveWorkbook.EnvelopeVisible = False

End With

Else
'Do Nothing
End If

End Sub

1 ответ

Решение

Прежде всего, вы не объявили SendRange как диапазон. Линия:

Dim SendRange, rng As Range

объявляет SendRange как вариант и rng как диапазон. измените это на:

Dim SendRange As Range, rng As Range

Во-вторых, измените строку:

Set Sendrng = Worksheets("ValLog").Range("B5:K12").Select

чтобы:

Set Sendrng = Worksheets("ValLog").Range("B5:K12")

Вы пытаетесь установить диапазон здесь, а не выбирать его.

Затем измените:

Range("B5:K12").Select

чтобы:

.Select

Что вы на самом деле делаете в своем коде, так это выбираете диапазон в активном листе (так как вы не определили лист до диапазона). Помещая это в утверждение "С", каждое утверждение с "." до того, как он унаследует этот термин от оператора with. Таким образом, с ".Select" вы фактически запускаете "Sendrng.Select"

Другие вопросы по тегам