【问题标题】:Excel VBA Open File Error 1004 After prefixing "~$"Excel VBA打开文件错误1004前缀“〜$”后
【发布时间】: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


【解决方案1】:

如果您想忽略隐藏文件(例如打开文档时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

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多