【问题标题】:Why do drive letters make this VBA code fail in Excel 2010?为什么驱动器号使此 VBA 代码在 Excel 2010 中失败?
【发布时间】:2014-03-06 22:53:57
【问题描述】:

我维护的一个 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工作簿中使用这种格式的路径,则不调用:

\\servername\filepath

但是当路径有驱动器号时调用它:

X:\filepath

现在无论何时调用它都会失败。以前从来没有这个问题。

代码应该返回驱动器号所指的服务器路径。

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


典型输入:

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

【问题讨论】:

  • WNetGetConnection 是做什么的?你能把这段代码也给我们看看吗?
  • @aphoria 这是微软的一个功能。
  • 这里是Microsoft's info 。
  • 您能否详细说明您提供的输入以及您期望的输出与您获得的输出?
  • 向我们展示定义此对 VBA 的外部库调用的 Declare Function .. Lib 语句。

标签: vba excel


【解决方案1】:

我知道你说它曾经可以工作,但我看不出你发布的代码是如何工作的。

试试这个...假设error_success 被定义为一个全局变量或常量。

变量DrivePath 必须预先格式化为充满空格的字符串...否则WNetGetConnection 无法使用它返回UNC 路径。

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

【讨论】:

  • 我认为这已经有所进展。现在它给出了一个缺少库的错误。
  • 奇怪的是,我已经找到并确认 mpr.dll 仍在我的计算机上。
  • MPR.DLL 是否在您的PATH 中的文件夹中?
  • 是的,这很……奇怪。
  • aphoria,我已经解决了这个问题。看我的回答。
【解决方案2】:

原来问题其实不在这段代码所依赖的库,而是在不同的引用中。

Office 2007 有一个名为 Microsoft 日历控件的控件,该控件在 Office 2010 中不再存在。此控件仍在 VBA 代码引用对话框中被引用,看起来类似于但不完全相同:

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

值得注意的是,它甚至可以使用原始代码,据报道这是“错误的”。

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2017-09-18
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多