为什么VBA无法在特定路径中找到Excel文件,除非该文件以相同的名称重新保存?
我有一个VBA宏来打开三本工作簿(称它们为“file0.xlsm”、“file1.xlsm”和“file2.xlsm”)进行阅读和编辑 问题在于打开这些文件中的第一个。每当我启动Excel并尝试运行宏时,VBA都会显示错误: “运行时错误1004:为什么VBA无法在特定路径中找到Excel文件,除非该文件以相同的名称重新保存?,excel,vba,Excel,Vba,我有一个VBA宏来打开三本工作簿(称它们为“file0.xlsm”、“file1.xlsm”和“file2.xlsm”)进行阅读和编辑 问题在于打开这些文件中的第一个。每当我启动Excel并尝试运行宏时,VBA都会显示错误: “运行时错误1004: 很抱歉,我们找不到“file0.xlsm”。它是否可能已被移动、重命名或删除?” 该文件位于目录中,且名称正确。(所有三个文件都与代码所在的工作簿位于同一目录中。)此外:如果打开工作簿“file0.xlsm”,点击“另存为”,用相同的名称保存它,关闭
很抱歉,我们找不到“file0.xlsm”。它是否可能已被移动、重命名或删除?” 该文件位于目录中,且名称正确。(所有三个文件都与代码所在的工作簿位于同一目录中。)此外:如果打开工作簿“file0.xlsm”,点击“另存为”,用相同的名称保存它,关闭它,然后运行VBA代码,则错误不再出现 无论(1)文件保存为.xlsx还是.xlsm格式,(2)文件名是硬编码还是电子表格中用户指定的,以及(3)打开文件的顺序如何,都会出现此错误 我尝试将数据从文件0移动到新工作簿(通过将工作表从文件0一次复制到新书),然后在代码中引用打开新书而不是文件0。错误仍然存在 我还检查了文件名中的前导/尾随空格,并遵循了此页面上的过程: 打开书籍的代码:
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()的代码:
您的问题是,因为您只指定了文件名而没有指定路径,所以您正试图从当前目录打开一个文件,不管它是什么。如果该目录包含具有指定名称的文件,则该文件将打开(可能是也可能不是您要打开的文件!)。打开成功后,当前目录将更新到刚才使用的目录 因此,您需要验证/更新当前目录(不重新命名),或者完全限定您的路径和文件名 另一方面,您已经编写了一个helper函数
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
然后,您的以下代码可以使用
wb0
,wb1
,wb2
检查故障(例如如果wb0=Nothing,那么
),并参考opend书籍(例如wb1.Worksheets(“SomeSheet”),这样它只能在保存第一个文件后找到其他两个文件?检查你的路径<代码> MsgBox CurrDy.()/Case>您想建议如果三个工作簿位于工作簿中保存VBA代码的同一个目录中,Excel必须将该目录视为当前目录吗?我建议你使用他们的完整路径。类似于thiswoolk.Path&“\file0.xlsm”
而不仅仅是“file0.xlsm”
。只有在您将工作簿保存到该位置后,Excel才会自动添加当前目录,恐怕…@bluewayrafi您的问题是无法完全量化文件路径。另外,功能
不起作用,因为您不完全了解它是如何工作的。路径
应始终包括驱动器/文件夹
等。。。当您的函数检查工作簿时。Item
id建议您仔细阅读此项,以了解其目的/检查您在…指定文件名字符串中的路径时到底做了什么…@blue指定路径失败是您的问题,请停止。如果你尝试了,但还是失败了,那你就做错了。(例如,您是否将\附加到路径?)
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