“我的电脑”中的“断开的网络驱动器”

时间:2015-01-28 09:17:20

标签: vba excel-vba vbscript excel

我们使用VPN连接到工作网络。我有一个映射的网络驱动器,显示"断开连接的网络驱动器"在我连接后立即在我的电脑中。在这种状态下,我运行VBA例程:

Dim dr As String: dr = "F:\T\"
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(dr) Then
    Call fso.CreateFolder(dr)
End If

即使文件夹确实存在,fso也认为它没有尝试创建文件夹并抛出错误:运行时错误76:找不到路径。当然它无法找到它,因为它处于断开状态。使用该网络驱动器的任何其他操作也将失败。

所以我打开“我的电脑”并手动双击网络驱动器。它连接得很好,我再次运行代码时不再出错。但这是有问题的。我需要在代码中使用一个解决方案来自动连接网络驱动器。

可能的解决方案1:只需使用UNC路径而不是映射的驱动器号。问题在于我不知道路径是什么。我也不想使用UNC;代码需要灵活,以便在驱动器映射到的任何地方使用。这是黄铜公司的政策。

可能的解决方案2:使用Net Use或WshNetwork重新映射网络驱动器。同样,这并不可能,因为我不知道UNC路径是什么或将来是什么。

可能的解决方案3: Connect using ShellExecute虽然这样可行,但它并不真实,因为它会打开一个窗口来浏览文件夹(可以使用SW_HIDE来避免显示窗口,那么我将如何关闭它?)。此外,它不会立即连接。我需要延迟不确定的长度来完成这项工作。不是一个好的答案。 MSDN ShellExecute Function

那么有更好的解决方案吗?如何在等待它返回时连接驱动器并在无法连接时抛出错误?

我需要它同时适用于VBScript和VBA。

1 个答案:

答案 0 :(得分:1)

Slugster建议获得映射的UNC值是一个很好的建议。以下是我的解决方案,改编自this answer这适用于VBScript和VBA。

Sub testget()
    Debug.Print getUNC("F:\T\")
End Sub

Function getUNC(dir)

    Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
    Dim sDrive: sDrive = fso.GetDriveName(dir)
    Set fso = Nothing

    Dim sMap: sMap = GetMappedDrive(sDrive)
    If sMap <> "" And sDrive <> sMap Then
        getUNC = Replace(dir, sDrive, sMap)
    Else
        getUNC = dir
    End If

End Function

Function GetMappedDrive(sDrive)
    Dim wshNetwork: Set wshNetwork = CreateObject("WScript.Network")
    Dim oDrives: Set oDrives = wshNetwork.EnumNetworkDrives
    Dim i
    For i = 0 To oDrives.Count - 1 Step 2
        If UCase(oDrives.Item(i)) = UCase(sDrive) Then
            GetMappedDrive = oDrives.Item(i + 1)
            Exit For
        End If
    Next
    Set oDrives = Nothing
    Set wshNetwork = Nothing
End Function