Подтвердить что ты не робот

Как открыть файл 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

Заранее благодарю вас!

4b9b3361

Ответ 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 выполняет преобразование соответствующим образом!