如何改变命名范围的范围
当我通过名称pipe理器创build一个命名范围时,我可以select指定工作簿或[worksheet name]
作用域。 但如果想要更改范围,则下拉列表会灰显。 有没有办法,在名称pipe理器,或者,最好是VBA来改变现有的命名范围的范围?
例如:
-
testName
引用'sheet1'!A1:B2
testName
'sheet1'!A1:B2
与范围工作簿。 我将如何改变 -
testName
引用'sheet1'!A1:B2
testName
'作用域?
您可以从http://www.decisionmodels.com/downloads.htm下载由我自己和Jan Karel Pieterse开发的免费名称pipe理器插件。这使Excel 2007名称pipe理器无法处理的许多名称操作(包括更改名称范围)成为可能。
在VBA中:
Sub TestName() Application.Calculation = xlManual Names("TestName").Delete Range("Sheet1!$A$1:$B$2").Name = "Sheet1!TestName" Application.Calculation = xlAutomatic End Sub
我find了解决scheme! 只需复制你的命名variables表。 然后删除原始工作表。 复制的工作performance在具有相同的命名variables,但具有本地范围(范围=复制的工作表)。
但是,我不知道如何从本地variables更改为全球..
查看这两个相反的子文件,并将范围(工作表转换为工作簿或反转)引用到活动工作表上一个范围的所有命名范围。
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
以下是我如何将所有工作表名称提升为全局名称。 因人而异
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
从头创build新的名字,并删除旧的。
另一种方法是“破解”Excel文件2007或更高版本,但build议您小心谨慎,如果你这样做,并保留原件的备份:
首先将Excel电子表格保存为.xlsx或.xlsm文件(不是二进制文件)。 将该文件重命名为.zip,然后解压缩。 转到zip结构中的xl文件夹,并在写字板或类似的文本编辑器中打开workbook.xml。 命名范围可以在definedName标记中find。 本地范围定义由localSheetId =“x”定义(通过在Excel中按Alt-F11,打开电子表格,进入VBA窗口,然后查看项目窗格,可以find图纸ID。 隐藏的范围由hidden =“1”定义,所以只需要删除hidden =“1”来取消隐藏。
现在重新解压缩文件夹结构,注意保持文件夹结构的完整性,并重新命名为.xlsx或.xlsm。
这可能不是最好的解决scheme,如果你需要改变的范围或隐藏/取消隐藏大量的定义范围,虽然它可以很好地进行一两个小的调整。
这仍然需要更多的精炼,但与所有简单的参考工作,而不会杀死现有的本地名称。
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
JS20'07'11的代码真的不可思议简单直接。 我想给出的一个build议是在条件中加上一个感叹号:
InStr(1, objName.RefersTo, sWsName+"!", vbTextCompare)
因为这会阻止在不正确的工作表中添加一个NamedRange 。 例如:如果NamedRange引用名为Plan11的工作表,并且您有另一个名为Plan1的工作表,则在添加范围时,如果您不使用感叹号,代码可能会造成一些混乱。
UPDATE
更正:最好使用正则expression式评估工作表的名称。 一个简单的函数可以使用以下内容(由http://blog.malcolmp.com/2010/regular-expressions-excel-add-in进行修改 ,启用Microsoft VBScript Regular Expressions 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)
这将覆盖Plan1和“Plan1” (当范围涉及多个单元格时)变体
提示:避免使用单引号('),:)的表名。
对我来说,当我从名称pipe理器为同一范围创build新的名称标记时 ,它使我可以select更改范围;)工作簿默认为可用,可以更改为任何可用表单。
这些答案有助于在尝试使用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"
不存在。
现在我可以很高兴地在我的代码中生成一个命名范围,我认为合适的范围。 没有必要乱用名称pipe理器或插件。
除此之外,Excel Mac 2011中的名称pipe理器是一团糟,但是我确实发现虽然在查看命名范围列表时没有列标签可以告诉您正在查看的内容,但是如果在名称旁边, 该名称的范围是工作表/本地 。 看附加的截图。
充分相信这篇文章把这些作品放在一起。
在theexceladdict.comfind了这个
-
select您想要更改范围的工作表上的命名范围;
-
打开名称pipe理器(“公式”选项卡)并select名称;
-
点击删除并确定;
-
单击新build…,然后在名称字段中input原始名称;
-
确保“范围”设置为“工作簿”,然后单击“closures”。