2016-02-05 85 views
2

我需要檢查Excel工作簿打開時的Internet連接。爲此,我試着下面的代碼:從Excel VBA檢查互聯網連接

Private Declare PtrSafe Function InternetGetConnectedState _ 
    Lib "wininet.dll" (ByRef dwflags As Long, _ 
    ByVal dwReserved As Long) As Long 

Private Const INTERNET_CONNECTION_MODEM As Long = &H1 
Private Const INTERNET_CONNECTION_LAN As Long = &H2 
Private Const INTERNET_CONNECTION_PROXY As Long = &H4 
Private Const INTERNET_CONNECTION_OFFLINE As Long = &H20 
Function IsInternetConnected() As Boolean 
    Dim L As Long 
    Dim R As Long 
    R = InternetGetConnectedState(L, 0&) 
    If R = 0 Then 
     IsInternetConnected = False 
    Else 
     If R <= 4 Then 
      IsInternetConnected = True 
     Else 
      IsInternetConnected = False 
     End If 
    End If 
End Function 

它的工作原理,但一些用戶報告這是打破Excel(它永遠凍結Excel)。

有沒有辦法拋出一個錯誤或以某種方式糾正此代碼,以找出問題的原因是什麼(防火牆等)?

非常感謝您的幫助!

+1

這是一個64位導入。 「凍結」計算機是否運行32位Office安裝?對編譯器指令進行一些研究,以瞭解如何將兩者合併到單個模塊聲明區域中。 – Jeeped

+0

@Jeeped謝謝你的幫助。我正在運行一個32位Excel安裝,我沒有問題。 –

+0

'PtrSafe'告訴我這是一個64位導入。此外,[InternetGetConnectedState](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384702%28v=vs.85%29.aspx)旨在返回布爾值,而不是長整型。 – Jeeped

回答

1

下面是具有編譯器指令的正確導入。

Option Explicit 

#If Win64 Then 
    Public Flg As LongPtr 
    Public Declare PtrSafe Function InternetGetConnectedState _ 
      Lib "wininet.dll" (lpdwFlags As LongPtr, _ 
      ByVal dwReserved As Long) As Boolean 
#Else 
    Public Flg As Long 
    Public Declare Function InternetGetConnectedState _ 
      Lib "wininet.dll" (lpdwFlags As Long, _ 
      ByVal dwReserved As Long) As Boolean 
#End If 

Private Const INTERNET_CONNECTION_MODEM As Long = &H1 
Private Const INTERNET_CONNECTION_LAN As Long = &H2 
Private Const INTERNET_CONNECTION_PROXY As Long = &H4 
Private Const INTERNET_CONNECTION_OFFLINE As Long = &H20 

Function IsInternetConnected() As Boolean 
    Dim R As Long 

    R = InternetGetConnectedState(Flg, 0&) 

    If Flg >= INTERNET_CONNECTION_OFFLINE Then 
     Debug.Print "INTERNET_CONNECTION_OFFLINE" 
    End If 

    If CBool(R) Then 
     IsInternetConnected = True 
    Else 
     IsInternetConnected = False 
    End If 
End Function 

Sub main() 
    Dim mssg As String 
    If IsInternetConnected Then 
     mssg = "Connected" 
    Else 
     mssg = "Not connected" 
    End If 
    MsgBox mssg 
End Sub 

相信的問題,至少一人未能提供正確的VAR型接收lpdwFlags。我在編譯器指令中添加了一個公共變量。 Flg var從函數接收標誌。這些可以按照您的常量逐位解析來確定狀態。有關更多信息(和全套標誌),請參見InternetGetConnectedState

這已經在32位和64位xl2010上進行過測試。

+0

Uau,非常感謝你,我需要進一步調查InternetGetConnectedState並在其他用戶的機器上測試 –