将命名范围范围设置为工作簿

问题描述 投票:0回答:2

我正在使用 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 scope named-ranges
2个回答
0
投票

您的代码对于复制模板表并尝试设置工作簿级别的命名范围来说看起来是正确的。但是,Excel VBA 在直接创建工作簿级命名范围时存在一些限制。默认情况下,命名范围的范围仅限于创建它们的工作表。

要实现工作簿级别的命名范围,您可以尝试以下方法:

  1. 创建一个新工作簿: 不要复制同一工作簿中的工作表,而是创建一个新工作簿并将工作表复制到新工作簿中。这样,默认情况下命名范围将限定在新工作簿的范围内。
    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"
  1. 更新命名范围: 复制工作表后,更新新工作簿中命名范围的名称以删除任何工作表引用。
    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

这样,您就可以在新工作簿中有效地创建新的命名范围,而无需工作表引用。

请记住,如果您的命名范围引用工作表上的特定范围,则这些引用可能需要根据您的用例进行调整。

请尝试此方法,它应该可以帮助您在将工作表复制到新工作簿时创建工作簿级别的命名范围。


0
投票

我能够通过将代码移出工作表模块并移至工作簿级别模块来解决此问题。这解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.