【问题标题】:Excel Index / Table of Contents - MacroExcel 索引/目录 - 宏
【发布时间】:2015-01-30 22:43:16
【问题描述】:

我正在阅读一些使用宏自动创建目录的代码。我有一个包含多张工作表的工作簿,并且每天都在添加新工作表。每个工作表名称都是一个唯一编号,并且内部具有相同的模板。

我看到的代码只会提供将索引与工作表名称进行比较的选项。

我想知道我是否可以得到一个选项,该选项也可以从每张表中提取一个或两个值,如下所示:

Sr No. Sheet Name 单元格 A1 单元格 A2 单元格 A3

每次打开索引工作表时,我都需要运行宏,并且工作表名称列要超链接到工作表。

有什么想法吗?

提前感谢您的帮助!

【问题讨论】:

  • 您自己尝试过什么吗?你所要求的很容易做到,特别是如果你有一些启动代码+正在运行的宏记录器。
  • 我没有 VBA 的工作知识。我唯一尝试过的是谷歌和这段代码:excelzoom.com/2009/03/…

标签: vba excel


【解决方案1】:

此代码基于http://www.ozgrid.com/VBA/sheet-index.htm 多年以来。

在修改后的代码中,第 1 列将包含工作表索引,第 2 列将显示所有工作表的单元格 A2 和 A3 的提取。小心,索引表第1、2、3列的旧内容会被彻底抹掉!!!

Private Sub Worksheet_Activate()

  Dim wSheet As Worksheet

  Dim i As Long

  i = 1
  With Me
    .Columns(1).ClearContents
    .Columns(2).ClearContents
    .Columns(3).ClearContents
    .Cells(1, 1) = "INDEX"
    .Cells(1, 1).Name = "Index"
  End With

  For Each wSheet In Worksheets

    If wSheet.Name <> Me.Name Then
      i = i + 1
      '
      ' in the WorkSheet: set up link to return to the index sheet from:
      '
      With wSheet
        .Range("A1").Name = "Start" & wSheet.Index
        .Hyperlinks.Add Anchor:=.Range("A1"), Address:="", _
          SubAddress:="Index", TextToDisplay:="Back to Index"
      End With
      '
      ' in the Index WorkSheet: set up link to go to WorkSheet:
      '
      Me.Hyperlinks.Add Anchor:=Me.Cells(i, 1), Address:="", _
        SubAddress:="Start" & wSheet.Index, _
        TextToDisplay:=wSheet.Name
      '
      Me.Cells(i, 2).Value = wSheet.Range("A2").Value
      Me.Cells(i, 3).Value = wSheet.Range("A3").Value
      '
    End If

  Next wSheet

End Sub

【讨论】:

  • 嗨,Jacouh,这很好用!万分感谢!就一件事。我们可以将 Cell A2 和 A3 收集到的信息放在不同的单元格中吗?
  • 您可以通过修改 .Columns(2).ClearContents, Me.Cells(i, 2).Value = 将列索引值从 2 更改为 3, 4, 5 ...
  • 我将 Me.Cells(i, 2).Value = wSheet.Range("A2").Value _& " " & wSheet.Range("A3").Value 更改为 Me.Cells( i, 2).Value = wSheet.Range("A2").Value _Me.Cells(i, 3).Value = wSheet.Range("A3").Value 但它给了我一个错误
  • 我认为我的评论不是很清楚。我需要一个单元格中的单元格 A2 和另一个单元格中的单元格 A3 中的数据。
  • 非常感谢!现在完美了!
【解决方案2】:

我在没有 VBA 的情况下执行此操作。这将创建一个自填充索引表,从每个工作表中提取信息。

  1. Name Manager 中创建一个名为wshNamesNew Name,其值为:=RIGHT(GET.WORKBOOK(1),LEN(GET.WORKBOOK(1))-FIND("]",GET.WORKBOOK(1)))

  2. 创建一个Contents 工作表,将其移动到工作簿中最左侧的选项卡(即位置一)。

  3. 插入新数据表。

  4. 在第一列中输入数字 1-50(或足以覆盖您将使用的最大工作表数)。这些将是您的工作表索引 ID。

  5. 在第 2 列中,我们将使用公式自动填充工作表名称。如果第一个工作表 ID 号 (1) 在单元格 B5 中,请使用它。 RAND()*0 使公式保持不稳定并强制 Excel 在任何更改时刷新它。 =IFERROR(INDEX(wshNames,1+B5+RAND()*0),"")

  6. 您可以在下一列中使用以下公式从每个工作表中检索数据:=IFERROR(INDIRECT("'"&amp;C5&amp;"'!C2"),""),其中 C2 是您要从目标工作表中获取的单元格,C5 是您输入的工作表名称第 2 栏。

  7. 如果要输入超链接以跳转到工作表,请在第 4 列中使用:=IF([@[Your Column 2 Heading]]="","",HYPERLINK("#'" &amp; C5 &amp; "'!A1", [@[Your Column 2 Heading]]))。您可以根据需要对其进行调整以显示不同的链接文本。

  8. 根据需要多次重复此公式,以便从工作表中添加更多数据。

  9. 可选:添加条件格式以隐藏未使用的行。

注意:第 1 步依赖于 XLM 公式。 More on this here - 请注意,您仍需要另存为 .xlsm。这个技术是从David Hager借来的,通过this

【讨论】:

  • 谢谢!但我更喜欢上面的方法。
  • 完全没问题。你决定你喜欢哪个答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2013-10-08
  • 2017-04-20
  • 1970-01-01
  • 2011-12-03
  • 2011-06-19
  • 2015-09-15
相关资源
最近更新 更多