从Excel VBA检查互联网连接

当Excel工作簿打开时,我需要检查Internet连接。 为此,我正在尝试下面的代码:

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永远)。

有没有办法抛出一个错误或以某种方式纠正这个代码,以找出问题的原因是什么(防火墙等)?

非常感谢你的帮助!

以下是使用编译器指令的正确导入。

 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 

我相信至less有一个问题是无法提供正确的var-type来接收lpdwFlags 。 我已经在编译器指令中添加了一个公共variables。 Flg var从函数接收标志。 这些可以按照您的常量逐位parsing来确定状态。 有关更多信息(和全套标志),请参阅InternetGetConnectedState 。

这已经在32位和64位xl2010上进行了testing。