我想知道是否可以使用宏来命名工作表上还不存在但将来会出现的范围。
在我试图使用的实例中,未来的电子表格是使用一个Worksheet_Change
事件动态创建的,其中新表的名称被键入到一个列表中。(如果相关,我可以包括用于此的宏)
我已经研究了几个想法:
我尝试过使用=Indirect
,就像这里在StackOverflow上指出的那样。
工作表名称已填充到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
总结我的问题:
worksheet_change
事件中,这样当一个新的sheetname被添加到sheets列表中时,宏就会在新页面上运行吗?Sht = ActiveSheet.Name
& ActiveWorkbook.Names.Add Name:="Total" & Sht
发布于 2015-06-22 20:26:38
使用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
发布于 2015-06-22 20:38:42
这就是你想要的吗?
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
https://stackoverflow.com/questions/30993656
复制