Excel:使用其他工作表中的某些单元格创build摘要工作表
我有一大堆标签共享一个标准的结构。 在每个标签的单元格A1,B1,C1中,分别有一个ID号码,一个名字和一个姓氏。 每个选项卡上还有一些与该问题无关的其他信息。
我想创build一个摘要选项卡,其中一个3列表只包含ID号,名字和姓氏从每个其他选项卡。 再次,这些总是在单元格A1,B1,C1。 我还希望汇总表中的ID号超链接到相应的选项卡。
有没有什么办法半自动使用单元格引用? 就像在单个表格中一样,如果在单元格中input数字并向下拖动,则数字将在列中的每个连续单元格中递增。 有什么办法来达到类似的效果,但是单元格的引用保持不变(总是单元格A1,A2,A3),并且TAB引用是递增的? 总之,有没有什么办法可以把一个特定的行绑定到一个单独的选项卡上(同样也会照顾到超链接)? 或者我必须手动input每个表的参考?
并不是标签页没有标签1,2页等等,他们会贴上他们所持信息的人的名字。
[EDIT: Added ASAP option]
ASAP公用事业努力解决这个问题
- 下载ASAP公用程序, http://www.asap-utilities.com/
- 按照下面的屏幕截图1运行该实用程序
- select是否需要实时链接摘要或硬编码报告(截图2)
尽快设置
在表格中selectA1:C1
产量
[Initial Post]
你可以做到这一点,而无需连续的VBA子
步骤1
定义一个范围名称来包含所有的表格名称( 来自David Hager的这个很好的例子)
在这个例子中我使用了AllSheets
参考
=RIGHT(GET.WORKBOOK(1),LEN(GET.WORKBOOK(1))-FIND("]",GET.WORKBOOK(1)))
第2步
使用INDEX公式来提取汇总表中的每个唯一表单
=IF(ROW()<=COUNTA(AllSheets),INDEX(AllSheets,ROW()),"")& LEFT(RAND(),0)
假设你的汇总表在最左边(即表1),则ROW()将在A2中为2,所以这将从AllSheets
第二个表
ROW()将在A3中为3,所以这将从AllSheets
等拉第三张
LEFT(RAND(),0)
确保在任何工作表名称被更改后,工作表名称列表立即更新(并且VBA解决scheme需要监控工作表名称的更改)
第3步
使用INDIRECT为每张纸拉出A1,B1和C1 =IF($A2<>"",INDIRECT("'"&$A2&"'!"&B$1),"")
将此B2公式向右或向下复制,只要您期望potental表名称
请注意,这个公式处理'
与空格等表名发生
您可能可以使用INDIRECT
function 。 例如,要获取表单John上的单元格A1的值,可以调用:
=INDIRECT("John!A1")
所以在你的情况下,你可以在摘要选项卡的单元格A1中,在摘要选项卡的单元格B1中的“A1”和单元格C1中放入“John”,把下面的公式:
=INDIRECT("'"A1&"'!"&B1)
没有内置到Excel中的函数,它将为您提供工作簿中的所有工作表名称。 为此,你将不得不转向Excel中内置的脚本工具VBA。 如果您使用的是Office 2007或更高版本,则需要使用特殊格式存储工作簿。 另外,为了执行macros,用户必须特别允许macros执行。 下面的macros将允许您打印第一列中的所有工作表名称。 需要注意的一点是,这些代码必须在汇总表的代码窗口中执行。
Sub SheetNames() For i = 1 To Sheets.Count Cells(i, 1) = Sheets(i).Name Next i End Sub
获取工作表的名称之后,可以使用以下公式dynamic链接到工作表中的单元格:
=INDIRECT(ADDRESS(1, 1, 1, 1, A1)) =INDIRECT(ADDRESS(1, 2, 1, 1, A1)) =INDIRECT(ADDRESS(1, 3, 1, 1, A1))
INDIRECT公式需要一个地址。 ADDRESS公式的工作方式如下ADDRESS(Row_num,Column_num,Abs_num,A1,Sheet_text)。 Excel帮助将能够回答任何问题。
你可以设置公式,只有在有很多新的工作表时才运行macros。 工作簿可以存储没有macros。 只要将macros保存在某个文本文件中,以防再次使用。
这是一个使用VBA UDF获取表名的解决scheme。 它包含一个超链接。
对UDF的调用被放置在一列之外。 这个例子我用过H
将这些函数放在单元格A1,B1,C1,H1中
A1: =IF(H1<>"",HYPERLINK(SUBSTITUTE(H1,"]","]'")&"'!A1",INDIRECT("'"&$H1&"'!R1C[0]",FALSE)),"")
B1和C1: =IF($H1<>"",INDIRECT("'"&$H1&"'!R1C"&COLUMN(),FALSE),"")
H1: =SheetByIndex()
把它放在一个VBA模块中
Function SheetByIndex() As Variant Application.Volatile Dim r As Range Dim shIdx As Long Dim ThisShIndex As Long Dim sh As Worksheet Dim wb As Workbook Set r = Application.Caller ThisShIndex = r.Worksheet.Index shIdx = r.Row If shIdx >= ThisShIndex Then shIdx = shIdx + 1 End If Set wb = r.Worksheet.Parent On Error Resume Next Set sh = wb.Worksheets(shIdx) If Err.Number <> 0 Then SheetByIndex = "" Else SheetByIndex = "[" & wb.Name & "]" & sh.Name End If End Function
将A,B,C,H中的公式按照要求复制下来
基于这里发布的代码 ,我的方法略有不同( 这里也有一个样例表用于testing):
Option Explicit Sub CreateHyperlinkedSheetList() 'Author: Jerry Beaucaire 'Date: 1/3/2011 Dim ws As Worksheet, NR As Long Application.ScreenUpdating = False With ActiveSheet NR = .Range("A" & Rows.Count).End(xlUp).Row + 1 For Each ws In ActiveWorkbook.Worksheets If ws.Name <> .Name Then .Range("A" & NR).Value = ws.Range("A1").Value .Hyperlinks.Add Anchor:=.Range("A" & NR), Address:="", SubAddress:= _ "'" & ws.Name & "'!A1", TextToDisplay:=ws.Name .Range("B" & NR).Value = ws.Range("B1").Value .Range("C" & NR).Value = ws.Range("C1").Value NR = NR + 1 End If Next ws End With Application.ScreenUpdating = True End Sub