使用VBA在默认浏览器中打开html页面?

dmr*_*dmr 31 browser navigation vba

如何使用VBA在默认浏览器中打开HTML页面?我知道它是这样的:

Shell "http://myHtmlPage.com"
Run Code Online (Sandbox Code Playgroud)

但我想我必须参考打开页面的程序.

Dir*_*mar 40

您可以使用Windows API函数ShellExecute执行此操作:

Option Explicit

Private Declare Function ShellExecute _
  Lib "shell32.dll" Alias "ShellExecuteA" ( _
  ByVal hWnd As Long, _
  ByVal Operation As String, _
  ByVal Filename As String, _
  Optional ByVal Parameters As String, _
  Optional ByVal Directory As String, _
  Optional ByVal WindowStyle As Long = vbMinimizedFocus _
  ) As Long

Public Sub OpenUrl()

    Dim lSuccess As Long
    lSuccess = ShellExecute(0, "Open", "www.google.com")

End Sub
Run Code Online (Sandbox Code Playgroud)

只是关于安全性的简短说明:如果URL来自用户输入,请确保严格验证该输入,因为ShellExecute执行具有用户权限的任何命令,format c:如果用户是管理员,也将执行该操作.

  • 对于将来可能会使用它的人来说只是一个注释:您必须将ShellExecute函数放在页面顶部的声明部分中. (10认同)
  • 有些人可能需要在声明语句中添加"PtrSafe":"Private Declare PtrSafe Function ShellExecute ..."以使其在64位工作. (6认同)
  • @Dirk-正确。例如,您将在Access或Project中发送“ application.followhyperlink”,在Word中发送“ activedocument.followhyperlink”,在PowerPoint中发送“ activepresentation.folllowhyperlink”,等等。不要误会,您的方法没有什么问题;对于不同的情况,两者都是不错的选择。我更倾向于一次性使用FollowHyperlink或需要对post / get / etc进行更多控制的情况,而ShellExecute则用于同时打开页面组的情况。 (2认同)
  • `ThisWorkbook.FollowHyperlink("http://www.yoursite.com")` 的作用更多。 (2认同)

小智 35

你甚至可以说:

FollowHyperlink "www.google.com"
Run Code Online (Sandbox Code Playgroud)

如果您遇到自动化错误,请使用http://:

ThisWorkbook.FollowHyperlink("http://www.google.com")
Run Code Online (Sandbox Code Playgroud)

  • 如果在Excel中,您需要一个工作簿对象,例如ThisWorkbook.FollowHyperlink"www.google.com" (8认同)
  • FollowHyperlink 扰乱了 IE/Edge 安全,据我所知,使用 ShellExecute 的解决方案更可靠 (2认同)

小智 6

我发现最简单的是

shell "explorer.exe URL"
Run Code Online (Sandbox Code Playgroud)

这也适用于打开本地文件夹。


dnL*_*nLL 5

如果您想要一个更强大的ShellExecute解决方案,它将使用默认的操作系统关联程序打开任何文件,文件夹或URL,这里的函数来自http://access.mvps.org/access/api/api0018. htm:

'************ Code Start **********
' This code was originally written by Dev Ashish.
' It is not to be altered or distributed,
' except as part of an application.
' You are free to use it in any application,
' provided the copyright notice is left unchanged.
'
' Code Courtesy of
' Dev Ashish
'
Private Declare Function apiShellExecute Lib "shell32.dll" _
    Alias "ShellExecuteA" _
    (ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) _
    As Long

'***App Window Constants***
Public Const WIN_NORMAL = 1         'Open Normal
Public Const WIN_MAX = 3            'Open Maximized
Public Const WIN_MIN = 2            'Open Minimized

'***Error Codes***
Private Const ERROR_SUCCESS = 32&
Private Const ERROR_NO_ASSOC = 31&
Private Const ERROR_OUT_OF_MEM = 0&
Private Const ERROR_FILE_NOT_FOUND = 2&
Private Const ERROR_PATH_NOT_FOUND = 3&
Private Const ERROR_BAD_FORMAT = 11&

'***************Usage Examples***********************
'Open a folder:     ?fHandleFile("C:\TEMP\",WIN_NORMAL)
'Call Email app:    ?fHandleFile("mailto:dash10@hotmail.com",WIN_NORMAL)
'Open URL:          ?fHandleFile("http://home.att.net/~dashish", WIN_NORMAL)
'Handle Unknown extensions (call Open With Dialog):
'                   ?fHandleFile("C:\TEMP\TestThis",Win_Normal)
'Start Access instance:
'                   ?fHandleFile("I:\mdbs\CodeNStuff.mdb", Win_NORMAL)
'****************************************************

Function fHandleFile(stFile As String, lShowHow As Long)
Dim lRet As Long, varTaskID As Variant
Dim stRet As String
    'First try ShellExecute
    lRet = apiShellExecute(hWndAccessApp, vbNullString, _
            stFile, vbNullString, vbNullString, lShowHow)

    If lRet > ERROR_SUCCESS Then
        stRet = vbNullString
        lRet = -1
    Else
        Select Case lRet
            Case ERROR_NO_ASSOC:
                'Try the OpenWith dialog
                varTaskID = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " _
                        & stFile, WIN_NORMAL)
                lRet = (varTaskID <> 0)
            Case ERROR_OUT_OF_MEM:
                stRet = "Error: Out of Memory/Resources. Couldn't Execute!"
            Case ERROR_FILE_NOT_FOUND:
                stRet = "Error: File not found.  Couldn't Execute!"
            Case ERROR_PATH_NOT_FOUND:
                stRet = "Error: Path not found. Couldn't Execute!"
            Case ERROR_BAD_FORMAT:
                stRet = "Error:  Bad File Format. Couldn't Execute!"
            Case Else:
        End Select
    End If
    fHandleFile = lRet & _
                IIf(stRet = "", vbNullString, ", " & stRet)
End Function
'************ Code End **********
Run Code Online (Sandbox Code Playgroud)

只需将其放入一个单独的模块中,并使用正确的参数调用fHandleFile().