2012-10-09 6 views
7

विस्तृत करने के लिए, मान लें कि मेरे पास मेरी कार्यपुस्तिका में दो नामित श्रेणियां हैं। दोनों नामित श्रेणियों का एक ही नाम है (चलो "myName" कहें), लेकिन एक को शीट 1 पर रखा गया है और दूसरा कार्यपुस्तिका में है।एक्सेल कार्यपुस्तिका में स्ट्रिंग द्वारा नामित रेंज प्राप्त करें जब नाम डुप्लिकेट किया गया है

नामित रेंज का नाम (स्ट्रिंग) दिया गया है, मैं वर्कबुक स्तर नामित रेंज को पकड़ना चाहता हूं।

यदि मैं मूल कॉल का उपयोग करता हूं: wb.Names.Item("myName"), यह शीट नामित रेंज को वापस देता है।

यदि मैं इसके बजाय करता हूं: wb.Names.Item("Sheet1!myName"), जो स्पष्ट रूप से शीट स्कोप्ड नाम सीमा देता है। मैंने पाया है कि मैं शीट विशिष्ट निर्दिष्ट करने के लिए इसका उपयोग कर सकता हूं, लेकिन एक कार्यपुस्तिका नहीं।

क्या वैसे भी मैं निर्दिष्ट कर सकता हूं कि मैं कार्यपुस्तिका को स्कॉप्ड करना चाहता हूं?

मेरा कामकाज वर्तमान में सभी नामों की सूची में पुन: प्रयास कर रहा है, और कार्यपुस्तिका के दायरे नामित रेंज को पकड़ने के लिए नामकरण की तुलना कर रहा है। यह काम करता है क्योंकि .नाम संपत्ति "शीट 1" जोड़ती है। शीट के लिए नामित रेंज स्कॉप्ड। हालांकि यह करने के लिए बहुत महंगा है, और मैं इसे टालना चाहता हूं।

+2

यह मेरे लिए% नहीं 100 स्पष्ट है कि कैसे आप उपयोग कर रहे हैं - अपने यथोचित तेजी से जब तक आप नाम के हजारों के कई दसियों है: अनुकूलित VBA कोड हम एक वैश्विक नाम का स्थानीय संस्करण को खोजने के लिए का उपयोग यह है रेंज। यदि आप किसी श्रेणी स्ट्रिंग पर रेंज ऑब्जेक्ट सेट करने का प्रयास कर रहे थे, तो 'rng1 = रेंज ("myName") सेट करें, यदि शीट 1 सक्रिय है तो स्थानीय शीट नाम से रेंज वापस कर देगा * अन्यथा यह कार्यपुस्तिका के नाम से रेंज वापस कर देगा । मुझे लगता है कि यह सबसे साफ कामकाज है - यानी परीक्षण करें कि कार्यपत्र के रूप में नाम का उपयोग करने से पहले सक्रिय शीट स्थानीय नाम की मेजबानी करने वाली शीट से अलग है। सही बात? :) – brettdj

+0

आप वर्कबुक नाम के साथ parent.name की तुलना भी कर सकते हैं, लेकिन आपको अभी भी उस संग्रह को निकालने के लिए नामों के माध्यम से लूप की आवश्यकता है। – nutsch

+0

पुन: @ ब्रेट्डज की टिप्पणी। जो भी आप प्राप्त करने का प्रयास कर रहे हैं उसके आधार पर, आपके कोड के अंत में हटाए जाने के लिए, बस अपने मैक्रो की शुरुआत में एक अस्थायी शीट जोड़ना सबसे आसान हो सकता है। – nutsch

उत्तर

1

जब हम (जेकेपी और खुद) Name Manager लिख रहे थे तो हमने विशेष रूप से डुप्लिकेट ग्लोबल/स्थानीय नामों के लिए एक फ़िल्टर और चेतावनी संदेश जोड़ा क्योंकि यह एक्सेल ऑब्जेक्ट मॉडल व्यवहार जो आप उल्लेख करते हैं, वह बग का पता लगाने के लिए कठिन होता है।

तो मेरी सिफारिश कभी भी डुप्लिकेट ग्लोबल/स्थानीय नामों का उपयोग नहीं करना है।

हम यह पता लगाने के लिए कोड का उपयोग करते हैं कि कोई नाम स्थानीय नाम के माता-पिता के साथ वैश्विक/स्थानीय डुप्लिकेट है या फिर आवश्यक होने पर शीट स्विच करें।

Function FindNameLocal(oSheet As Worksheet, sName As String) As Name 
     Dim oName As Name 
     Dim strLocalName As String 
     Dim strLocalNameNoQuote 
     Dim strName As String 
     Set FindNameLocal = Nothing 
     If Len(sName) > 0 And Not oSheet Is Nothing And oSheet.Names.Count > 0 Then 
      On Error Resume Next 
      strLocalName = "'" & oSheet.Name & "'!" & sName 
      strLocalNameNoQuote = oSheet.Name & "!" & sName 
      Set FindNameLocal = oSheet.Names(strLocalName) 
      If Err <> 0 Or (FindNameLocal.NameLocal <> strLocalName And FindNameLocal.NameLocal <> strLocalNameNoQuote) Then 
       On Error GoTo 0 
       Set FindNameLocal = Nothing 
       For Each oName In oSheet.Names 
        strName = oName.Name 
        If Len(strLocalName) = Len(strName) Or Len(strLocalNameNoQuote) = Len(strName) Then 
         If strName = strLocalName Or strName = strLocalNameNoQuote Then 
          Set FindNameLocal = oName 
          GoTo GoExit 
         End If 
        End If 
       Next 
      End If 
     End If 
GoExit: 
    End Function 
+0

मुझे यकीन नहीं है कि यह मेरे प्रश्न का उत्तर दे। शायद मैं इसे गलत तरीके से पढ़ रहा हूं, लेकिन मुझे नाम का वैश्विक संस्करण प्राप्त करने की आवश्यकता है। यह शीट स्तर एक देता है, जिसे मैं पहले से ही wb.Names.Item ("शीट 1! MyName") के प्रारूप में पास करके कर सकता हूं। मैंने आपके कोड में एक चीज़ देखी है कि मैं उत्सुक हूं। स्ट्रिंग की तुलना करने से पहले लंबाई की तुलना करना प्रदर्शन लाभ के कारण होता है? – Shark

+0

हम इसका उपयोग यह पता लगाने के लिए करते हैं कि वैश्विक नाम और सक्रिय कार्यपत्रक नाम पारित करके डुप्लिकेट किया गया वैश्विक-स्थानीय नाम है या नहीं। यदि कोई डुप्लिकेट है तो आपको वर्कशीट को बदलने की आवश्यकता है और जब तक आपको वर्कशीट नहीं मिलती है तब तक पुनः प्रयास करें जिसमें डुप्लिकेट नहीं है (या अस्थायी रूप से एक नई शीट जोड़ें) ताकि जब आप नाम तक पहुंच जाए तो आपको वैश्विक मिलेगा। एक स्ट्रिंग की लंबाई प्राप्त करना वीबीए में बहुत तेज़ है लेकिन स्ट्रिंग की तुलना धीमी है: यह नहीं पता कि यह सी # में कितनी हद तक लागू होता है। –

+0

अहह, अब समझ में आता है। मुझे यह देखना होगा कि आपका दृष्टिकोण (सी # में अनुवाद किया गया है) एक और विचार से तेज है जो मैंने साथ आया है। मैं समाधान को एक और जवाब के रूप में पोस्ट कर दूंगा। फिर प्रदर्शन परीक्षण विजेता निर्धारित करेगा! – Shark

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