Попытка запустить макрос каждые 30 минут - PullRequest
0 голосов
/ 07 декабря 2018

Я искал вверх и вниз и не могу найти ответ на свой вопрос.

Я пытаюсь запускать макрос каждые 30 минут.Книга может быть открытой, но не обязательной.У меня есть 3 другие книги Excel, которые ДОЛЖНЫ храниться открытыми целый день, так как они предназначены для хедж-фонда, и они предоставляют данные в реальном времени с помощью API Bloomberg.Макрос, который я пытаюсь запустить, отправляет письмо с обновлением PnL наших портфелей в течение дня.Запуск макроса сам по себе прекрасно работает.Макрос здесь:

Public Sub PnLUpdate()

Dim OutApp As Object
Dim OutMail As Object
Dim rng As Range, cell As Range, HtmlContent As String, i As Long, j As Long
Set rng = Range("A1:M300")
HtmlContent = "<table>"

For i = 1 To rng.Rows.Count + 1
    HtmlContent = HtmlContent & "<tr>"
    For j = 1 To rng.Columns.Count + 1
        HtmlContent = HtmlContent & "<td>" & Cells(i, j).Value & "</td>"
    Next
    HtmlContent = HtmlContent & "</tr>"
Next
HtmlContent = HtmlContent & "</table>"


Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
    .To = "xx"
    .CC = "xx"
    .Subject = "PnL Update // " & Format(Now, "mm-dd-yy // hh:mm AM/PM")
    .HTMLBody = HtmlContent
    .Send
End With
On Error GoTo 0
Set OutMail = Nothing

End Sub

Я попытался вставить

Application.OnTime Now + TimeValue("00:00:30"), "PnLUpdate"

в указанный макрос.Он работает и отправляет письмо каждые 30 минут.Проблема в том, что он отправляет любой активный лист, а не тот лист, который мне нужен для отправки.

Я попытался написать модуль, который выглядит следующим образом:

Sub callPnLUpdate()

With Sheet10
Call .PnLUpdate
Application.OnTime Now + TimeValue("00:00:30"), "PnLUpdate"
End With
End Sub

Это выдает мне сообщение об ошибке «Не удается запустить макрос« имя листа.Xlsx! PnLUpdate ». Макрос может быть недоступен вэта книга или все макросы могут быть отключены.

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

Чтобы быть ясным: решение этой проблемы не обязательно должно заключаться в использовании моего макроса. Я приму любое решение, которое может отправлять эту конкретную электронную таблицу каждые 30 минут (предпочтительно начиная с 9:31 и заканчивая в 16:05, ноэто менее важно, чем запускать эту автоматизацию каждые 30 минут).

Любая помощь очень ценится.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Ключ заключается в полной квалификации Workbook и Worksheet в любых вызовах Range или Cells, в противном случае подразумеваются ActiveWorkbook и ActiveSheet.

Например:

  • Set rng = Range("A1:M300") должно быть что-то вроде Set rng = ThisWorkbook.Sheets("PnL").Range("A1:M300").Или, если вы предпочитаете использовать кодовое имя листа, что-то вроде Set rng = Sheet10.Range("A1:M300").
  • И снова, HtmlContent = HtmlContent & "<td>" & Cells(i, j).Value & "</td>" должно быть HtmlContent = HtmlContent & "<td>" & rng.Cells(i, j).Value & "</td>".В противном случае Cells(i, j) относится к ячейкам на активном листе.
0 голосов
/ 08 декабря 2018

Я не знаю, будет ли это работать для ваших конкретных обстоятельств, но всякий раз, когда мне нужно запустить макрос через определенные промежутки времени, я устанавливаю макрос на подпрограмме Workbooks_Open, затем вызываю этот файл из пакетного файла и планирую, чтопакетный файл с приложением Task Scheduler на моем ПК.

Итак, создайте макрос, который вам нужно запустить, и поместите его в раздел Workbooks (не модуль) в следующем формате:

Sub Workbook_Open()
'your macro goes here
End sub

Затем создайте пакетный файл, который откроет ваш документ Excel.Откройте Блокнот и введите следующий код.Для первой части кода введите путь к файлу Excel.exe.Для второй части кода введите путь к файлу Excel.Если ваш файл Excel находится на сетевом диске, вам нужно будет немного по-другому его найти.

"C:\Program Files\Microsoft Office 15\root\office15\EXCEL.EXE" "C:\Users\curtis\Dropbox\National Accounts Customer Database\MakeNewLog.xlsm"

Затем сохраните документ «Блокнот» с расширением .bat.Я не могу вспомнить, но вам, возможно, придется изменить переключатель в проводнике, чтобы иметь возможность сделать это (переключатель, который показывает расширения файлов всех ваших значков).

После получения пакетафайл, дважды щелкните по нему, чтобы убедиться, что он работает.Если вы все сделали правильно, командный файл откроет окно CMD, которое вызовет ваш файл Excel.Откроется файл Excel, и ваш макрос автоматически сработает по команде Workbooks_Open.

Теперь просто запланируйте запуск командного файла в планировщике заданий.Перейдите на панель запуска, найдите «Планировщик заданий» и откройте его.Создайте базовое задание, назовите его, выберите «Ежедневно», установите время, выберите «Запустить программу», найдите и выберите свой пакетный файл и нажмите «Готово».

Здесь оно становится немного не элегантным.Вам нужно будет планировать свой пакетный файл снова и снова, чтобы запускать его каждые 30 минут.Возможно, есть лучший способ настроить планировщик заданий, но мне когда-либо нужно было запускать пакетный файл ежедневно, так что это насколько я знаю.

Если ничего другого, надеюсь, это укажет вас направильный путь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...