首页 > 解决方案 > VBA 疑难解答 - 仅合并选定文件夹中的特定多工作表

问题描述

这段代码有两个问题:

  1. 我想复制特定工作表,而不是工作簿中的所有工作表
  2. 一些源工作簿中有一个宏,这会引发一个“Excel 安全通知”,它会中断代码的执行,并且所有工作表都不会复制

问题 1 目标行为: 我想从文件夹中选择文件并将特定工作表复制到我的报告模板中。此工作表始终位于选项卡位置 1 并始终包含“当前且已关闭”。

使用我在网上找到的以下代码,它可以运行,但会带来源工作簿中的所有工作表,包括隐藏工作表。我只想复制第一个选项卡或包含“当前和关闭”的选项卡。

问题 2 目标行为: 我希望代码忽略/规避安全通知,以便其中包含宏的源工作表的迁移不会中断。我不介意源工作簿中的宏是否被禁用,因为合并报告工作簿中不需要它们

感谢您的集体脑力!


Sub mergeFiles() '将文件夹中的所有文件合并到一个主文件中。' https://professor-excel.com/merge-excel-files-combine-workbooks-one-file/#Method_4_Merge_files_with_a_simple_VBA_macro

'Define variables:
Dim numberOfFilesChosen, i As Integer
Dim tempFileDialog As FileDialog
Dim mainWorkbook, sourceWorkbook As Workbook
Dim tempWorkSheet As Worksheet

Set mainWorkbook = Application.ActiveWorkbook
Set tempFileDialog = Application.FileDialog(msoFileDialogFilePicker)

'Allow the user to select multiple workbooks
tempFileDialog.AllowMultiSelect = True

numberOfFilesChosen = tempFileDialog.Show

'Loop through all selected workbooks
For i = 1 To tempFileDialog.SelectedItems.Count

    'Open each workbook
    Workbooks.Open tempFileDialog.SelectedItems(i)

    Set sourceWorkbook = ActiveWorkbook

    'Copy each worksheet to the end of the main workbook
    For Each tempWorkSheet In sourceWorkbook.Worksheets
        tempWorkSheet.Copy after:=mainWorkbook.Sheets(mainWorkbook.Worksheets.Count)
    Next tempWorkSheet

'Close the source workbook without saving changes in the source workbooks
sourceWorkbook.Close savechanges:=False

Next i

结束子

标签: excelvba

解决方案


要禁止警告,请关闭警报,以只读方式打开工作簿并且不要更新链接:

        Application.DisplayAlerts = False
        Workbooks.Open tempFileDialog.SelectedItems(i), False, True 

要仅对特定工作表执行操作,请For...next根据您的优先级在循环中添加条件检查,“当前和已关闭”的优先级是否高于第一个选项卡,或者您要复制两者。要检查工作表名称,使用tempWorkSheet.NameInstr()函数检查它是否包含“当前和关闭”。

请记住通过以下方式在函数结束时重新启用警报:

Application.DisplayAlerts = True

推荐阅读