2009-06-29 123 views
15

当我创建通过名称管理器命名的区域,我给指定工作簿或[worksheet name]范围的选项。但是如果想要更改范围,则下拉列表会灰显。有没有一种方法,无论是在名称管理器中,还是最好是VBA来更改现有命名范围的范围?如何更改命名区域范围

例如:

  • testName'sheet1'!A1:B2与范围工作簿。我将如何改变,要
  • testName'sheet1'!A1:B2与“工作表Sheet1”范围?

回答

12

您可以从 http://www.decisionmodels.com/downloads.htm 下载由我和扬卡雷尔Pieterse开发的免费名称管理器插件这使许多名操作的Excel 2007中名称经理无法处理,包括更改名称的范围。

在VBA:

Sub TestName() 
Application.Calculation = xlManual 
Names("TestName").Delete 
Range("Sheet1!$A$1:$B$2").Name = "Sheet1!TestName" 
Application.Calculation = xlAutomatic 
End Sub 
+0

此代码似乎将设置为工作簿的范围的范围更改为工作表。我认为它应该做相反的事情。即将范围从工作表更改为工作簿。 – 2012-07-26 18:05:22

+0

原来的问题似乎很清楚我:“例如,‘测试名’指的是‘工作表Sheet1’A1:与范围工作簿B2我将如何改变这种状况,以‘测试名’指的是‘工作表Sheet1’!A1:B2与“工作表Sheet1 ' 范围?” – 2012-07-27 08:16:09

+0

感谢您的插件。它工作得很好。 – Anthony 2015-08-03 19:02:57

2

从头开始创建新的名称,并删除旧的。

3

这里就是我如何促进所有工作表名称全局名称。 YMMV

For Each wsh In ActiveWorkbook.Worksheets 
For Each n In wsh.Names 
    ' Get unqualified range name 
    Dim s As String 
    s = Split(n.Name, "!")(UBound(Split(n.Name, "!"))) 
    ' Add to "Workbook" scope 
    n.RefersToRange.Name = s 
    ' Remove from "Worksheet" scope 
    Call n.Delete 
Next n 
Next wsh 
1

这仍然需要更多的精炼,但工作与所有简单的引用,而不会杀死现有的本地名称。

Type GlobalNamesToLocalNames_Type 
    Name As String 
    Sheet As String 
    Ref As String 
End Type 

Sub GlobalNamesToLocalNames(Optional Void As Variant) 
    Dim List() As GlobalNamesToLocalNames_Type 
    Dim Count As Long 
    Dim Name As Name 
    Dim Dat() As String 
    Dim X As Long 

    ' count the size 
    For Each Name In ActiveWorkbook.Names 
     Count = Count + 1 
    Next 
    ReDim List(Count - 1) 
    Count = 0 

    ' Collecect all name data 
    For Each Name In ActiveWorkbook.Names 
     With List(Count) 
     ' Pick up only the name 
     If InStr(Name.Name, "!") > 0 Then 
      Dat = Split(Name.Name, "!") 
      .Name = Dat(1) 
     Else 
      .Name = Name.Name 
     End If 
     ' pick up the sheet and refer 
     Dat = Split(Name.RefersTo, "!") 
     .Sheet = Mid(Dat(0), 2) 
     .Ref = Dat(1) 
     ' make local sheet name 
     .Name = .Sheet & "!" & .Name 
     End With 
     Count = Count + 1 
    Next 

    ' Delete all names 
    For Each Name In ActiveWorkbook.Names 
     Name.Delete 
    Next 

    'rebuild all the names 
    For X = 0 To Count - 1 
     With List(X) 
     If Left(.Ref, 1) <> "#" Then 
      ActiveWorkbook.Names.Add Name:=.Name, RefersToLocal:="=" & .Sheet & "!" & .Ref 
     End If 
     End With 
    Next 
End Sub 
5

查阅这两种潜艇该反向彼此和翻转的范围(工作表工作簿或扭转),其指的是范围在有源片所有命名范围。

Option Explicit 
'--------------------------------------------------------------------------------------- 
' Procedure : RescopeNamedRangesToWorkbook 
' Author : Jesse Stratton 
' Date  : 11/18/2013 
' Purpose : Rescopes the parent of worksheet scoped named ranges to the active workbook 
' for each named range with a scope equal to the active sheet in the active workbook. 
'--------------------------------------------------------------------------------------- 

Public Sub RescopeNamedRangesToWorkbook() 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim objName As Name 
Dim sWsName As String 
Dim sWbName As String 
Dim sRefersTo As String 
Dim sObjName As String 
Set wb = ActiveWorkbook 
Set ws = ActiveSheet 
sWsName = ws.Name 
sWbName = wb.Name 

'Loop through names in worksheet. 
For Each objName In ws.Names 
'Check name is visble. 
    If objName.Visible = True Then 
'Check name refers to a range on the active sheet. 
     If InStr(1, objName.RefersTo, sWsName, vbTextCompare) Then 
      sRefersTo = objName.RefersTo 
      sObjName = objName.Name 
'Check name is scoped to the worksheet. 
      If objName.Parent.Name <> sWbName Then 
'Delete the current name scoped to worksheet replacing with workbook scoped name. 
       sObjName = Mid(sObjName, InStr(1, sObjName, "!") + 1, Len(sObjName)) 
       objName.Delete 
       wb.Names.Add Name:=sObjName, RefersTo:=sRefersTo 
      End If 
     End If 
    End If 
Next objName 
End Sub 
'--------------------------------------------------------------------------------------- 
' Procedure : RescopeNamedRangesToWorksheet 
' Author : Jesse Stratton 
' Date  : 11/18/2013 
' Purpose : Rescopes each workbook scoped named range to the specific worksheet to 
' which the range refers for each named range that refers to the active worksheet. 
'--------------------------------------------------------------------------------------- 

Public Sub RescopeNamedRangesToWorksheet() 
Dim wb As Workbook 
Dim ws As Worksheet 
Dim objName As Name 
Dim sWsName As String 
Dim sWbName As String 
Dim sRefersTo As String 
Dim sObjName As String 
Set wb = ActiveWorkbook 
Set ws = ActiveSheet 
sWsName = ws.Name 
sWbName = wb.Name 

'Loop through names in worksheet. 
For Each objName In wb.Names 
'Check name is visble. 
    If objName.Visible = True Then 
'Check name refers to a range on the active sheet. 
     If InStr(1, objName.RefersTo, sWsName, vbTextCompare) Then 
      sRefersTo = objName.RefersTo 
      sObjName = objName.Name 
'Check name is scoped to the workbook. 
      If objName.Parent.Name = sWbName Then 
'Delete the current name scoped to workbook replacing with worksheet scoped name. 
       objName.Delete 
       ws.Names.Add Name:=sObjName, RefersTo:=sRefersTo 
      End If 
     End If 
    End If 
Next objName 
End Sub 
9

我找到了解决方案!只需复制你的命名变量表。然后删除原始工作表。复制的工作表现在具有相同的命名变量,但具有本地范围(范围=复制的工作表)。

不过,我不知道如何从本地变量更改为全局..

2

的另一种方式是“黑客”的Excel文件为2007或更高版本,虽然它是明智的照顾,如果你正在这样做,并保持原有的备份:

首先Excel电子表格保存为的.xlsx或.XLSM文件(不是二进制)。将该文件重命名为.zip,然后解压缩。转到zip结构中的xl文件夹并在Wordpad或类似的文本编辑器中打开workbook.xml。命名范围可以在definedName标记中找到。本地范围定义由localSheetId =“x”定义(通过在Excel中按Alt-F11,打开电子表格,进入VBA窗口,然后查看项目窗格,可以找到表单ID。隐藏范围由hidden =“1”定义,因此只需删除隐藏=“1”来取消隐藏。

现在重新压缩的文件夹结构,同时注意保持文件夹结构的完整性,并重新命名回原来的.xlsx或.XLSM。

这可能不是最好的解决办法,如果你需要改变的范围或隐藏/显示大量定义的范围,但它工作正常制作一个或两个小的调整。

-1

在theexceladdict.com发现这个

  • 选择在工作表上您要更改其作用域的命名范围内;

  • 打开名称管理器(“公式”选项卡)并选择名称;

  • 单击删除并确定;

  • 单击新建...并在名称字段中输入原始名称;

  • 确保将作用域设置为工作簿,然后单击关闭。

0

JS20'07'11的代码真的不可思议简单直接。我想给一个建议是把一个感叹号的条件:

InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare) 

因为这将防止不正确的表添加NamedRange。例如:如果命名范围引用名为Plan11的工作表,并且您有另一个名为的工作表Plan1如果您不使用感叹号,则添加范围时,代码可能会造成一些混乱。

UPDATE

的修正:这是最好的使用正则表达式评估表的名称。您可以使用一个简单的函数是下面的(由http://blog.malcolmp.com/2010/regular-expressions-excel-add-in适应,使微软的VBScript正则表达式5.5):

Function xMatch(pattern As String, searchText As String, Optional matchIndex As Integer = 1, Optional ignoreCase As Boolean = True) As String 
On Error Resume Next 
Dim RegEx As New RegExp 
RegEx.Global = True 
RegEx.MultiLine = True 
RegEx.pattern = pattern 
RegEx.ignoreCase = ignoreCase 
Dim matches As MatchCollection 
Set matches = RegEx.Execute(searchText) 
Dim i As Integer 
i = 1 
For Each Match In matches 
    If i = matchIndex Then 
     xMatch = Match.Value 
    End If 
    i = i + 1 
Next 
End Function 

所以,你可以使用类似的东西:

xMatch("'?" +sWsName + "'?" + "!", objName.RefersTo, 1) <> "" 

,而不是

InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare) 

这将覆盖计划1'计划1'(WH范围指多于一个单元格)变体

提示:避免使用单引号('),:)的工作表名称。

0

对我来说,它的工作原理是,当我创建从名称管理器同一范围新名称标签它给我改范围的选项;)工作簿来作为默认设置,可以更改为任何可用的床单。

0

这些答案有助于解决类似问题,同时尝试使用Workbook作用域来定义命名范围。 “啊,哈!”对我来说是使用的名字集合这是相对于整个练习册!这可能是对很多人的重述,但在我的研究中没有明确说明,所以我与其他人分享了类似的问题。

' Local/Worksheet only scope 
Worksheets("Sheet2").Names.Add Name:="a_test_rng1", RefersTo:=Range("A1:A4") 

' Global/Workbook scope 
ThisWorkbook.Names.Add Name:="a_test_rng2", RefersTo:=Range("B1:b4") 

如果你看看你的名单时Sheet2中处于活动状态,无论是范围是有,但切换到任何其他表和"a_test_rng1"不存在。

现在我可以高兴地产生在我的代码有什么都我的范围认为适当命名的范围。不具有名称管理器或插件需要浪费时间。


除此之外,在Excel的Mac 2011名经理是一个烂摊子,但我没有发现,虽然没有列标签告诉你什么你”在查看已命名范围列表时重新查看,如果在名称旁边列出工作表,该名称被限定为工作表/本地。看附加的截图。

Excel Mac 2011 Name Manager

充分肯定this article的作品放在一起。