Excel 文件打开不一致

Excel 文件打开不一致,excel,vba,Excel,Vba,我正在使用代码打开文件夹中以特定前缀开头的所有文件: folder = "C:\Users\xxx\Documents\Exception Reports\" pref = "blah blah prefix" file = pref & "*.xls" exPath = folder & file filename = Dir(exPath) Do While filename <> "" Workbooks.Open (filename) ...

我正在使用代码打开文件夹中以特定前缀开头的所有文件:

folder = "C:\Users\xxx\Documents\Exception Reports\"
pref = "blah blah prefix"
file = pref & "*.xls"
exPath = folder & file
filename = Dir(exPath)

Do While filename <> ""
    Workbooks.Open (filename)
    ...
    Workbooks(filename).Close SaveChanges:=False
    filename = Dir()
Loop
folder=“C:\Users\xxx\Documents\Exception Reports\”
pref=“诸如此类的前缀”
file=pref&“*.xls”
exPath=文件夹和文件
filename=Dir(exPath)
文件名“”时执行此操作
工作簿.打开(文件名)
...
工作簿(文件名)。关闭保存更改:=False
filename=Dir()
环
打开宏后第一次运行代码时,我得到“很抱歉,我们找不到-filename-。它可能被移动、重命名或删除了吗?”但-filename-它打印的是我希望打开的文件,我只指定了我想要的前缀和文件扩展名,因此,在我看来,如果它知道完整的文件名,它会发现它很好。另外,如果我在声明filename变量和启动Do While循环之间放入一个消息框,消息框将打印我希望它打开的正确文件名

如果我将一个新文件保存到文件夹中,并将其命名为“AA.xls”,然后让程序在文件夹中循环(而不是指定前缀),然后返回并指定前缀,它工作正常,并继续工作,直到我关闭程序并重新打开,整个过程都重新开始。但是,此过程仅在我将新文件保存到该文件夹时有效。如果我试图将“AA.xls”文件保留在文件夹中,则该文件的错误与其他文件相同


谢谢你的意见

尝试使用CMD方法,看看是否会遇到同样的问题,如果是,则很可能是权限问题:

Sub SO()

Const folder    As String = "C:\Users\xxx\Documents\Exception Reports\"
Const pref      As String = "blah blah prefix"
Dim file        As String
Dim exPath      As String
Dim fileName    As Variant

file = pref & "*.xls": exPath = folder & file

For Each fileName In _
    Filter(Split(CreateObject("WScript.Shell").Exec("CMD /C DIR """ & exPath & """ /B /A:-D").StdOut.ReadAll, vbCrLf), ".")

    Workbooks.Open CStr(folder & fileName)
        '// Do code here
    Workbooks(fileName).Close False

Next fileName

End Sub

在我看来,这不是你自己的个人资料文件夹,你可能会遇到权限问题。这很有效,谢谢!您能解释一下在“过滤器”行中执行的操作吗?当然,
WScript.Shell
对象正在创建输出(本例中为文件列表)。
Split()。最后,
Filter()
方法根据数组中包含句号(由于扩展名,文件路径将具有句号)的项过滤数组中的每个项。过滤的原因是
Split()
方法在数组中留下一个空字符串作为最后一项,这将导致错误,因此我们过滤掉这个空字符串,并循环遍历其余的字符串。希望这是有道理的…是的。我唯一悬而未决的问题是“/B/A:-D”部分的作用。这些是“开关”,用作命令行参数的一部分,用于指定我们需要的输出
/B
表示
Basic
,它确保我们只获取文件名(并且在返回的文本中不包含特殊信息)
/A:
属性
开关,并接受各种参数,在本例中,我使用了
-D
目录
开关,并继续执行
-
,它告诉CMD不要包含和目录路径(这实际上是多余的,因为我们不检查子文件夹,所以它无论如何也找不到任何目录)