Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么VBA无法在特定路径中找到Excel文件,除非该文件以相同的名称重新保存?_Excel_Vba - Fatal编程技术网

为什么VBA无法在特定路径中找到Excel文件,除非该文件以相同的名称重新保存?

为什么VBA无法在特定路径中找到Excel文件,除非该文件以相同的名称重新保存?,excel,vba,Excel,Vba,我有一个VBA宏来打开三本工作簿(称它们为“file0.xlsm”、“file1.xlsm”和“file2.xlsm”)进行阅读和编辑 问题在于打开这些文件中的第一个。每当我启动Excel并尝试运行宏时,VBA都会显示错误: “运行时错误1004: 很抱歉,我们找不到“file0.xlsm”。它是否可能已被移动、重命名或删除?” 该文件位于目录中,且名称正确。(所有三个文件都与代码所在的工作簿位于同一目录中。)此外:如果打开工作簿“file0.xlsm”,点击“另存为”,用相同的名称保存它,关闭

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

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

“运行时错误1004:
很抱歉,我们找不到“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