为什么驱动器号在Excel 2010中使这个VBA代码失败?

我维护的excel工作簿中有这个VBA代码:

Function GetDrivePath(DriveLetter As String) As String Dim DrivePath As String Dim DriveLen As Long 'DrivePath = Space(260) DriveLen = Len(DrivePath) If WNetGetConnection(DriveLetter, DrivePath, DriveLen) = error_success Then GetDrivePath = DrivePath Else GetDrivePath = DriveLetter End If End Function 

直到最近这个代码工作正常,但现在失败了。 即使在Excel工作表的存档版本中,它也不能工作。

如果在Excel工作簿中使用这种格式的path,则不会调用它:

 \\servername\filepath 

但是当path有驱动器号时会被调用:

 X:\filepath 

现在只要被调用就会失败。 它从未有过这个问题。

代码应该返回驱动器号引用的服务器path。

它返回的错误并不是特别有用; 这是一个简单的types不匹配错误。


典型input:

 X: 

其中“X”是一个驱动器号。

典型输出:

 \\servername\path-to-folder-that-X-is-mapped-to 

声明声明:

 Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long 

我知道你说它曾经工作,但我不知道你张贴的代码是如何工作的。

试试这个…并假设error_success被定义为全局variables或常量。

variablesDrivePath必须预先格式化为空string,否则WNetGetConnection不能使用它返回UNCpath。

 Public Function GetDrivePath(DriveLetter As String) As String Dim DrivePath As String Dim DriveLen As Long DriveLen = 255 DrivePath = Space(DriveLen) If WNetGetConnection(DriveLetter, DrivePath, DriveLen) = error_success Then GetDrivePath = DrivePath Else GetDrivePath = DriveLetter End If End Function 

事实certificate,这个问题实际上不在这个代码所依赖的库中,而是在一个不同的参考中。

Office 2007有一个名为“Microsoft日历控件”的控件,该控件在Office 2010中不再存在。此控件仍在VBA代码引用对话框中引用,该控件看上去类似但不完全像这样:

缺少控制

为了解决这个问题,我进入VBA代码查看器,打开工具下拉菜单并单击引用。 这会引起一个类似于上面的对话框。 我只是取消选中缺less的参考(甚至没有在这个Excel工作簿中使用),然后单击确定。 这立即清除了所有问题。

值得注意的是,它甚至与原来的代码,据报道是“错误的”。