将设置范围从多个工作表复制到新工作表(Microsoft Excel)
Om在同一个工作簿中都有数百个不同名称的工作表。每个工作表的结构基本相同。他想将每个工作表的固定范围(A146:O146)复制到一个新的工作表,一行又一行。
有几种方法可以执行此操作。对我来说,一个简单的宏是最好的选择。但是,在采用基于宏的方法之前,有一种方法可以使用公式来完成。一种相当独特的方法依赖于在名称管理器中定义公式。请按照以下步骤开始:
。显示功能区的“公式”选项卡。
。在“定义的名称”组中,单击“名称管理器”工具。 Excel将显示“名称管理器”对话框。
。单击新建按钮。 Excel将显示“新名称”对话框。 (请参见图1。)
。在名称字段中,输入名称ListSheets(请注意,这是一个单词,没有空格)。
。在“引用到”字段中,输入以下公式:
。单击确定按钮以完成创建命名范围。新范围应出现在“名称管理器”对话框中。
。单击关闭按钮以关闭“名称管理器”对话框。
使用以此方式定义的公式,然后可以转到要合并所有这些范围的工作表。 (假设此工作表的名称为“摘要”。)我强烈建议确保该工作表是工作簿中的最后一个。在“摘要”工作表上,将以下公式放在任何行的A列中:
=INDIRECT(INDEX(ListSheets,ROWS($A$1:$A1))&"!"&CELL("address",A$146))
将公式向下复制,但是代表所有工作表需要很多行。换句话说,如果您有25个工作表(不计算“摘要”工作表),则将公式向下复制24行。计算原始数,现在应该使该公式总共出现25行。
此处的补充说明:ListSheets公式(您在名称管理器中定义的公式)返回工作表名称的数组。 ROWS函数用于确定通过INDEX函数返回该数组的哪个元素。如果您的“摘要”工作表不是工作簿中的最后一个工作表,则ListSheets可以轻松返回该工作表,您最终将从中提取值。毫无疑问,这是您不想做的事情,因此,我建议确保“摘要”是工作簿中的最后一个工作表。
现在,只需将公式从A列复制到右侧,以使它们一直到O列。结果是您将在包含公式的单元格中获得A146:O146的值。
之前我说过,我认为基于宏的方法是最好的选择。
这是一个简短的小宏,它说明了为什么会这样。
Sub CopyRange() Dim w As Worksheet Dim sRange As String Dim lRow As Long sNewName = "Summary" 'Name for summary worksheet sRange = "A146:O146" 'Range to copy from each worksheet Worksheets(1).Select Worksheets.Add ActiveSheet.Name = sNewName lRow = 2 For Each w In Worksheets If w.Name <> sNewName Then 'Comment out the following line if you don't want to 'include worksheet names in the summary sheet Cells(lRow, 1) = w.Name 'If you commented out the previous line, make a change 'in the following line: change (lRow, 2) to (lRow, 1) w.Range(sRange).Copy Cells(lRow, 2) lRow = lRow + 1 End If Next w End Sub
请注意,在宏的开头设置了两个变量(sNewName和sRange)。这些代表您要用于宏创建的新的摘要工作表的名称,以及要从每个工作表复制的单元格范围。
然后,该宏使工作簿中的第一个工作表处于活动状态,并添加了一个用于汇总的新工作表。无论您在sNewName变量中指定了什么名称,此工作表都会被分配。宏然后逐步检查每个其他工作表的循环。只要工作表不是摘要表,就将工作表的名称放在摘要表的A列中,并将sRange变量(A146:O146)中指定的范围复制到摘要工作表中,从B列开始。
宏方法快速简便。另外,如果您需要重做摘要表,只需删除旧的摘要表并重新运行宏即可。
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(9812)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。