我正在使用 VBA 在 Excel 工作簿中设置命名范围。他们正在推出一个工作表特定范围。我需要这些范围来拥有工作簿范围。
我关注了几篇有关范围界定的帖子,但没有任何效果。
我有一个名为“Base”的工作表,它有几个在整个工作簿中使用的命名范围。单击按钮后,我想删除“Base”工作表并将其替换为新副本(来自名为“BaseTemplate”的隐藏工作表)。
我最终需要类似的事情发生在名为“Crane”的工作表上。
“BaseTemplate”工作表包含我需要的所有命名范围(仅限于该工作表)。
我正在尝试删除所有工作簿范围的变量,删除旧工作表,复制“BaseTemplate”;将副本重命名为“Base”;并将命名范围的范围转换为工作簿级别。
我被困在最后。我无法转换,甚至无法创建工作簿级别的命名范围。
我的代码运行到最后,但它创建的命名范围仅限于工作表。
Dim rname As Name
For Each rname In ActiveWorkbook.Names
If rname.Visible = True Then
Debug.Print rname.Parent.Name
If rname.Parent.Name = "Base" Or rname.Parent.Name = "JobEstimator.xlsm" Then
rname.Delete
End If
End If
Next rname
For Each ws In ActiveWorkbook.Sheets
If ws.Name <> "BaseTemplate" And ws.Name <> "CraneTemplate" And ws.Name <> "LotInspection" And ws.Name <> "LS2" And ws.Name <> "InvestmentSummary" And ws.Name <> "TemplatePage" Then
ws.Delete
End If
Next ws
Sheets("CraneTemplate").Copy Before:=Sheets(1)
ActiveSheet.Name = "Crane"
Sheets("BaseTemplate").Copy Before:=Sheets(1)
ActiveSheet.Name = "Base"
Dim intloop As Long, bloop As Long, cloop As Long
For Each rname In Worksheets("Base").Names
If rname.Visible = True Then
If rname.Visible Then
ThisWorkbook.Names.Add Name:=ThisWorkbook.Name & Mid(rname.Name, 6, 100), RefersTo:=rname.RefersTo
End If
End If
Next rname
您的代码对于复制模板表并尝试设置工作簿级别的命名范围来说看起来是正确的。但是,Excel VBA 在直接创建工作簿级命名范围时存在一些限制。默认情况下,命名范围的范围仅限于创建它们的工作表。
要实现工作簿级别的命名范围,您可以尝试以下方法:
Dim newWb As Workbook
Set newWb = Workbooks.Add
' Copy sheets to the new workbook
ThisWorkbook.Sheets("CraneTemplate").Copy Before:=newWb.Sheets(1)
newWb.Sheets(1).Name = "Crane"
ThisWorkbook.Sheets("BaseTemplate").Copy Before:=newWb.Sheets(1)
newWb.Sheets(1).Name = "Base"
Dim newName As String
For Each rname In newWb.Names
If rname.Visible Then
newName = Replace(rname.Name, "BaseTemplate!", "")
newWb.Names.Add Name:=newName, RefersTo:=rname.RefersTo
rname.Delete
End If
Next rname
这样,您就可以在新工作簿中有效地创建新的命名范围,而无需工作表引用。
请记住,如果您的命名范围引用工作表上的特定范围,则这些引用可能需要根据您的用例进行调整。
请尝试此方法,它应该可以帮助您在将工作表复制到新工作簿时创建工作簿级别的命名范围。
我能够通过将代码移出工作表模块并移至工作簿级别模块来解决此问题。这解决了问题。