Как открыть файл Excel VBA с использованием приложения по умолчанию
Мне нужна электронная таблица Excel, которая имеет путь и имя файла в столбце A. Когда выполняется макрос, скажем, файл, указанный в A1, должен быть открыт на компьютере пользователя. Файл может быть .doc,.xls,.txt и т.д., А не мой vba, который должен знать полный путь к приложению, как я могу заставить vba сказать машине "откройте этот файл и используйте ваше приложение связанный с расширением"?
Я уже нашел, что это работает с полным путем:
dblShellReturned = Shell("C:\Windows\System32\notepad.exe myfile.txt, vbNormalFocus)
как я могу заставить его работать с чем-то вроде:
dblShellReturned = Shell("myfile.txt", vbNormalFocus) ' how do I get this to work
Заранее благодарю вас!
Ответы
Ответ 1
Это работает для меня в Excel и Word
Sub runit()
Dim Shex As Object
Set Shex = CreateObject("Shell.Application")
tgtfile = "C:\Nax\dud.txt"
Shex.Open (tgtfile)
End Sub
или... согласно комментарию Expenzor ниже
CreateObject("Shell.Application").Open("C:\Nax\dud.txt")
Ответ 2
Код ниже представляет собой шаблон. Однако вы можете обновить каталог по умолчанию (рабочий), указав местоположение файла.
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpszOp As String, _
ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal LpszDir As String, ByVal FsShowCmd As Long) _
Function StartDoc(DocName As String) As Long
Dim Scr_hDC As Long
Scr_hDC = GetDesktopWindow()
StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _
"", "C:\", SW_SHOWNORMAL)
End Function
Ответ 3
Команда VBA Shell хочет exe, поэтому я запускаю explorer.exe и передаю путь к файлу в качестве аргумента. Он также работает с ярлыками *.lnk и веб-адресами.
Shell "explorer.exe C:\myfile.txt"
Ответ 4
Shell32.Shell
Можно использовать COM-объект aka Shell.Application
, который обертывает функцию ShellExecute
Win32 API:
-
Добавьте ссылку на библиотеку типов Microsoft Shell Controls And Automation
в проект VBA через Tools->References...
, затем
Dim a As New Shell32.Shell
Call a.ShellExecute("desktop.ini")
-
В качестве альтернативы без ссылок:
Call CreateObject("Shell.Application").ShellExecute("desktop.ini")
Интересно, что здесь (WinXP) при использовании типизированной переменной (которая предоставляет автозаполнение) ShellExecute
отсутствует в списке участников (но тем не менее работает).
Ответ 5
Я не могу комментировать существующие ответы (недостаточно очков), поэтому я отвечаю, чтобы добавить информацию.
Работая с Access 2010, я столкнулся с тихими сбоями со следующим синтаксисом:
Dim URL As String
URL = "http://foo.com/"
CreateObject("Shell.Application").Open URL
Я мог бы заставить его работать, если бы я заключил URL
в скобки, но это кажется неправильным для синтаксиса вызова подпрограммы (вместо функции). Я попытался усвоить возвращаемое значение, но это не удалось с синтаксисом вызова функции, если я не удвоил скобки. Я понял, что круглые скобки были не просто синтаксическим сахаром - они должны были что-то делать, что заставило меня поверить, что они могут облегчать неявное приведение.
Я заметил, что Open
ожидает Variant
, а не String
. Поэтому я попробовал CVar
, который работал. Имея это в виду, следующий мой предпочтительный подход, поскольку он сводит к минимуму "почему здесь есть лишние скобки?" вопросы.
Dim URL As String
URL = "http://foo.com/"
CreateObject("Shell.Application").Open CVar(URL)
Урок заключается в том, что при выполнении вызовов OLE Automation следует четко указывать, как Access VBA выполняет преобразование соответствующим образом!