我们使用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。
答案 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