Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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
Windows Excel VBA打开文件错误1004,前缀为~$&引用;_Windows_Excel_File_Filesystems_Vba - Fatal编程技术网

Windows Excel VBA打开文件错误1004,前缀为~$&引用;

Windows Excel VBA打开文件错误1004,前缀为~$&引用;,windows,excel,file,filesystems,vba,Windows,Excel,File,Filesystems,Vba,我正在编写一些VBA来优化Excel 2013中的工作流,我正在使用Windows 10计算机。 我使用一个简单的递归过程遍历文件结构,查找文件名中的特定内容,如下所示: Function filePathToList(fileStart As String, firstString As String, secondString As String) As String Dim FileSystem As Object Dim HostFolder As String HostFolder

我正在编写一些VBA来优化Excel 2013中的工作流,我正在使用Windows 10计算机。 我使用一个简单的递归过程遍历文件结构,查找文件名中的特定内容,如下所示:

Function filePathToList(fileStart As String, firstString As String, secondString As String) As String
Dim FileSystem As Object
Dim HostFolder As String

HostFolder = fileStart
Set FileSystem = CreateObject("Scripting.FileSystemObject")

filePathToList = DoFolder(FileSystem.GetFolder(HostFolder), LCase(firstString), LCase(secondString))
End Function

Function DoFolder(Folder, firstString As String, secondString As String) As String
Dim SubFolder
For Each SubFolder In Folder.SubFolders
    DoFolder = DoFolder(SubFolder, firstString, secondString)
Next
Dim File
For Each File In Folder.Files
    If (InStr(1, LCase(File.name), firstString) > 0) And (InStr(1, LCase(File.name), secondString) > 0) Then
        DoFolder = Folder.Path & "\" & File.name
        Debug.Print DoFolder
        Debug.Print File.name
        Debug.Print File
        Exit Function
    End If
Next
End Function
我已经进行了一些调试,以了解发生了什么,我将被删除,但VBA决定将“~$”作为前缀添加到我找到的文件中:

X:\05_Sputnik\T\Pony\_New_building_YYYYpp_\~$Komplettlista_Mamma mu.xlsx
~$Komplettlista_Mamma mu.xlsx
X:\05_Sputnik\T\Pony\_New_building_YYYYpp_\~$Komplettlista_Mamma mu.xlsx
在我看来,完整的路径是: X:\05\u Sputnik\T\Pony\u New\u building\u YYYYpp\uKomplettlista\u Mamma mu.xlsx VBA同意我的观点,因为它抱怨在试图打开它时找不到它

我可以通过提取子字符串来解决这个问题,但在我看来,它不是很整洁。但我的问题是,

为什么会发生这种情况?


我找到的文件正是预期的位置,并且没有类似名称的隐藏文件。Windows是在捉弄我吗?

如果您想忽略隐藏文件(例如打开文档时Office应用程序生成的锁定文件),最好修改您的行

If (InStr(1, LCase(File.name), firstString) > 0) And (InStr(1, LCase(File.name), secondString) > 0) Then
还要测试文件是否未隐藏,例如

If (InStr(1, LCase(File.name), firstString) > 0) And _
   (InStr(1, LCase(File.name), secondString) > 0) And _
   Not (File.Attributes And vbHidden) Then

~$
文件只是在您打开工作簿(或其他人打开工作簿)时创建的临时锁定文件。当工作簿关闭时,它们应该再次被删除,但有时如果Excel崩溃或类似情况,它们会保留下来。(注意:临时文件只是虚拟文件,或者它们可能包含打开文件的用户ID,但它们不是Excel工作簿-因此其中一个
打开
将失败。)好的,所以我在迭代文件夹中的每个文件时会使用它。文件Windows正在临时为该文件创建锁吗?因此,当在文件名的其余部分中找到匹配项时,返回的名称为。否-仅当文件当前在Excel中打开(例如宏所在的文件)或以前在Excel中打开但未正确关闭时,才会创建锁定文件。您的代码只是在目录中的文件上进行迭代,而没有实际打开文件-因此您应该只看到与在Windows资源管理器中查看文件夹时相同的文件(假设启用了“显示隐藏文件”)。