【问题标题】:Workbooks.Open to open multiple files in turnWorkbooks.Open 依次打开多个文件
【发布时间】:2017-03-28 01:25:50
【问题描述】:

我在“最终文件夹”中有 6 个 Excel 文件。我需要依次打开每个,从运行代码的工作簿中放入一些数据(我使用 ThisWorkbook 作为源代码)。

代码将所有 6 个文件一起打开,而不是依次打开。

似乎在循环中运行Workbooks.Open时,默认打开所有文件。

Sub PopulateFinalFile()

    Dim filpath As String
    Dim fso As Scripting.FileSystemObject
    Dim fil As Scripting.File
    Dim fldr As Scripting.Folder

    filpath = "C:\Users\deepak.ved\Desktop\Reports\Final Reports"
    Set fso = New Scripting.FileSystemObject
    Set fldr = fso.GetFolder(filpath)

    For Each fil In fldr.Files
        Application.Workbooks.Open (fso.GetFile(fil.Path))
    Next fil

End Sub

不相关的问题:如何使用 FSO 指向工作簿。就像我使用getfilefolder.files 一样,它会返回一个路径。当我传递工作簿的路径时,我需要有 workbook.open(path) 但我只想指向该工作簿而不是打开它。

【问题讨论】:

  • 如果你打开多个文件,你需要在你的工作簿中使用MultiSelect。打开代码:Application.Workbooks.Open(fso.GetFile(fil.path), MultiSelect:=True)。此外,当您使用 MultiSelect 时,文件的顺序不再保留,因此您需要提供循环。试试这个帖子寻求帮助 [链接] (stackoverflow.com/questions/25180061/…)
  • 嗨,Jiri,感谢您的快速回复。我会检查这个并让你知道它是否有效:)
  • 创建一个工作簿变量,比如wb,然后在主循环中有Set wb = Application.Workbooks.Open (fso.GetFile(fil.Path))。仍在该循环的主体中,处理wb,然后关闭它。这样,目录中的工作簿将按顺序处理,这似乎是您想要的。这个问题可能会有所帮助:stackoverflow.com/q/5851531/4996248
  • 嘿,我在之前尝试解决问题时尝试了 WB 变量方法,但它似乎返回相同的错误。
  • 对于 Application.workbooks.open 语法,我没有得到多选选项。它反映为语法错误(以红色突出显示)。我正在运行 Windows 8 Office 2013

标签: excel vba


【解决方案1】:

添加到 Vityata 以涵盖问题的第二部分:

Option Explicit

Sub PopulateFinalFile()

    Dim filpath As String
    Dim fso As Scripting.FileSystemObject
    Dim fil As Scripting.File
    Dim fldr As Scripting.Folder
    Dim wb as workbook

    filpath = "C:\Users\user\Desktop\TEST"
    Set fso = New Scripting.FileSystemObject
    Set fldr = fso.GetFolder(filpath)

    For Each fil In fldr.Files
        set wb = Application.Workbooks.Open(fil.Path)  'no space after open !
        'do some stuff with wb
        wb.close    'close wb
    Next fil


End Sub

【讨论】:

    【解决方案2】:

    试试这个:

    Option Explicit
    
    Sub PopulateFinalFile()
    
        Dim filpath As String
        Dim fso As Scripting.FileSystemObject
        Dim fil As Scripting.File
        Dim fldr As Scripting.Folder
    
        filpath = "C:\Users\user\Desktop\TEST"
        Set fso = New Scripting.FileSystemObject
        Set fldr = fso.GetFolder(filpath)
    
        For Each fil In fldr.Files
            Application.Workbooks.Open (fil.Path)
        Next fil
    
    
    End Sub
    

    它应该开始一个一个地打开它们。

    【讨论】:

    • 您好,Vityata,感谢您的帮助。代码运行得很漂亮。只是一个问题,您是否认为“updatelink”属性可能会推动 workbook.open 方法同时打开所有文件。因为当我首先执行您的代码时,它打开了所有文件,但后来我稍微修改它以关闭更新链接,我工作了。但我真诚地感谢您花时间评论和帮助我。 :)
    • 好吧,同上。我想是因为这个(fso.GetFile(fil.Path))
    • 好的。你也可以分享一些关于我的另一个问题的信息。我在这里重复一遍。我有 fso.getfile 生成了一个路径。现在我希望将此文件分配给已声明的 WB 对象,该对象又将仅用作工作簿。 Workbooks.open(fil.path) 确实指向该工作簿,但我不想打开它,我只想将它作为工作簿而不是 fso 文件指向。
    • 另外,我不知道我是否会因为另一个问题太过分了。如果我想用它来引用给定路径上的工作簿,我现在有一个循环计数器会生成一个数字。例如文件夹 x 有 6 个 excel 工作簿我想引用第 N 个(由循环计数器决定)文件,这不起作用 application.workbooks.open(loopcounter) 因为没有提到源路径
    • 我现在真的要站起来了,但是你为什么不在StackOverflow中单独问呢?只要你描述得好,你很可能会得到一个很好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2014-12-29
    相关资源
    最近更新 更多