2010-04-16 22 views
12

ऐसा लगता है कि विजुअल बेसिक उपयोगकर्ता द्वारा संशोधित शीट नामों के अनुसार चादरों का संदर्भ नहीं दे सकता है। वर्कशीट टैब में उनके नाम बदल सकते हैं, लेकिन ऐसा लगता है कि वर्कबुक टैब को वर्कशीट नामों को शीट 1, इत्यादि के रूप में अभी भी लगता है, कार्यपुस्तिका टैब को कुछ उपयोगी में बदलने के बावजूद।एक्सेल टैब शीट नाम बनाम विजुअल बेसिक शीट नाम

TABname = rng.Worksheet.Name ' Excel sheet TAB name, not VSB Sheetx name. 

लेकिन मैं दृश्य मूल दिनचर्या में पत्रक के नाम का उपयोग करना चाहेंगे:

मैं इस किया है। सबसे अच्छा मैं अब तक आ सकता हूं केस वर्कशीट टैब बनाम विजुअल बेसिक नाम का चयन करना है, जो मेरा दिन नहीं बनाता है। विजुअल बेसिक को शीट 1, शीट 2, आदि, नामों को जानना चाहिए। मैं इन्हें Excel टैब नामों से कैसे जोड़ सकता हूं ताकि मुझे एक लुक-अप तालिका को बनाए रखने की आवश्यकता न हो जो प्रत्येक नई शीट या शीट टैब के साथ बदलती है? आपके उत्तरों के लिए अग्रिम धन्यवाद।

+1

मुझे ऐसी स्थिति का सामना नहीं हुआ है जहां शीट का नाम बदल दिया गया है लेकिन वीबी परिवर्तन को देखने में विफल रहता है। क्या आप अपना रिवाल्ट कोड दिखा सकते हैं? –

उत्तर

16

एक्सेल ऑब्जेक्ट मॉडल एक वर्कशीट 2 अलग नाम गुण है में:

Worksheet.Name
Worksheet.CodeName

नाम संपत्ति पढ़ने/लिखने की और नाम है कि पर दिखाई देता है शामिल है शीट टैब। यह उपयोगकर्ता है और VBA अस्थिर

कोडनेम संपत्ति केवल पढ़ने के लिए है

आप एक विशेष चादर कार्यपत्रक ("फ्रेड") के रूप में संदर्भित कर सकते हैं। रेंज ("A1") जहां फ्रेड .Name संपत्ति है या शीट 1। श्रेणी ("ए 1") जहां शीट 1 वर्कशीट का कोडनाम है।

+0

हां, यही वह है जिसे मैं ढूंढ रहा था, धन्यवाद! – SteveNeedsSheetNames

+0

अब मैं पैरामरे आउटपुट के साथ एक दृश्य मूलभूत कार्य करना चाहता हूं, और मैं चाहता हूं कि आउटपुट किसी अन्य फ़ंक्शन में उपलब्ध न हो, इसे वर्कशीट पर रखने के लिए इसे उस दूसरे फ़ंक्शन में लेने के लिए। दृश्य मूल में कार्यों के बीच सरणी स्थानांतरित करने का कोई तरीका है? तुम्हारी प्रतिक्रिया के लिए अग्रिम धन्यवाद। – SteveNeedsSheetNames

3

आपको उपयोगकर्ता द्वारा प्रदान किए गए नाम द्वारा चादरों का संदर्भ देने में सक्षम होना चाहिए। क्या आप वाकई सही कार्यपुस्तिका का संदर्भ दे रहे हैं? यदि आपके पास एक शीट का संदर्भ देने पर एक से अधिक कार्यपुस्तिकाएं खुलती हैं, जो निश्चित रूप से समस्या का कारण बन सकती हैं।

यदि यह समस्या है, तो ActiveWorkbook (वर्तमान में सक्रिय कार्यपुस्तिका) या ThisWorkbook (मैक्रोज़ वाली कार्यपुस्तिका) का उपयोग करके इसे हल करना चाहिए।

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

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet") 
0

वहाँ (कम से कम) दो अलग अलग रूप में अयोग्य द्वारा Danm द्वारा संदर्भित

  • Worksheet वस्तु

      Sheets या Worksheets संग्रह के माध्यम से
    • को पाने के लिए तरीके हैं ऑब्जेक्ट नाम

    जब तीन वर्कशीट्स के साथ एक नई कार्यपुस्तिका बनाई जाती है तो वहां चार ऑब्जेक्ट मौजूद होंगे जिन्हें आप अयोग्य नामों के माध्यम से एक्सेस कर सकते हैं: ThisWorkbook; Sheet1; Sheet2; Sheet3

    Sheet1.Range("A1").Value = "foo" 
    

    हालांकि यह एक उपयोगी शॉर्टकट की तरह लग सकता है, समस्या तब आती है जब कार्यपत्रक नाम दिया जाता है: यह आप इस तरह बातें लिखने की सुविधा देता है। अयोग्य ऑब्जेक्ट नाम Sheet1 के रूप में बनी हुई है, भले ही वर्कशीट का नाम बदलकर पूरी तरह से अलग हो।

    इस वजह करने के लिए कुछ तर्क है:

    • कार्यपत्रक नाम चर नाम के रूप में ही नियमों के अनुरूप नहीं है
    • अगर आप गलती से एक मौजूदा चर

    मुखौटा हो सकता है उदाहरण के लिए (Excel 2003 में परीक्षण किया गया), तीन वर्कशीट्स के साथ एक नया Workbook बनाएं। दो मॉड्यूल बनाएँ।एक मॉड्यूल में इस की घोषणा:

    Public Sheet4 As Integer 
    

    अन्य मॉड्यूल पुट में:

    Sub main() 
    
    Sheet4 = 4 
    
    MsgBox Sheet4 
    
    End Sub 
    

    इस भागो और संदेश बॉक्स सही ढंग से दिखाई देनी चाहिए।

    अब कार्यपुस्तिका में चौथी वर्कशीट जोड़ें जो Sheet4 ऑब्जेक्ट बनाएगा। मुख्य बार फिर से चलाने का प्रयास करें और इस बार आपको "ऑब्जेक्ट इस संपत्ति या विधि का समर्थन नहीं करता है" त्रुटि

  • 0

    मुझे इसका सहारा लेना पड़ा, लेकिन इसमें रख-रखाव के साथ समस्याएं हैं।

    Function sheet_match(rng As Range) As String ' Converts Excel TAB names to the required VSB Sheetx names. 
        TABname = rng.Worksheet.Name    ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates. 
    ' Next, match this Excel sheet TAB name to the VSB Sheetx name: 
        Select Case TABname 'sheet_match 
         Case Is = "Sheet1": sheet_match = "Sheet1" ' You supply these relationships 
         Case Is = "Sheet2": sheet_match = "Sheet2" 
         Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB 
         Case Is = "Sheet4": sheet_match = "Sheet4" 
         Case Is = "Sheet5": sheet_match = "Sheet5" 
         Case Is = "Sheet6": sheet_match = "Sheet6" 
         Case Is = "Sheet7": sheet_match = "Sheet7" 
         Case Is = "Sheet8": sheet_match = "Sheet8" 
        End Select 
    End Function 
    
    1

    असल में "शीट 1" ऑब्जेक्ट/कोड नाम बदला जा सकता है। वीबीए में, एक्सेल ऑब्जेक्ट्स सूची में शीट 1 पर क्लिक करें। गुण विंडो में, आप आरईजी कहने के लिए शीट 1 बदल सकते हैं।

    फिर आप पहले एक चर बनाने के बिना आरएनजी को वैश्विक वस्तु के रूप में संदर्भित कर सकते हैं। तो debug.print rng.name बस ठीक काम करता है। वर्कशीट्स ("आरएनजी") नहीं। नाम।

    टैब के विपरीत, ऑब्जेक्ट का नाम अन्य चर (यानी कोई रिक्त स्थान) के समान प्रतिबंध नहीं है।

    0

    चादर कोडनेम जवाब मैं भी जरूरत का प्रयोग किया गया था से अधिक गिरने मैक्रो की एक श्रृंखला को रोकने के लिए - दर्पण this solution (स्क्रीन तस्वीरें के साथ)

    1

    यह एक बहुत ही बुनियादी समाधान ऊपर ccampj के जवाब (शायद मैं पूरी याद कर रहा हूँ प्रश्न का बिंदु)। ActiveSheet.Name वर्तमान टैब नाम की स्ट्रिंग को वापस कर देगा (और उपयोगकर्ता द्वारा भविष्य में किए गए किसी भी बदलाव को प्रतिबिंबित करेगा)। मैं सिर्फ सक्रिय शीट को कॉल करता हूं, चर सेट करता हूं और फिर इसे वर्कशीट्स ऑब्जेक्ट के रूप में उपयोग करता हूं। यहां मैं एक विभाजन के लिए एक रिपोर्ट सेट अप करने के लिए तालिका से डेटा पुनर्प्राप्त कर रहा हूं। यह मैक्रो मेरी कार्यपुस्तिका में किसी भी शीट पर काम करेगा जो एक ही फ़िल्टर (मानदंड और प्रतिलिपिणी) के लिए स्वरूपित है - प्रत्येक डिवीजन को अपनी शीट मिलती है और इस एकल मैक्रो का उपयोग करके मानदंडों को बदल सकती है और अपडेट कर सकती है।

    Dim currRPT As String 
    ActiveSheet.Select 
    currRPT = (ActiveSheet.Name) 
    Range("A6").Select 
    Selection.RemoveSubtotal 
    Selection.AutoFilter 
    Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _ 
        ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True 
    Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear 
    Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _ 
        Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
        xlSortNormal 
    
    +0

    प्रो लेट्स सेट सूचीबद्ध करने की समस्या सब्स Func कुछ वर्षों से मेरे साथ रही है जहां मॉड्यूल नाम शीट नाम कोड नाम एक गड़बड़ था .. यह ठीक करता है। आपकी कोड हैरी एस –

    3

    यह उनकी शीट की कि मैच के लिए (एक्सेल के नजरिए से) (VBA संपादक के नजरिए से) सभी कार्यपत्रक वस्तुओं के नाम बदल जाएगा:

    Sub ZZ_Reset_Sheet_CodeNames() 
    'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name) 
    
        Dim varItem As Variant 
    
        For Each varItem In ThisWorkbook.VBProject.VBComponents 
         'Type 100 is a worksheet 
         If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then 
          varItem.Name = varItem.Properties("Name").Value 
         End If 
        Next 
    End Sub 
    

    यह महत्वपूर्ण है ध्यान दें कि ऑब्जेक्ट नाम (कोडनाम) "(नाम)" संपत्ति नाम "नाम" द्वारा ओवरराइड किया जा रहा है, और इसलिए इसे उप-संपत्ति के रूप में संदर्भित किया जाना चाहिए।

    +0

    "विज़ुअल बेसिक प्रोजेक्ट के लिए प्रोग्रामेटिक एक्सेस विश्वसनीय नहीं है" - मैक्रो सेटिंग सक्षम करें http://stackoverflow.com/a/25638419/ – user423430

    +0

    प्रॉपर्टीज ("नाम")। वैल्यू बिल्कुल वैसा ही था जो मैं था धन्यवाद, धन्यवाद! – baldmosher

    +0

    प्रो लेट्स सेट सूचीबद्ध करने की समस्या सब्स Func कुछ वर्षों से मेरे साथ रही है जहां मॉड्यूल नाम शीट नाम कोड नाम एक गड़बड़ था .. यह ठीक करता है। आपकी कोड हैरी एस की बहुत सराहना की गई थी –