2016-02-05 167 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并在其他用户的机器上测试 –