VBS для выполнения макроса – ошибка VBS, оставляет Excel открытым, зависает ПК

Вопрос или проблема

Задача: У клиента есть Azure SQL сервер, необходимо экспортировать таблицу, выбрать 4 столбца, изменить 0 на 1, сохранить в определенном месте в формате CSV, чтобы загрузить на сторонний сайт. Часть загрузки является отдельной задачей, но работает безупречно.

Создал макрос, необходимый для выполнения работы, и при ручном запуске он делает всё необходимое. Настроил его на закрытие Excel по завершении. Приступим к автоматизации.

Используя очень распространенный VBS-скрипт, найденный здесь, изменил переменные, сохранил его как VBS-файл, и когда он запускается, я получаю ошибку, указанную ниже, а также сохранение оригинального файла в местоположении макроса CSV.

Ошибка скрипта
Строка 19: ‘Выполнить код макроса
Строка 20: ExcelApp.Run MacroPath

Решил попробовать планировщик задач, как показывали примеры. Похоже, что это должно сработать, но если ПК перезапускается, он выполняется один раз, оставляет Excel открытым и в конечном итоге выдает ошибку.

Поэтому я хотел бы получить предложения по исправлениям/улучшениям, и, надеюсь, я пойму и смогу последовать их примеру.

В заключение:
Ручной запуск макроса в Excel работает идеально каждый раз, даже закрывая Excel по завершению.

Ручной запуск файла ExcelRun.bat выдает ошибку, ссылаясь на ExcelApp.Run MacroPath, оставляет Excel работающим, предотвращает следующую попытку, поскольку файл установлен как только для чтения.

Запуск файла TimeClockScript.vbs приводит к такому же результату, как и выше.

У меня есть 3 способа запуска, чем более вручную, тем успешнее.

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

ExcelRun.bat

wscript.exe "C:\245942-1\Excel Run File\TimeClockScript.vbs"


TimeClockScript.vbs

'Полный путь к файлу Excel
  ExcelFilePath = "C:\245942-1\Excel Run File\smWorkOrders.xlsm"

'Имя модуля/макроса в файле Excel
  MacroPath = "Module1.CopyColumnsToNewSheet"

'Создать экземпляр Excel
  Set ExcelApp = CreateObject("Excel.Application")

'Хотите сделать этот экземпляр Excel видимым?
  ExcelApp.Visible = True  'или "False"

'Запретить любые предупреждения о запуске приложений (например, Обновить внешние ссылки)
  ExcelApp.DisplayAlerts = False

'Открыть файл Excel
  Set wb = ExcelApp.Workbooks.Open(ExcelFilePath)

'Выполнить код макроса
  ExcelApp.Run MacroPath

'Сохранить файл Excel (если применимо)
  wb.Save

'Сбросить предупреждения перед закрытием
  ExcelApp.DisplayAlerts = True

'Закрыть файл Excel
  wb.Close

'Закончить экземпляр Excel
  ExcelApp.Quit

Excel Макрос – CopyColumnsToNewSheet

Sub CopyColumnsToNewSheet()
'
' Макрос CopyColumnsToNewSheet
'
'
' Обновление таблицы
    Range("A2").Select
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
    Columns("QI:QI").Select
    Range("QI:QI,C:C,F:F").Select
    Range("SMWorkOrder[[#Headers],[ServiceSite]]").Activate
    ActiveWindow.LargeScroll ToRight:=1
    Range("QI:QI,C:C,F:F,S:S").Select
    Range("SMWorkOrder[[#Headers],[WOStatus]]").Activate
    Selection.Copy
    ActiveWindow.ScrollColumn = 1
    Workbooks.Add
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ChDir "C:\245942-1\files\CostCodes"
     Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:= _
        "C:\245942-1\files\CostCodes\CostCodes.csv", FileFormat:=xlCSVUTF8, _
        CreateBackup:=False
        Application.DisplayAlerts = True
    Columns("C:C").Select
    Selection.Copy
    Selection.Insert Shift:=xlToRight
    Range("C1").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "Column3"
    Columns("C:C").Select
    Selection.Replace What:="1", Replacement:="A", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Selection.Replace What:="0", Replacement:="1", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Selection.Replace What:="A", Replacement:="0", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Columns("C:C").Select
    Selection.Delete Shift:=xlToLeft
    Columns("F:F").Select
    Selection.Delete Shift:=xlToLeft
    ActiveWorkbook.Save
    ActiveWindow.Close
    ActiveWorkbook.Save
    ThisWorkbook.Saved = True
 End Sub

Код ошибки 800A9C68 обычно указывает на “Неизвестную ошибку времени выполнения”, которая может возникнуть из-за проблемы с синтаксисом VBS-скрипта или проблемы с указанным путем к макросу.

  1. Убедитесь, что имя макроса “Module1.CopyColumnsToNewSheet” правильное. Оно должно точно совпадать с именем макроса в Excel. Попробуйте запустить макрос непосредственно в Excel, чтобы подтвердить, что CopyColumnsToNewSheet выполняется без ошибок.

  2. Полностью укажите путь к макросу: ExcelApp.Run "'" & wb.Name & "'!Module1.CopyColumnsToNewSheet"

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

  4. Добавьте обработку ошибок в VBS-скрипт, чтобы поймать и вывести ошибки:

    On Error Resume Next
    ExcelApp.Run MacroPath
    If Err.Number <> 0 Then
        MsgBox "Ошибка при запуске макроса: " & Err.Description
        Err.Clear
    End If
    On Error GoTo 0

Ответ или решение

Вопрос о запуске макроса Excel через VBS и возникающих в процессе проблемах требует комплексного анализа и рассмотрения ряда пунктов. Ниже приведены рекомендации и возможные пути решения возникших трудностей.

1. Проверка правильности пути к макросу

Первым шагом заново проверьте, что имя макроса указано верно. В вашем случае используется путь Module1.CopyColumnsToNewSheet. Убедитесь, что он соответствует фактическому наименованию модуля и макроса в Excel. Рекомендуется протестировать выполнение макроса напрямую из Excel без использования VBS, чтобы убедиться, что он работает корректно.

2. Форматирование и выполнение макроса

Для того чтобы избежать возможных проблем при попытке запуска макроса через VBS, попробуйте отредактировать строку, где запускается макрос. Вместо:

ExcelApp.Run MacroPath

Попробуйте использовать следующую конструкцию:

ExcelApp.Run "'" & wb.Name & "'!Module1.CopyColumnsToNewSheet"

Это обеспечит корректную работу, так как она явно указывает на рабочую книгу, содержащую макрос.

3. Закрытие Excel и устранение зависаний

Если Excel остается открытым после выполнения VBS-скрипта, это может быть вызвано тем, что макрос или сам VBS-скрипт не закрывают все запущенные рабочие книги. Убедитесь, что в макросе нет специфических условий, которые могут препятствовать завершению работы приложения. Если рабочая книга уже открыта, это также может привести к конфликтам. Закройте все инстансы Excel перед выполнением скрипта:

Set objExcel = CreateObject("Excel.Application")
objExcel.Quit

Или перезагрузите компьютер перед запуском скрипта.

4. Управление ошибками в VBS

Добавление обработки ошибок в ваш скрипт может помочь в выявлении причин, почему VBS не может завершить выполнение макроса или вызывает ошибки. Попробуйте следующий код для обработки ошибок:

On Error Resume Next
ExcelApp.Run MacroPath
If Err.Number <> 0 Then
    MsgBox "Ошибка при выполнении макроса: " & Err.Description
    Err.Clear
End If
On Error GoTo 0

Такой подход поможет вам получить информацию о возникших ошибках, что может значительно упростить процесс отладки.

5. Назначение прав и доступов

Убедитесь, что VBS-скрипт выполняется с необходимыми правами. Недостаток прав может вызвать ошибки во время доступа или выполнения операций с файлами. Запустите VBS-скрипт от имени администратора, если возможно.

Заключение

Для успешного выполнения вашей задачи важно проверить все вышеуказанные аспекты. Сначала убедитесь в правильности путей и названий макросов, впоследствии добавьте обработку ошибок и оптимизируйте выполнение сценария, чтобы избежать зависаний и продолжительных процессов. Следуя указанным рекомендациям, вы сможете устранить проблемы при запуске макросов через VBS и добиться успешного завершения автоматизации.

Оцените материал
Добавить комментарий

Капча загружается...