VBA 命名范围无法设置范围

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

我在使用 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
1个回答
0
投票

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

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

  1. 创建新工作簿: 不要复制同一工作簿中的工作表,而是创建一个新工作簿并将工作表复制到新工作簿中。这样,默认情况下,命名范围将限定在新工作簿的范围内。

    将 newWb 调暗为工作簿 设置 newWb = Workbooks.Add

    ' 将工作表复制到新工作簿 ThisWorkbook.Sheets("CraneTemplate"). 之前复制:=newWb.Sheets(1) newWb.Sheets(1).Name = "起重机"

    ThisWorkbook.Sheets("BaseTemplate"). 之前复制:=newWb.Sheets(1) newWb.Sheets(1).Name = "Base"

  2. 更新命名范围: 复制工作表后,更新新工作簿中命名范围的名称以删除任何工作表引用。

    将 newName 变暗为字符串

    对于 newWb.Names 中的每个 rname 如果 rname.Visible 那么 newName = Replace(rname.Name, "BaseTemplate!", "") newWb.Names.Add 名称:=newName, RefersTo:=rname.RefersTo rname.删除 万一 下一个名字

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

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

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

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