【问题标题】:Excel - VBA Question. Need to access data from all excel files in a directory without opening the filesExcel - VBA 问题。需要在不打开文件的情况下访问目录中所有excel文件的数据
【发布时间】:2015-03-29 02:57:09
【问题描述】:

所以我有一个“主”excel 文件,我需要用目录中的 excel 文件中的数据填充该文件。我只需要访问每个文件并从每个工作簿的第二张表中复制一行并将其粘贴到我的主文件中,而无需打开 Excel 文件。

我不是这方面的专家,但我可以处理一些中间宏。我需要的最重要的事情是能够在不打开它们的情况下逐个访问每个文件。我真的需要这个,所以任何帮助表示赞赏!谢谢!

编辑...

所以我一直在尝试使用 dir 函数循环遍历目录,但我不知道如何从第一个文件继续。我在一个网站上看到了这个,但对我来说,循环不会停止,它只会访问目录中的第一个文件。

Folder = "\\Drcs8570168\shasad\Test"
    wbname = Dir(Folder & "\" & "*.xls")

    Do While wbname <> ""

i = i + 1
ReDim Preserve wblist(1 To i)
wblist(i) = wbname
wbname = Dir(FolderName & "\" & "*.xls")

wbname 如何在文件列表中下移?

【问题讨论】:

  • 您的意思是不在Excel中打开文件,还是根本不打开文件?我认为后者在计算世界中没有任何意义(请纠正我)。如果是前者,那为什么不希望在 Excel 中打开文件,为什么最好以非 Excel 方式打开?
  • 我需要浏览几百个文件,所以我不希望它们打开和关闭。
  • 我不知道为什么当它在这里仍在进行时被转移到一个新问题?此外,您接受的这篇文章中的链接方法是我之前提出的帖子(point3)的一部分,所以我认为将来您在关闭解决方案时可能需要更加小心:)
  • 嗨,我不认为我自己关闭了任何东西,但我将某些内容移至新问题的唯一原因是因为我无法在评论部分输入我想知道的代码,我可以也发布一个新的答案。

标签: database excel vba file


【解决方案1】:

不必必须打开文件(ADO 可能是一个选项,使用代码创建链接或使用 ExecuteExcel4Macro)通常使用代码打开文件是最灵活和最简单的方法。

  1. Copy a range from a closed workbook (ADO)
  2. ExecuteExcel4Macro
  3. Links method

但是你为什么不想打开文件 - 这真的是一个硬约束吗?

Macro to loop through all sheets that are placed between two named sheets and copy their data to a consolidated file 中的代码将文件夹中每个工作簿的所有工作表中的所有数据拉到一起(通过在后台打开文件)。

如果您对这个过程感到满意,它可以很容易地调整为仅工作表 2 的 X 行

【讨论】:

  • 记住 - ADO 也“打开”文件 :)
  • 他们在某种程度上打开了文件!
  • 我有大约 750 个文件需要从中提取数据,因此我不希望它们在运行宏时打开和关闭
  • 看 - 有有效的方法来读取文件,也有效率较低的方法。我什至给了你一个名为“GetInfoFromClosedFile()”的函数的链接。但是...要阅读文件,您必须打开文件。隐式或显式。有效率,或者效率较低。但是,如果您认为您甚至可以在没有“隐式打开”的情况下逃脱,那您就是在自欺欺人。
  • 我不确定当您从中提取数据时文件在技术上打开的不同方式,但我只是说我不希望在获取信息时打开窗口.
【解决方案2】:

我只想指出:您并不严格需要 VBA 从已关闭的工作簿中获取值。您可以使用如下公式:

='C:\MyPath\[MyBook.xls]Sheet1'!$A$3

您也可以在 VBA 中实现这种方法:

Dim rngDestinationCell As Range
Dim rngSourceCell As Range
Dim xlsPath As String
Dim xlsFilename As String
Dim sourceSheetName As String

Set rngDestinationCell = Cells(3,1) ' or Range("A3")
Set rngSourceCell = Cells(3,1)
xlsPath = "C:\MyPath"
xlsFilename = "MyBook.xls"
sourceSheetName = "Sheet1"

rngDestinationCell.Formula = "=" _
    & "'" & xlsPath & "\[" & xlsFilename & "]" & sourceSheetName & "'!" _
    & rngSourceCell.Address

其他答案也提供了很好的解决方案,也许比这更优雅。

【讨论】:

  • 嘿,我喜欢这段代码的简单性,因为我不是专家,但我想知道如何将其应用于该目录中的所有文件并将信息粘贴到单独的行中。您能否更彻底地解释最后一行?我只是不太了解这部分“'!” & _ rngSourceCell.Address 谢谢
  • 整个语句只是我试图构造字符串'C:\MyPath\[MyBook.xls]Sheet1'!$A$3...
  • 我以前从未做过这样的代码,所以刚开始使用它时遇到了很多麻烦。我想我必须将“* .xls”作为文件名并以某种方式将其变成一个循环,但我不知道如何。很抱歉要求这么多,但我在这里挣扎。
  • 太长,无法在评论中回答。请发布一个新问题。
【解决方案3】:

brettdjpaulsm4 答案提供了很多信息,但我仍然想添加 我的 2 美分

正如 iDevlop 在此线程 (Copy data from another Workbook through VBA) 中回答的那样,您也可以使用 GetInfoFromClosedFile()

【讨论】:

    【解决方案4】:

    我的 Excel 类包装器中的一些内容:

    Dim wb As Excel.Workbook
    Dim xlApp As Excel.Application
    
    Set xlApp = New Excel.Application
    xlApp.DisplayAlerts = False  ''# prevents dialog boxes
    xlApp.ScreenUpdating = False ''# prevents showing up
    xlApp.EnableEvents = False   ''# prevents all internal events even being fired
    
    ''# start your "reading from the files"-loop here
        Set wb = xlApp.Workbooks.Add(sFilename) '' better than open, because it can read from files that are in use
    
        ''# read the cells you need...
        ''# [....]
    
        wb.Close SaveChanges:=False     ''# clean up workbook
    ''# end your "reading from the files"-loop here
    
    ''# after your're done with all files, properly clean up:
    xlApp.Quit
    Set xlApp = Nothing
    

    祝你好运!

    【讨论】:

      【解决方案5】:

      在宏的开头添加

      Application.ScreenUpdating = false
      

      然后在最后

      Application.ScreenUpdating = True
      

      当宏执行其功能时,您不会看到任何文件打开。

      【讨论】:

      • 虽然是一个有趣的解决方法,但可能不是 OP 想要的,因为该文件仍需要在 Excel 中打开。
      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 2010-11-23
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多