【问题标题】:Copying a sheet from Multiple Workbooks grouped in a folder to a master file将工作表从文件夹中分组的多个工作簿复制到主文件
【发布时间】:2019-09-23 15:01:49
【问题描述】:

我目前在我的桌面上有一个名为 Files 的文件夹,其中包含多个彼此相似的工作簿,例如:

  • 工作簿1
  • 工作簿2
  • 工作簿3
  • 工作簿4
  • 工作簿5

这些工作簿中的每一个都包含一个名为“仪表板”的工作表,它们彼此相同,但它们为不同的人提供不同的数据。

我想做的是:

  • 运行一个宏,将所有名为“仪表板”的工作表导入到我现在打开的新工作簿中。
  • 以导入的文件命名每个导入的工作表。

我对此进行了研究,尽管已经提供了许多解决方案,但我发现最接近我需要的代码是:

Sub MergeWorkbooks()

Dim xStrPath As String
Dim xStrFName As String
Dim xWS As Worksheet
Dim xMWS As Worksheet
Dim xTWB As Workbook
Dim xStrAWBName As String
On Error Resume Next
xStrPath = "C:\Users\Me\Desktop\Files"
xStrFName = Dir(xStrPath & "*.xlsx")
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set xTWB = ThisWorkbook
Do While Len(xStrFName) > 0
    Workbooks.Open Filename:=xStrPath & xStrFName, ReadOnly:=True
    xStrAWBName = ActiveWorkbook.Name
    For Each xWS In ActiveWorkbook.Sheets
    xWS.Copy After:=xTWB.Sheets(xTWB.Sheets.Count)
    Set xMWS = xTWB.Sheets(xTWB.Sheets.Count)
    xMWS.Name = xStrAWBName & "(" & xMWS.Name & ")"
    Next xWS
    Workbooks(xStrAWBName).Close
    xStrFName = Dir()
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

当我尝试运行它时,没有遇到任何错误,也没有任何反应。有谁知道为什么会这样?

提前致谢

【问题讨论】:

  • On Error Resume Next 告诉 VBA 忽略任何错误并继续进行,因此在运行代码时没有看到任何错误也就不足为奇了。注释掉那一行,然后看看你的代码运行时会发生什么。如果您遇到错误,请编辑您的问题以添加错误消息并注意单击“调试”时突出显示的行
  • 感谢您的评论,虽然我是 VBA 新手,但我应该了解这一点,我按照您的建议做了并注释掉了该行,然后我重新测试了它,仍然没有错误,也没有发生任何事情。然后我引入了一些错误以确保编译器正常工作并且它们立即标记出来。
  • 试试xStrPath = "C:\Users\Me\Desktop\Files\"(添加最后的反斜杠)
  • 哇,非常感谢,这似乎让它工作了,当其他人查看时真的很有帮助。但是,这确实会导入所有工作表,您知道我如何修改它以仅从每个名为“仪表板”的工作簿中导入工作表
  • 虽然这不是您要求的,但您可以查看#PowerQuery,它可以将来自保存在同一文件夹中的不同工作簿的同一工作表中的数据合并。如果你有兴趣,你可以谷歌一些教程,如果还有问题,你可以在这里寻求帮助。

标签: excel vba excel-formula


【解决方案1】:

未经测试:

Sub MergeWorkbooks()

    Dim xStrPath As String
    Dim xStrFName As String
    Dim xWS As Worksheet
    Dim xMWS As Worksheet
    Dim xTWB As Workbook, wb As Workbook
    Dim xStrAWBName As String

    xStrPath = "C:\Users\Me\Desktop\Files\" '<< add final \
    xStrFName = Dir(xStrPath & "*.xlsx")

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set xTWB = ThisWorkbook 

    Do While Len(xStrFName) > 0
        Set wb = Workbooks.Open(Filename:=xStrPath & xStrFName, ReadOnly:=True) '<< get a direct reference
        'copy only the specific sheet
        wb.Worksheets("Dashboard").Copy after:=xTWB.Sheets(xTWB.Sheets.Count)
        xTWB.Sheets(xTWB.Sheets.Count).Name = Replace(xStrFName, ".xlsx", "")
        wb.Close False 'don't save
        xStrFName = Dir()
    Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

【讨论】:

  • 我可以确认这是可行的,但无论如何都会修改代码,以便它复制工作表但只复制单元格中的值。源表包含复制时会导致错误的公式,理想情况下我只需要格式和单元格值。
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多