当我创建通过名称管理器命名的区域,我给指定工作簿或[worksheet name]
范围的选项。但是如果想要更改范围,则下拉列表会灰显。有没有一种方法,无论是在名称管理器中,还是最好是VBA来更改现有命名范围的范围?如何更改命名区域范围
例如:
testName
指'sheet1'!A1:B2
与范围工作簿。我将如何改变,要testName
指'sheet1'!A1:B2
与“工作表Sheet1”范围?
当我创建通过名称管理器命名的区域,我给指定工作簿或[worksheet name]
范围的选项。但是如果想要更改范围,则下拉列表会灰显。有没有一种方法,无论是在名称管理器中,还是最好是VBA来更改现有命名范围的范围?如何更改命名区域范围
例如:
testName
指'sheet1'!A1:B2
与范围工作簿。我将如何改变,要testName
指'sheet1'!A1:B2
与“工作表Sheet1”范围?您可以从 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
从头开始创建新的名称,并删除旧的。
这里就是我如何促进所有工作表名称全局名称。 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
这仍然需要更多的精炼,但工作与所有简单的引用,而不会杀死现有的本地名称。
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
查阅这两种潜艇该反向彼此和翻转的范围(工作表工作簿或扭转),其指的是范围在有源片所有命名范围。
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
我找到了解决方案!只需复制你的命名变量表。然后删除原始工作表。复制的工作表现在具有相同的命名变量,但具有本地范围(范围=复制的工作表)。
不过,我不知道如何从本地变量更改为全局..
的另一种方式是“黑客”的Excel文件为2007或更高版本,虽然它是明智的照顾,如果你正在这样做,并保持原有的备份:
首先Excel电子表格保存为的.xlsx或.XLSM文件(不是二进制)。将该文件重命名为.zip,然后解压缩。转到zip结构中的xl文件夹并在Wordpad或类似的文本编辑器中打开workbook.xml。命名范围可以在definedName标记中找到。本地范围定义由localSheetId =“x”定义(通过在Excel中按Alt-F11,打开电子表格,进入VBA窗口,然后查看项目窗格,可以找到表单ID。隐藏范围由hidden =“1”定义,因此只需删除隐藏=“1”来取消隐藏。
现在重新压缩的文件夹结构,同时注意保持文件夹结构的完整性,并重新命名回原来的.xlsx或.XLSM。
这可能不是最好的解决办法,如果你需要改变的范围或隐藏/显示大量定义的范围,但它工作正常制作一个或两个小的调整。
在theexceladdict.com发现这个
选择在工作表上您要更改其作用域的命名范围内;
打开名称管理器(“公式”选项卡)并选择名称;
单击删除并确定;
单击新建...并在名称字段中输入原始名称;
确保将作用域设置为工作簿,然后单击关闭。
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范围指多于一个单元格)变体
提示:避免使用单引号('),:)的工作表名称。
对我来说,它的工作原理是,当我创建从名称管理器同一范围新名称标签它给我改范围的选项;)工作簿来作为默认设置,可以更改为任何可用的床单。
这些答案有助于解决类似问题,同时尝试使用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名经理是一个烂摊子,但我没有发现,虽然没有列标签告诉你什么你”在查看已命名范围列表时重新查看,如果在名称旁边列出工作表,该名称被限定为工作表/本地。看附加的截图。
充分肯定this article的作品放在一起。
此代码似乎将设置为工作簿的范围的范围更改为工作表。我认为它应该做相反的事情。即将范围从工作表更改为工作簿。 – 2012-07-26 18:05:22
原来的问题似乎很清楚我:“例如,‘测试名’指的是‘工作表Sheet1’A1:与范围工作簿B2我将如何改变这种状况,以‘测试名’指的是‘工作表Sheet1’!A1:B2与“工作表Sheet1 ' 范围?” – 2012-07-27 08:16:09
感谢您的插件。它工作得很好。 – Anthony 2015-08-03 19:02:57