2009-06-29 14 views
15

कैसे बदलें जब मैं नाम प्रबंधक के माध्यम से नामित श्रेणी बनाता हूं, तो मुझे वर्कबुक या [worksheet name] स्कोप निर्दिष्ट करने का विकल्प दिया जाता है। लेकिन यदि फिर दायरा बदलना चाहते हैं, तो ड्रॉप-डाउन ग्रे हो गया है। क्या कोई नाम है, या तो नाम प्रबंधक या, प्राथमिक रूप से, मौजूदा नामित सीमा के दायरे को बदलने के लिए वीबीए?नामित रेंज स्कोप

उदाहरण के लिए:

  • testName गुंजाइश वर्कबुक साथ 'sheet1'!A1:B2 को दर्शाता है। मैं इसे
  • testName को 'शीट 1' स्कोप के साथ 'sheet1'!A1:B2 को कैसे बदलूं?

उत्तर

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

यह कोड वर्कशीट पर कार्यपुस्तिका पर सेट की गई सीमाओं के दायरे को बदलता प्रतीत होता है। मैंने सोचा कि यह विपरीत करना था। यानी कार्यपत्रक से कार्यपुस्तिका में दायरा बदलें। –

+0

मूल प्रश्न मुझे स्पष्ट करता है: "उदाहरण के लिए, 'testName' 'शीट 1' को संदर्भित करता है! ए 1: बी 2 कार्यक्षेत्र के साथ बी 2। मैं इसे 'testName' में कैसे बदलूं 'शीट 1' से संदर्भित करता हूं! ए 1: बी 2 'शीट 1' 'गुंजाइश?' –

+0

एडिन के लिए धन्यवाद। ये अच्छी तरह काम करता है। – Anthony

2

खरोंच से नया नाम बना सकते हैं और पुराने को हटा दिया।

+1

बहुत अच्छा नहीं है यदि आपके पास –

3

यहां मैं सभी वर्कशीट नामों को वैश्विक नामों में कैसे बढ़ावा देता हूं। वाईएमएमवी

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

बदलने के लिए 100ish नाम होने हैं तो मुझे नहीं लगता कि यह कोड सही है। – tbone

+0

यह कोड मेरे लिए काम किया। – Hazerider

+0

यह 2013 में ठीक काम करता प्रतीत होता है लेकिन 2010 के लिए और नीचे आपको इन चरों को पहले परिभाषित करने की आवश्यकता है: 'वर्मशीट के रूप में मंद wsh ऑब्जेक्ट के रूप में मंद एन – Jim

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

मुझे समाधान मिला! बस अपने नामित चर के साथ शीट की प्रतिलिपि बनाएँ। फिर मूल शीट हटा दें। कॉपी की गई शीट में अब वही नाम वैरिएबल होंगे, लेकिन स्थानीय दायरे के साथ (स्कोप = कॉपी की गई शीट)।

हालांकि, मैं, पता नहीं कैसे स्थानीय चर से वैश्विक करने के लिए बदलने के लिए ..

+0

धन्यवाद दोस्त, मैंने इसका इस्तेमाल किया और यह ठीक काम कर रहा है। यह आपके सशर्त स्वरूपण इत्यादि को बनाए रखेगा लेकिन यदि आपके पास मैक्रोज़ कोड हैं तो यह सलाह नहीं दी जाती है। –

+0

यह समाधान एक्सेल 2013 – Lee

+0

के साथ मेरे लिए काम नहीं करता है अच्छा और त्वरित समाधान, उपयोगी है यदि आप सभी नामों पर एक ही क्रिया लागू करना चाहते हैं। एक्सेल 2010 के साथ, मूल शीट को हटाने के बाद मुझे वर्कबुक स्कोप के साथ मूल नामों के साथ छोड़ा गया था (#REF! ... को इंगित करता है), लेकिन मैं उन्हें तुरंत हटा सकता था। –

2

एक वैकल्पिक तरीका 2007 या अधिक के लिए एक्सेल फाइल "हैक" करने के लिए है, हालांकि यह अगर आप देखभाल करने के लिए सलाह दी जाती है ऐसा कर रहे हैं, और मूल का बैकअप रखें:

पहले Excel स्प्रेडशीट को .xlsx या .xlsm फ़ाइल (बाइनरी नहीं) के रूप में सहेजें। फ़ाइल को .zip पर पुनर्नामित करें, फिर अनजिप करें। ज़िप संरचना में एक्सएल फ़ोल्डर पर जाएं और वर्डपैड या वर्कपैड में वर्कबुक.एक्सएमएल खोलें। नामित श्रेणियां परिभाषित नाम टैग में पाई जाती हैं। स्थानीय स्कोपिंग को स्थानीय शीटआईडी = "एक्स" द्वारा परिभाषित किया जाता है (एक्सेल में Alt-F11 दबाकर, स्प्रेडशीट खोलने के साथ शीट आईडी, वीबीए विंडो पर जाने के लिए, और फिर परियोजना फलक को देखकर) मिल सकती है। छिपी हुई श्रेणियों को छुपा = "1" द्वारा परिभाषित किया गया है, इसलिए उदाहरण के लिए छुपाएं = "1" को अनदेखा करें।

अब फ़ोल्डर संरचना को दोबारा खोलें, फ़ोल्डर संरचना की अखंडता को बनाए रखने के लिए देखभाल करें, और वापस .xlsx या .xlsm का नाम बदलें।

यदि आपको एक या दो छोटे बदलावों के लिए ठीक काम करता है, तो यह शायद सबसे अच्छा समाधान नहीं है यदि आपको बड़ी संख्या में परिभाषित श्रेणियों के दायरे को बदलने या छिपाने की आवश्यकता है।

-1

theexceladdict.com पर इस मिले

  • अपने वर्कशीट जिसका गुंजाइश आप बदलना चाहते हैं पर नामित श्रेणी का चयन करें;

  • नाम प्रबंधक (फॉर्मूला टैब) खोलें और नाम का चयन करें;

  • हटाएं और ठीक क्लिक करें;

  • नया क्लिक करें ... और नाम फ़ील्ड में मूल नाम में वापस टाइप करें;

  • सुनिश्चित करें कि स्कोप वर्कबुक पर सेट है और बंद करें पर क्लिक करें।

0

JS20'07'11 का कोड वास्तव में अविश्वसनीय सरल और सीधा है। एक सुझाव यह है कि मैं देने के लिए चाहते हैं की स्थिति में एक विस्मयादिबोधक चिह्न डाल करने के लिए है:

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

क्योंकि यह एक गलत शीट में एक NamedRange जोड़ने नहीं कर पाएगा। उदाहरण: नामांकित रेंजनामक शीट को संदर्भित करता है प्लान 11 और आपके पास प्लान 1 नामक एक और शीट है, तो यदि आप विस्मयादिबोधक चिह्न का उपयोग नहीं करते हैं तो कोड श्रेणी जोड़ते समय कुछ गड़बड़ कर सकते हैं।

अद्यतन

एक सुधार: यह एक नियमित अभिव्यक्ति शीट के नाम से मूल्यांकन का उपयोग करने के लिए सबसे अच्छा है। एक साधारण समारोह है कि आप उपयोग कर सकते हैं वह इस प्रकार है (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) 

यह Plan1 और कवर किया जाएगा 'Plan1' (क एन रेंज एक से अधिक सेल को संदर्भित करता है) विविधता

टीआईपी: सिंगल कोट्स ('), :) के साथ शीट नामों से बचें।

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" मौजूद नहीं है।

अब मैं खुशी से अपने कोड में एक नामित रेंज उत्पन्न कर सकता हूं जिसके साथ मैं कभी भी उचित मानता हूं। कोई ज़रूरत नहीं नाम प्रबंधक या में एक प्लग के साथ गड़बड़ चारों ओर।


अलावा, एक्सेल मैक 2011 में नाम प्रबंधक एक मेस है, लेकिन मैं की खोज की थी कि देखते हैं, जबकि कोई स्तंभ लेबल में बताने के लिए क्या आप ' नामित सीमाओं की अपनी सूची देखते समय देख रहे हैं, यदि नाम के बगल में सूचीबद्ध एक शीट है, वह नाम वर्कशीट/स्थानीय पर स्कॉप्ड किया गया है। स्क्रीनशॉट संलग्न देखें। टुकड़ों को एक साथ डालने के लिए this article को

Excel Mac 2011 Name Manager

पूर्ण क्रेडिट।

संबंधित मुद्दे