Вопрос или проблема
Задача: У клиента есть 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-скрипта или проблемы с указанным путем к макросу.
-
Убедитесь, что имя макроса “Module1.CopyColumnsToNewSheet” правильное. Оно должно точно совпадать с именем макроса в Excel. Попробуйте запустить макрос непосредственно в Excel, чтобы подтвердить, что
CopyColumnsToNewSheet
выполняется без ошибок. -
Полностью укажите путь к макросу:
ExcelApp.Run "'" & wb.Name & "'!Module1.CopyColumnsToNewSheet"
-
Если рабочая книга Excel уже открыта другим процессом или была оставлена открытой после неудачного запуска, скрипт может столкнуться с проблемами. Закройте все экземпляры Excel или перезагрузите систему, чтобы убедиться, что нет открытых файлов.
Обработка ошибок: -
Добавьте обработку ошибок в 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 и добиться успешного завершения автоматизации.