2009-06-29 11 views
15

Wenn ich einen benannten Bereich über den Namen-Manager erstelle, habe ich die Möglichkeit, den Bereich Arbeitsmappe oder [worksheet name] anzugeben. Wenn der Umfang jedoch geändert werden soll, ist das Dropdown-Menü ausgegraut. Gibt es einen Weg, entweder in Name Manager oder, vorzugsweise, VBA, den Umfang eines bestehenden benannten Bereichs zu ändern?So ändern Sie den Bereich für benannte Bereiche

Zum Beispiel:

  • testName bezieht sich auf 'sheet1'!A1:B2 mit Rahmen Arbeitsbuch. Wie würde ich das ändern zu
  • testName bezieht sich auf 'sheet1'!A1:B2 mit 'Blatt1' Bereich?

Antwort

12

Sie können den freien Name Manager Addin von mir und Jan Karel Pieterse entwickelt Download von http://www.decisionmodels.com/downloads.htm Dies viele Namen Operationen ermöglicht, dass die Excel 2007 Name Manager nicht verarbeiten kann, einschließlich der Möglichkeiten der Namen zu ändern.

In VBA:

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

Dieser Code scheint den Bereich der Bereiche zu ändern, die für die Arbeitsmappe auf dem Arbeitsblatt festgelegt sind. Ich dachte, es sollte das Gegenteil bewirken. d. h. Ändern des Bereichs von Arbeitsblatt zu Arbeitsmappe. –

+0

Die ursprüngliche Frage scheint mir klar zu sein: "Beispiel: 'testName' bezieht sich auf 'sheet1'! A1: B2 mit scope-Arbeitsmappe. Wie würde ich das ändern zu 'testName' bezieht sich auf 'sheet1'! A1: B2 mit 'sheet1 ' Umfang?" –

+0

Danke für das Addin. Es funktioniert sehr gut. – Anthony

2

den neuen Namen von Grund auf neu erstellen und die alte löschen.

+1

nicht so toll, wenn Sie zufällig 100ish Namen zu ändern haben –

3

Hier ist, wie ich alle Arbeitsblattnamen zu globalen Namen zu fördern. 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

Ich glaube nicht, dass dieser Code korrekt ist. – tbone

+0

Dieser Code funktionierte für mich. – Hazerider

+0

Es scheint in 2013 gut zu funktionieren, aber für 2010 und unten müssen Sie zuerst diese Variablen definieren: "Dim wsh als Arbeitsblatt Dim N As Object" – Jim

1

Dies erfordert noch mehr Verfeinerung funktioniert jedoch mit allen einfachen Referenzen, ohne lokale lokale Namen zu töten.

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

Schauen Sie sich diese zwei U-Boote, die einander und klappen Sie den Rahmen umkehren (Arbeitsblatt-Arbeitsmappe oder umgekehrt) aller benannten Bereiche, die auf einen Bereich auf dem aktiven Blatt verweisen.

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

Ich fand die Lösung! Kopieren Sie einfach das Blatt mit Ihren benannten Variablen. Löschen Sie dann das Originalblatt. Das kopierte Blatt hat jetzt die gleichen benannten Variablen, jedoch mit einem lokalen Gültigkeitsbereich (Gültigkeitsbereich = das kopierte Blatt).

Aber ich weiß nicht, wie von der lokalen Variablen global ändern ..

+0

Danke Freund, ich habe das benutzt und es funktioniert gut. Es behält Ihre bedingte Formatierung usw. , aber es ist nicht ratsam, wenn Sie Makrocodes darin haben. –

+0

Diese Lösung hat nicht mit Excel 2013 funktioniert – Lee

+0

Schöne und schnelle Lösung, nützlich, wenn Sie die gleiche Aktion auf alle Namen anwenden möchten. In Excel 2010 wurden nach dem Entfernen des Originalblatts die ursprünglichen Namen mit dem Arbeitsmappenbereich (auf #REF! ...) angezeigt, aber ich konnte sie schnell entfernen. –

2

Ein alternativer Weg zu „hacken“ ist das Excel 2007 oder höher Datei, obwohl es ratsam ist, dafür Sorge zu tragen, wenn Sie tun dies, und halten Sie eine Sicherung des Originals:

Speichern Sie zuerst die Excel-Tabelle als .xlsx oder .xlsm-Datei (nicht binär). Benenne die Datei in .zip um und entpacke sie dann. Wechseln Sie zum Ordner xl in der Zip-Struktur, und öffnen Sie workbook.xml in Wordpad oder einem ähnlichen Texteditor. Benannte Bereiche werden in den Tags definedName gefunden. Das lokale Scoping wird durch localSheetId = "x" definiert (die Blatt-IDs können durch Drücken von Alt-F11 in Excel bei geöffnetem Arbeitsblatt gefunden werden, um zum VBA-Fenster zu gelangen und dann das Projektfenster anzuzeigen). Verborgene Bereiche werden durch hidden = "1" definiert. Löschen Sie also einfach hidden = "1", um sie anzuzeigen.

Jetzt die Ordnerstruktur erneut komprimieren, wobei darauf zu achten ist, dass die Integrität der Ordnerstruktur erhalten bleibt, und in .xlsx oder .xlsm umbenannt werden.

Dies ist wahrscheinlich nicht die beste Lösung, wenn Sie den Bereich ändern oder eine große Anzahl von definierten Bereichen ein- oder ausblenden möchten, obwohl es für die Durchführung von ein oder zwei kleinen Optimierungen gut funktioniert.

-1

diese

bei theexceladdict.com gefunden
  • Wählen Sie den benannten Bereich in Ihrem Arbeitsblatt, deren Umfang Sie ändern möchten;

  • Öffnen Sie den Namen Manager (Registerkarte Formeln) und wählen Sie den Namen;

  • Klicken Sie auf Löschen und OK;

  • Klicken Sie auf Neu ... und geben Sie den ursprünglichen Namen wieder in das Feld Name ein.

  • Stellen Sie sicher, dass Bereich auf Arbeitsmappe festgelegt ist, und klicken Sie auf Schließen.

0

Der Code von JS20'07'11 ist wirklich unglaublich einfach und direkt. Ein Vorschlag, Ich mag würde geben, ist ein Ausrufezeichen in den Bedingungen zu setzen:

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

Da dies verhindern wird das Hinzufügen eines Namedrange in einer falschen Blatt. Bsp: Wenn der NamedRange auf ein Blatt mit dem Namen Plan11 verweist und Sie ein anderes Blatt mit dem Namen Plan1 haben, kann der Code einige Fehler machen, wenn Sie die Bereiche hinzufügen, wenn Sie das Ausrufezeichen nicht verwenden.

UPDATE

Eine Korrektur: Es ist am besten ein regulärer Ausdruck, den Namen des Blattes bewerten zu verwenden. Eine einfache Funktion, die Sie ist die folgende verwenden können (durch http://blog.malcolmp.com/2010/regular-expressions-excel-add-in angepasst, ermöglicht 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 

Also, Sie so etwas verwenden:

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

statt

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

Dies deckt Plan1 und 'Plan1' (wh Der Bereich bezieht sich auf mehr als eine Zelle) Variationen

TIPP: Vermeiden Sie Blattnamen mit einfachen Anführungszeichen ('), :).

0

Für mich ist es funktioniert, wenn ich neue Namensschild für den gleichen Bereich von der Name Manager erstellen es mir die Möglichkeit gibt, Umfang zu ändern;) Arbeitsmappe als Standard kommt und kann auf jede der verfügbaren geändert werden Blätter.

0

Diese Antworten waren hilfreich bei der Lösung eines ähnlichen Problems beim Versuch, einen benannten Bereich mit dem Bereich Workbook zu definieren. Das "ah-HA!" für mich ist die Verwendung der Names Collection, die relativ zu der ganzen Arbeitsmappe ist! Dies mag für viele die Wiederholung sein, aber es wurde nicht klar in meinen Nachforschungen angegeben, deshalb teile ich für andere mit ähnlichen Fragen.

' 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") 

Wenn man sich die Liste der Namen suchen, wenn Tabelle2 aktiv ist, gibt es beide Bereiche, aber zu jedem anderen Blatt wechseln, und "a_test_rng1" ist nicht vorhanden.

Jetzt kann ich glücklicherweise einen benannten Bereich in meinem Code mit jedem Bereich generieren, den ich für angemessen halte. Keine Notwendigkeit, mess around mit dem Namen Manager oder ein Plug-in.


beiseite lässt, ist der Name Manager in Excel Mac 2011 ein Chaos, aber ich habe zu entdecken, dass es zwar keine Spaltenbeschriftungen sind Ihnen sagen, was Sie‘ Wenn Sie bei der Anzeige der Liste der benannten Bereiche ein Blatt anzeigen, wird neben dem Namen dieser Name auf das Arbeitsblatt/lokale festgelegt. Siehe Screenshot beigefügt.

Excel Mac 2011 Name Manager

Voll Kredit this article für die Stücke zusammenzustellen.

Verwandte Themen