2009-06-29 166 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的作品放在一起。