當我創建通過名稱管理器命名的區域,我給指定工作簿或[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