Запуск исполняемой программы с помощью функции Shell в VBA Excel. Синтаксис функции Shell, ее параметры, возвращаемые значения, примеры.
Shell – это функция, которая запускает указанную исполняемую программу и возвращает значение Variant (Double), представляющее идентификатор задачи запущенной программы, или возникает ошибка, если функция Shell не может запустить указанную программу.
Синтаксис
Синтаксис функции Shell:
Shell(pathname, [windowstyle]) |
Если значение функции присваивается переменной, параметры должны быть заключены в скобки. Если функция Shell используется только для запуска программы из кода VBA Excel, параметры должны быть указаны без скобок.
Параметры
Параметры функции Shell:
Параметр | Описание |
---|---|
pathname | Обязательный параметр. Значение типа Variant (String), задающее имя программы, которую требуется выполнить, и которое может включать диск, каталоги и папки, а также дополнительные параметры при использовании cmd. |
windowstyle | Необязательный параметр. Значение типа Variant (Integer), задающее стиль окна, в котором будет запущена программа. Если аргумент windowstyle опущен, программа запускается в свернутом окне и получает фокус. |
Константы
Константы VBA Excel, задающие стиль окна (windowstyle):
Константа | Значение | Описание |
---|---|---|
vbHide | 0 | Окно скрыто, фокус переходит к скрытому окну. |
vbNormalFocus | 1 | Окно восстанавливает свое исходное положение и размер, а также получает фокус. |
vbMinimizedFocus | 2 | Окно отображается в виде значка, а также получает фокус. |
vbMaximizedFocus | 3 | Окно разворачивается на весь экран, а также получает фокус. |
vbNormalNoFocus | 4 | Окно восстанавливает свое исходное положение и размер, но фокус не получает. |
vbMinimizedNoFocus | 6 | Окно отображается в виде значка, но фокус не получает. |
Примечания
- Если функция Shell успешно запускает указанную программу, возвращается код (идентификатор) задачи запущенной программы (ID процесса в Диспетчере задач). Если функция Shell не может запустить указанную программу из кода VBA Excel, происходит ошибка.
- Если в полном имени запускаемой программы содержатся пробелы, полное имя программы следует заключить в тройные кавычки (три пары двойных кавычек):
"""C:Program FilesПапка программыимя.exe"""
. - По умолчанию функция Shell запускает другие программы асинхронно. Это означает, что программа, запущенная с помощью команды Shell, может не завершиться до того, как будут выполнены операторы, следующие за функцией Shell.
Примеры
Пример 1
Запустим с помощью функции Shell программу Notepad++, отобразим идентификатор задачи в информационном окне MsgBox и сравним его с ID процесса в Диспетчере задач.
Используем в параметре pathname тройные кавычки (три пары двойных кавычек), так как полное имя файла содержит пробелы:
Sub Primer1() Dim myTest myTest = Shell(«»«C:Program Files (x86)Notepad++notepad++.exe»«», vbNormalFocus) MsgBox myTest End Sub |
ID процесса в информационном окне MsgBox:
ID процесса в Диспетчере задач:
Пример 2
Запуск проводника Windows из кода VBA Excel с помощью функции Shell.
Обе строки открывают окно проводника Windows с набором дисков и папок по умолчанию:
Shell «C:Windowsexplorer.exe», vbNormalFocus Shell «explorer», vbNormalFocus |
Обе строки открывают папку «Текущая папка»:
Shell «C:Windowsexplorer.exe C:UsersPublicТекущая папка», vbNormalFocus Shell «explorer C:UsersPublicТекущая папка», vbNormalFocus |
Пример 3
Запуск командной строки из кода VBA Excel с помощью функции Shell.
Обе строки запускают программу cmd и открывают окно командной строки:
Shell «C:WindowsSystem32cmd.exe», vbNormalFocus Shell «cmd», vbNormalFocus |
Записываем строку «Большой привет!» в файл «C:Тестовая папкаtest1.txt» (если файл не существует, от будет создан):
Shell «cmd /c echo Большой привет!>»«C:Тестовая папкаtest1.txt»«», vbHide |
Здесь полное имя файла является параметром программы cmd, поэтому, если оно содержит пробелы, оно заключается в две пары двойных кавычек, а не в три, как параметр pathname функции Shell.
Константа vbHide используется для того, чтобы при выполнении команды не мелькало окно командной строки.
Параметр «/c» программы cmd указывает, что после выполнения команды программа завершает работу и окно командной строки закрывается. Чтобы программа cmd после выполнения команды продолжила работу и ее окно осталось открытым, вместо параметра «/c» следует указать параметр «/k» и заменить константу vbHide на константу, не скрывающую окно.
Копируем файл «C:Тестовая папкаtest1.txt» в файл «C:Тестовая папкаtest2.txt»:
Shell «cmd /c copy ««C:Тестовая папкаtest1.txt»» ««C:Тестовая папкаtest2.txt»«», vbHide |
Смотрите как открывать из кода VBA Excel файлы других приложений и интернет-сайты.
Задача по объединению данных из нескольких Excel-файлов, или подгрузка доп.данных из внешнего файла решается достаточно просто: создается объект Excel, который можно скрыть визуально, затем открывается необходимый файл и выполняются нужные действия. Просто приведу несколько примеров.
Открытие файла Excel
Set objExcel = New Excel.Application objExcel.Visible = False Set wb = objExcel.Workbooks.Open(fname) Set ws = wb.Sheets(1)
В первой строке запускаем новый Excel, затем делаем его невидимым, в 3-й строке открываем файл fname. В последней строке получаем первый лист открытого excel-кого файла.
Альтернативный вариант открытия файла
Set objExcel = New Excel.Application Set wb = objExcel.Workbooks wb.Open fname, local:=True Set ws = wb.Item(1).ActiveSheet
При открытии файла можно использовать доп.параметры (приведу некоторые):
UpdateLinks — обновлять или нет внешние ссылки при открытии файла;
ReadOnly — открытие в режиме только для чтения;
Format — используемый при открытии разделитель (1 — символ tab, 2 — запятые, 3 — пробелы, 4 — точка с запятой, 5 — без разделителя, 6 — пользовательский разделитель, заданный в Delimiter);
Delimiter — пользовательский разделитель (в случае, если Format = 6);
Origin — тип операционной системы (xlMacintosh, xlWindows или xlMSDOS);
Local — использование в Excel языка такого же, как в открываемом файле.
Теперь можно выполнять какие-то действия с открытым файлом, просто обращаясь через wb и ws.
ws.Cells(1, 1).Value = "Test" ws.Cells(1, 1).Font.Size = 18 ' Поменять размер шрифта ws.Cells(1, 1).HorizontalAlignment = xlCenter '
Записать книгу и закрыть
wb.Save ' Записать с тем же именем wb.SaveAs Filename:="имя_нового_файла", FileFormat:=xlOpenXMLWorkbookMacroEnabled ' Записать в новый файл wb.Close ' Закрыть книгу
Для записи текущей книги (где находится макрос), можно использовать:
ActiveWorkbook.SaveAs
Чтобы сохранить или перезаписать книгу Excel без вопросов, можно применить такой вариант:
Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="c:Temp001.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled Application.DisplayAlerts = True
У метода SaveAs есть несколько параметров сохранения, с ними можно ознакомиться на сайте Microsoft.
Если нужно, можно закрыть книгу Excel без сохранения изменений таким образом:
wb.Close False
Запуск и управление приложениями семейства MS Office
Иногда требуется управлять другими приложениями из VBA Excel. Начнем с приложений семейства Microsoft Office. Например, на основе произведенных расчетов в Excel надо сформировать текстовый документ в Word-е. Для начала в нашем проекте надо подключить библиотеку с объектами MS Word:
Tools=>References подключаем последнюю версию библиотеки Microsoft Word Object Library
Пример кода для запуска Word-а из VBA
Dim w As Word.Application Set w = New Word.Application w.Visible = True w.Activate
Вот и все, мы запустили приложение Word.
Аналогичным способом можно запустить любое другое приложение из семейства Microsoft Office: Access, Outlook, PowerPoint. Можно получить к любому приложению, которое мы видим списке библиотек.
Для работы с внешним приложением необходимо ознакомиться с объектной моделью, изучить свойства и методы объектов.
Кроме запуска внешнего приложения, мы имеем полный доступ к объектам данного приложения. Можно писать макросы, которые будут управлять объектами Word в данном случае.
Запуск внешнего приложения с помощью скрипта WScript.Shell.
Все очень просто
Sub RunShell() Set WSShell = CreateObject("Wscript.Shell") WSShell.Run """C:Program Files (x86)GoogleGoogle Earthclientgoogleearth.exe""", 1 End Sub
Главное пишем побольше кавычек (аж три штуки с краю), если путь содержит пробелы и прочие «противные» символы.
К сожалению, в данном случае, мы только запускаем внешнее приложение без доступа к его объектам.
Запуск и управление внешним приложением
В меню VBA=>Tools=>Refernces видно все COM-объекты приложений, которые установлены на вашем компьютере. Подключаем соответствующую библиотеку, например, «GrymCore». И мы получаем доступ к ДубльГису. С документацией API Дубль Гиса можно ознакомиться на их сайте.
Если в макросе, написанном для Microsoft Word, требуется обратиться к данным, хранящимся в файле какого-либо другого приложения, например Excel, или наоборот, передать данные из Word в такой файл, то возникает необходимость запуска того приложения, в формате которого сохранен файл. Ниже приведены программные коды макросов VBA для Microsoft Word, запускающие приложение Excel.
Макрос, запускающий Excel и открывающий новую рабочую книгу
Если для передачи данных из Outlook в Excel нужна новая рабочая книга, можно воспользоваться примером кода, приведенного ниже.
Sub Zapusk_Excel_iz_Word1() Dim objXls As Object Set objXls = CreateObject("Excel.Application") objXls.Workbooks.Add objXls.Application.Visible = True Set objXls = Nothing End Sub
Для того, чтобы перенести этот программный код на свой компьютер, наведите курсор мыши на поле с программным кодом, нажмите на одну из двух кнопкок в правом верхнем углу этого поля, скопируйте программный код и вставьте его в модуль проекта на своем компьютере (подробнее о том, как сохранить программный код макроса).
Макрос, запускающий Excel и открывающий заданный файл
Если же для передачи данных из Outlook в Excel, или наоборот, требуется открытие какого-либо определенного файла, то можно использовать следующий код:
Sub Zapusk_Excel_iz_Word2() Dim objXls As Object Set objXls = CreateObject("Excel.Application") objXls.Workbooks.Open "C:Test.xlsx" 'укажите путь и имя существующего файла objXls.Application.Visible = True Set objXls = Nothing End Sub
При копировании этого кода на свой компьютер, не забудьте изменить путь к файлу. Запуск приложения можно сделать и невидимым, если в коде изменить True на False.
Другие материалы по теме:
In this Article
- Call Shell
- Shell Wait
- Returning an Error from the Shell Function
- Open an Existing File With Shell
- Parameters used by the Shell function
- Returning a Process ID from the Shell Command
- Calling Other Programs With Shell
- ShellExecute and ShellExecuteEx vs the Shell Command
This tutorial will demonstrate how to use the VBA Shell function.
We can use the VBA Shell function to call a separate, executable program from inside a VBA program. For example, if we need to open Notepad from Excel, we can use the VBA Shell function to do so. If the Shell call succeeds, it returns the Windows TaskID value of the program it called. If the Shell call fails, it returns zero.
Shell has two input parameters: a required pathname for the program to call, and an optional windowstyle value controlling the style of the window where the program will run. The pathname value can include the program path / directory and arguments.
Call Shell
This code can form part of a macro to run Notepad by using the VBA Call command to call the Shell function.
Call Shell("notepad", vbNormalFocus)
For example:
Shell Wait
We can use the VBA Wait command to delay calling the Shell command for a specific period of time.
Application.Wait (Now + TimeValue("00:00:05"))
Call Shell("notepad", vbNormalFocus)
Therefore 5 second will pass before the Shell command is called.
Returning an Error from the Shell Function
If we have an error in our code when calling the Shell function, and error will be returned and our code will go into debug mode.
For example, in this macro, we have spelt “note pad” incorrectly.
Call Shell("note pad", vbNormalFocus)
The result of running this macro will be:
Open an Existing File With Shell
If we have a specific file that we wish to open with the Shell command, we can include the file name in our code.
Call Shell("Notepad.exe C:demoshell_test.txt", vbNormalFocus)
If we spell the file name incorrectly, the file will not be found and a message box will appear asking us if we wish to create a new file.
Parameters used by the Shell function
The Shell function has 2 parameters – the name of the program to call, and the windows style that the program is going to use. We have been using the vbNormalFocus in the examples above which means that when the program (in this case Notepad) is opened, it has the focus and it opens in the default position and size on the PC.
The Shell offers five other options:
vbHide Hides the window and sets focus on that window
vbMinimizedFocus Displays the window as an icon with focus
vbMaximizedFocus Opens the program in a maximized window with focus
vbNormalNoFocus Restores the window at its most recent position and size
vbMinimizedNoFocus Displays the window as an icon and the currently active window stays active
Returning a Process ID from the Shell Command
When we run the Shell Command, it returns a Process or Task ID. We can store the Process ID in a variable, and use that Process ID in running another command – for example, the TaskKill command to close the Notepad file.
Sub TestPID
Dim ProcessID as integer
processID = Shell("notepad", vbNormalFocus)
Call Shell("Taskkill /F /PID " + CStr(processID))
MsgBox ("Notepad ProcessID = " + CStr(processID))
End Sub
In the first line, NotePad is opened and the Process ID is assigned a value by Windows. We store this value in the ProcessID variable. We then use TaskKill to force Notepad to close the instance of NotePad that we have just opened. The /F switch forces Notepad to end, and the /PID switch tells TaskKill to look for the Notepad Process ID value. The CStr function converts ProcessID to the string format that Shell, and MsgBox on the next line, both need.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Calling Other Programs With Shell
Shell will open any other Windows program. For example, this code calls Excel, and opens Excel file ‘example_workbook.xlsx’:
Call Shell("Excel ""C:DEMOexample_workbook.xlsx""", vbNormalFocus)
This shows the opened file:
ShellExecute and ShellExecuteEx vs the Shell Command
The Windows programming space offers ShellExecute and ShellExecuteEx functions that call external programs from software code. Compared to the VBA Shell function, these Windows functions offer more flexibility, but VBA does not support them and therefore this article does not cover them.