Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
Excel VBA在工作簿中引发缓存问题错误1004。是否打开?_Vba_Excel - Fatal编程技术网

Excel VBA在工作簿中引发缓存问题错误1004。是否打开?

Excel VBA在工作簿中引发缓存问题错误1004。是否打开?,vba,excel,Vba,Excel,我通过打开一个文件并使用.xlsm文件运行一系列代码来运行vba代码。我正在使用以下代码打开excel文件: Dim sPath As String, sName As String sPath = ThisWorkbook.Path & "\" sName = Dir(sPath & "*cash*.xls?") If sName <> "" Then With Workbooks.Open(sName) .Worksheets("She

我通过打开一个文件并使用.xlsm文件运行一系列代码来运行vba代码。我正在使用以下代码打开excel文件:

Dim sPath As String, sName As String

sPath = ThisWorkbook.Path & "\"
sName = Dir(sPath & "*cash*.xls?")

If sName <> "" Then
    With Workbooks.Open(sName)
        .Worksheets("Sheet1").Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
        .Close SaveChanges:=False
        ActiveSheet.Name = "Cash & CC Sales"
    End With
End If
Dim sPath4 As String, datePath4 As String

datePath4 = Replace(Worksheets("Dashboard").Range("N2").Value, "/", "-")

sPath4 = ThisWorkbook.Path & "\Dashboard " & datePath4 & ".xls"

ActiveWorkbook.SaveAs Filename:=sPath4, FileFormat:=xlNormal

End Sub
这是第一次奏效。当我重新打开.xlsm文件一段时间后再次运行代码时,它抛出了一个错误1004,说它找不到文件“Cash Listing.xls”,然而,我从未在vba代码中实际将其定义为该文件名,而是使用了“Cash*.xls?”,这让我相信存在某种缓存问题?这使得它尝试打开一个旧文件。而且,奇怪的是,“cashlisting.xls”实际上确实存在


你知道为什么会出现这种错误,以及如何避免这种错误吗?代码第一次工作并运行,之后,它会抛出错误,解决该错误的唯一方法是创建一个新的.xlsm文件并将代码复制到那里,然后再次运行。

使用您提供的代码,我已设法在本地重新创建错误。看起来,尽管行
sName=Dir(sPath&“*cash*.xls?”)
,您的
sName
-字符串仍然只包含文件名(而不是路径),在您的示例中:
cash list.xls
。如果我正确地阅读了文档,这就是
Dir
-函数的工作方式,因为它返回一个字符串,表示与指定模式或文件属性匹配的文件、目录或文件夹的名称

如果您将代码更改为在工作簿中包含sPath。打开行,这应该可以解决问题。(至少在我本地复制时是这样):

Dim sPath作为字符串,sName作为字符串
sPath=此工作簿。路径&“\”
sName=Dir(sPath和“*现金*.xls?”)
如果我是“”那么
使用工作簿。打开(sPath和sName)
.Worksheets(“Sheet1”).Copy After:=此工作簿.Worksheets(ThisWorkbook.Worksheets.Count)
.Close SaveChanges:=False
ActiveSheet.Name=“现金和抄送销售”
以
如果结束

我不清楚为什么
工作簿.Open(sName)
在创建xlsm文件后立即工作,但是如果上述解决方案解决了您的问题,那么希望这足够好:)

谢谢。奇怪的是,为什么它第一次工作,为什么它说“cashlisting.xls”第二次没有找到,而代码甚至没有定义这个名称,但是你的修复程序工作了——到目前为止还不错。
Dim sPath As String, sName As String

sPath = ThisWorkbook.Path & "\"
sName = Dir(sPath & "*cash*.xls?")

If sName <> "" Then
    With Workbooks.Open(sPath & sName)
        .Worksheets("Sheet1").Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
        .Close SaveChanges:=False
        ActiveSheet.Name = "Cash & CC Sales"
    End With
End If