【问题标题】:Consolidating one sheet from each workbook in a folder into one workbook using VBA使用VBA将文件夹中每个工作簿中的一张工作表合并到一个工作簿中
【发布时间】:2022-12-14 23:47:12
【问题描述】:

我的任务是将每个工作簿中的一张工作表(数量可能不同)从一个文件夹合并到一个主工作簿中。

每个工作簿都基于一个模板,所以它们看起来都一样,每个都有两张纸。

我需要复制其中一张名为“填写”的表格。

结果应该是:主数据工作簿,其中包含与文件夹中的文件一样多的工作表,并且每个工作表都包含“填写”工作表中的数据。

Sub MergeWorkbooks()

Dim FolderPath As String
Dim File As String

FolderPath = "C:\Users\" & Environ("username") & "\Downloads\BH\"

File = Dir(FolderPath)

Do While File <> ""

    Workbooks.Open FolderPath & File
    ActiveWorkbook.Worksheets("Fill this out").Copy _
      after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    ActiveSheet.Name = File
    Workbook.Close FolderPath & File
            
    File = Dir()

Loop

End Sub 

这将复制第一个文件,然后弹出错误 400。

此外,新的工作表名称是:“填写”而不是文件名。

【问题讨论】:

  • 至少存在一个不一致之处:Workbook.Close FolderPath &amp; File > Workbook 不是 VBA 可识别的函数/命令。
  • 你好@ALeXceL 最初我的命令是Workbook(File).Close 但是这个改变给我错误:编译错误:子或函数未定义。
  • 因为 Workbook 在 Excel VBA 中不作为对象或命令存在。它是一个变量类型。听起来您想关闭该工作簿:Workbooks(File).Close savechanges:=False
  • 始终在代码模块的开头使用“Option Explicit”,以便 VBE 立即标记此类问题。

标签: excel vba


【解决方案1】:

您可以使用此代码打开该文件夹中的文件,并关闭每个文件以消除各自的保存事件。注意 "*.xl*" 过滤器只允许打开 Excel 文件:

Option Explicit

Sub MergeWorkbooks()
    Dim FolderPath As String
    Dim File As String

    FolderPath = "C:Users" & Environ("username") & "DownloadsBH"

    File = Dir(FolderPath & "*.xl*")

    Do While File <> ""

        Workbooks.Open FolderPath & File
        ActiveWorkbook.Worksheets("Fill this out").Copy _
            after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
        ActiveSheet.Name = File
        Workbooks(File).Close savechanges:=False
            
        File = Dir()

    Loop

End Sub

编辑

试试这个修改后的代码,它更自信地处理源工作簿(设置工作簿对象):

Option Explicit

Sub MergeWorkbooks()
    Dim FolderPath As String
    Dim File As String
    Dim objWB As Excel.Workbook

    FolderPath = "C:Users" & Environ("username") & "DownloadsBH"

    File = Dir(FolderPath & "*.xl*")

    Do While File <> ""

        Set objWB = Workbooks.Open(FolderPath & File)
       
        If Not objWB Is Nothing Then
            objWB.Worksheets("Fill this out").Copy _
                after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
            ThisWorkbook.Sheets("Fill this out").Name = File
            objWB.Close savechanges:=False
        End If
   
        File = Dir()

    Loop

End Sub

【讨论】:

  • 这仍然不起作用。工作簿没有关闭。我收到错误 400 或应用程序定义或对象定义的错误。 1004
  • 您是否正确更改了 VBE 上的代码?在这里它运行正常。使用 F8(而不是 F5)运行代码,当代码停止时,单击“调试”按钮以查看失败的那一行。然后,您可以检查哪里出了问题,检索传递的变量的值,也许可以打开“本地”窗口,以获得变量和对象的概览。
  • 请看看我编辑的帖子。
  • 你好@ALeXcel 我想我已经找到问题的根源 :) 文档名称有问题。一旦我更改了文件的名称,它就起作用了!太感谢了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
相关资源
最近更新 更多