如何使用宏在未来动态创建的工作表上命名范围?

时间:2015-06-23 04:03:50

标签: excel vba excel-vba

我想知道是否可以使用宏来命名目前尚不存在但将来会存在的工作表范围。

在我尝试使用此实例时,将使用Worksheet_Change事件动态创建未来的电子表格,其中新工作表的名称将输入到列表中。 (如果相关,我可以包含用于此的宏)

我已经研究了几个想法:

我尝试在StackOverflow上使用=Indirect指示here 工作表名称已填充到A2中,所需的单元格位于新页面的B30中:=INDIRECT("'"&$A2&"'!"&B30)) 但是,这不起作用,因为:
由于工作表可以命名为任何东西,因此该解决方案使用绝对引用,而不是相对引用。首选相对引用,因为引用的单元格可以随插入/删除的行向上或向下移动。

我也尝试使用宏来定义命名范围。定义工作表名称时,以下宏工作(在本例中,在“主”工作表上)。它找到一个单元格值,并将右侧的单格范围6个单元格命名为“Total”+ Sheetname(在本例中为“TotalMaster”)。
我难以理解的部分是如何在宏中引用未来的工作表。由于可以制造任何数量的新纸张,这使事情变得更加复杂。我还希望能够将范围动态命名为"Total"+Sheetname

Sub MakeName()
Dim Sht As String

Sht = ActiveSheet.Name

  Sheets("Master").Range("A1").Select
    Cells.Find(What:="TOTAL MD (RES)", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False).Activate
  ActiveCell.Offset(0, 6).Select
  ActiveWorkbook.Names.Add Name:="Total" & Sht, RefersTo:=Selection

End Sub

总结我的问题:

  1. 如何编辑宏以在以后的页面上命名范围?我想这可以合并到worksheet_change事件中,这样当新的工作表名称添加到工作表列表时,宏会在新页面上运行吗?
  2. 如何编辑这些代码段以引用新创建的工作表,而不是活动工作表?
    Sht = ActiveSheet.Name& ActiveWorkbook.Names.Add Name:="Total" & Sht

2 个答案:

答案 0 :(得分:1)

使用Workbook_NewSheet事件。如果添加了图表(而不是工作表),应该注意确保不触发代码。类似的东西:

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    On Error GoTo ignore_me
    Dim ws As Worksheet
    Set ws = Sh
    ActiveWorkbook.Names.Add Name:="Total" & ws.Name, RefersTo:=ws.Range("A1")
    Exit Sub
ignore_me:
    'must be a chart sheet added -- take no action
End Sub

答案 1 :(得分:0)

这是你在尝试的吗?

Private Sub Workbook_NewSheet(ByVal Sh As Object)
    If Sh.Type <> -4167 Then Exit Sub

    Dim aCell As Range, rng As Range

    Set aCell = ThisWorkbook.Sheets("Master").Cells.Find(What:="TOTAL MD (RES)", _
                                                         LookIn:=xlFormulas, _
                                                         LookAt:=xlPart, _
                                                         SearchOrder:=xlByRows, _
                                                         SearchDirection:=xlNext, _
                                                         MatchCase:=False)

    If Not aCell Is Nothing Then Set rng = aCell.Offset(, 6)

    If Not rng Is Nothing Then _
    ThisWorkbook.Names.Add Name:="Total" & Sh.Name, RefersTo:=rng
End Sub