【发布时间】:2017-07-19 09:26:55
【问题描述】:
我正在编写一些 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
我已经进行了一些调试以弄清楚会发生什么,我会被 d*mned 但 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_Sputnik\T\Pony_New_building_YYYYpp_\Komplettlista_Mamma mu.xlsx VBA 同意我的观点,因为它抱怨在尝试打开它时找不到它。
我可以通过提取子字符串来解决这个问题,但 imo 它不是很整洁。然而,我的问题是;
为什么会这样?
我找到了该文件的确切位置,并且没有名称相似的隐藏文件。 Windows 是不是在捉弄我?
【问题讨论】:
-
~$文件只是在您打开工作簿(或其他人打开工作簿时)创建的临时锁定文件。当工作簿关闭时,它们应该再次被删除,但有时如果 Excel 崩溃或类似情况,它们仍然存在。 (注意:临时文件只是虚拟文件,或者它们可能包含打开文件的用户 ID,但它们不是 Excel 工作簿 - 所以其中的Open将失败。) -
好的,所以当我遍历 Folder.Files 中的每个文件时,我会使用它。Windows 正在为该文件临时创建一个锁?因此,当在文件名的其余部分中找到匹配时,返回的名称就是该名称。
-
否 - 仅当文件当前在 Excel 中打开(例如您的宏所在的文件)或之前在 Excel 中打开但未正确关闭时,才会创建锁定文件。您的代码只是在没有实际打开文件的情况下迭代目录中的文件 - 所以您应该看到的文件与您在 Windows 资源管理器中查看文件夹时看到的文件相同(假设我们启用了“显示隐藏文件”)。
标签: windows excel file filesystems vba