【问题标题】:Why is VBA not able to locate an Excel file in a particular path, unless the file is re-saved with same name?为什么 VBA 无法在特定路径中找到 Excel 文件,除非该文件以相同的名称重新保存?
【发布时间】:2019-12-27 20:21:48
【问题描述】:

我有一个 VBA 宏来打开三个工作簿(称为“file0.xlsm”、“file1.xlsm”和“file2.xlsm”)进行阅读和编辑。

问题在于打开这些文件中的第一个。每当我启动 Excel 并尝试运行宏时,VBA 都会显示错误:

“运行时错误 1004:
抱歉,我们找不到“file0.xlsm”。是否有可能被移动、重命名或删除?”

文件在目录中,并且名称正确。 (所有三个文件都与代码所在的工作簿位于同一目录中。)此外:如果我打开工作簿“file0.xlsm”,点击“另存为”,以相同的名称保存,关闭它,然后运行VBA 代码,错误不再出现。

无论 (1) 文件是保存为 .xlsx 还是 .xlsm 格式,(2) 文件名是硬编码的还是用户在电子表格中指定的,以及 (3) 中的顺序,都会出现错误我打开文件。

我尝试将数据从 file0 移动到新工作簿(通过一次将工作表从 file0 复制到新书一个),然后在我的代码中引用打开新书而不是 file0。错误仍然存​​在。

我还检查了文件名中的前导/尾随空格,并按照此页面上的步骤操作:https://github.com/OfficeDev/VBA-content/issues/637

开书代码:

If Not IsWorkBookOpen(book1) Then
    Workbooks.Open Filename:="file0.xlsm", UpdateLinks:=0, ReadOnly:=False, ignorereadonlyrecommended:=0, notify:=False, addtomru:=True
End If
If Not IsWorkBookOpen(book2) Then
    Workbooks.Open Filename:="file1.xlsm", UpdateLinks:=0, ReadOnly:=False, ignorereadonlyrecommended:=0, notify:=False, addtomru:=True
End If
If Not IsWorkBookOpen(book3) Then
    Workbooks.Open Filename:="file2.xlsm", UpdateLinks:=0, ReadOnly:=False, ignorereadonlyrecommended:=0, notify:=False, addtomru:=True
End If

注意:IsWorkBookOpen() 是一个检查一本书是否已经打开的函数。

IsWorkBookOpen() 的代码:

Function IsWorkBookOpen(Name As String) As Boolean
    Dim xWb As Workbook
    On Error Resume Next
    Set xWb = Application.Workbooks.Item(Name)
    IsWorkBookOpen = (Not xWb Is Nothing)
End Function

【问题讨论】:

  • 所以它只有在你保存第一个文件后才找到另外两个文件?检查你的路径。 Msgbox CurDir()
  • 您是否建议如果三个工作簿与保存 VBA 代码的工作簿位于同一目录中,Excel 必须将该目录视为当前目录?我建议你使用他们的完整路径。类似ThisWorkbook.Path & "\file0.xlsm" 而不仅仅是"file0.xlsm"。只有在您将该工作簿保存在该位置后,Excel才会自动添加当前目录,恐怕......
  • @bluewayrafi 你的问题不是完全量化文件pathfunction 也不起作用,因为您不完全了解它是如何/做什么的。 path 应始终包含 drive/folders 等...而您的函数检查 Workbooks.Item id 建议阅读此内容以了解它正在寻找/检查的内容
  • 你在时具体做了什么...在文件名字符串中指定路径...
  • @blue 指定路径失败你的问题,句号。如果您尝试过但仍然失败,那么您做错了什么。 (例如,您是否将 \ 附加到路径?)

标签: excel vba


【解决方案1】:

您的问题是,因为您只指定文件名而不是路径,所以您正试图从当前目录打开一个文件,无论它可能是什么。如果该目录包含具有指定名称的文件,则该文件将打开(可能是也可能不是您想要打开的文件!)。当打开成功时,当前目录将更新为刚刚使用的目录。

因此,您需要验证/更新当前目录(不推荐)或完全限定您的路径和文件名。

顺便说一句,您已经编写了一个辅助函数IsWorkBookOpen。如果需要,我会扩展它以打开文件,并检查路径和文件名的格式是否正确。

类似这样的:

Function ReturnWorkBook(Name As String, Optional Path As String = vbNullString) As Workbook
    Dim xWb As Workbook
    On Error GoTo EH

    Set ReturnWorkBook = Application.Workbooks(Name)
Exit Function
EH:
    Resume EHOpen
EHOpen:
    On Error GoTo EHFail
    If Path = vbNullString Then Path = ThisWorkbook.Path
    If Right$(Path, 1) <> "\" Then Path = Path & "\"
    If Not (Right$(Name, 4) Like ".xls[xm]") Then
        Name = Name & ".xlsm"  'Assumes default file type, update as needed
    End If
    Set ReturnWorkBook = Application.Workbooks.Open( _
        Filename:=Path & "\" & Name, _
        UpdateLinks:=0, _
        ReadOnly:=False, _
        IgnoreReadOnlyRecommended:=False, _
        Notify:=False, _
        AddToMru:=True)
EHFail:
    ' Exit with ReturnWorkBook = Nothing
End Function

您可以通过多种方式调用它

Dim wb0 as Workbook
Dim wb1 as Workbook
Dim wb2 as Workbook

Set wb0 = ReturnWorkBook("file0.xlsm", ActiveWorkbook.Path)
Set wb1 = ReturnWorkBook("file1.xlsm") ' uses Thisworkbook.Path
Set wb2 = ReturnWorkBook("file2")      ' uses Thisworkbook.Path and .xlsm extension

然后您的以下代码可以使用wb0wb1wb2 来检查失败(例如If wb0 = Nothing Then),并参考打开的书籍(例如wb1.Worksheets("SomeSheet") 等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多