2010-10-01 23 views
23

में वर्कशीट बनाना और नामकरण करना मेरे पास कुछ बहुत ही सरल कोड है जो वर्तमान वर्कशीट के बाद, एक एक्सेल दस्तावेज़ में एक नई वर्कशीट जोड़ता है, और उसके बाद उपयोगकर्ता नाम पर टेक्स्ट बॉक्स में दर्ज किए गए एक को अपना नाम बदल देता है। एक नई कार्यपुस्तिका पर ठीक काम करता है, हालांकि एक कार्यपुस्तिका में जिसमें कई मौजूदा वर्कशीट हैं, यह नई वर्कशीट बनाता है, लेकिन इसका नाम नहीं बदलता है।एक्सेल वीबीए

यह पहली बार होता है जब आप इस कोड को चलाते हैं, अगली बार यह ठीक चल जाएगा। यह चीज जो इसे अजनबी बनाती है वह यह है कि यदि आप वीबीए संपादक को खोलने और डीबग करने के लिए खोलते हैं, तो यह ठीक से चलता है। यह स्पष्ट रूप से त्रुटि को बहुत मुश्किल बनाता है।

कोड मैं उपयोग कर रहा हूँ यहाँ है:

 Dim WS As Worksheet 

    Set WS = Sheets.Add(After:=Sheets(Worksheets.count)) 
    WS.name = txtSheetName.value 
सुंदर सरल

। मैं सोच रहा हूं कि क्या यह समस्या यह है कि यह सही ढंग से बनाए जाने से पहले शीट का नाम बदलने का प्रयास कर रहा है? क्या इस कोड को लिखने का कोई बेहतर तरीका है?

अद्यतन: मैं इस msgboxes का उपयोग कर डिबगिंग शुरू कर दिया है, के रूप में डिबगर खोलने समस्या बंद है, और यह आधे रास्ते के माध्यम से यह सिर्फ कोड प्रसंस्करण बंद हो जाता है कि लगता है:

Dim WS As Worksheet 
    MsgBox (WS Is Nothing) 

    Set WS = Sheets.Add(After:=Sheets(Worksheets.count)) 
    '***** Nothing after this point gets processed ******* 
    MsgBox (WS Is Nothing) 
    MsgBox WS.name 

    WS.name = txtSheetName.value 
    MsgBox WS.name 
+1

एक्सेल के पास आपको खुश रखने के कई तरीके हैं।अक्सर आप इसके बारे में कुछ भी नहीं कर सकते हैं। विभिन्न अपेक्षाकृत बेकार चीज़ों को आजमाएं, जैसे 'शीट्स' के बजाय 'वर्कशीट्स' संग्रह का उपयोग करना या पहले स्ट्रिंग वैरिएबल में 'txtSheetName.value' असाइन करना। – GSerg

+0

ऐसा लगता है कि आप txtSheetName में नाम से पहले नाम सेट कर रहे हैं। क्या आप इस कोड को txtSheetName_Change ईवेंट से बंद कर रहे हैं? यदि नहीं, तो यह शायद समस्या को ठीक करेगा। –

+0

@Marc ईवेंट एक बटन ईवेंट से चलाया जाता है, जो मान्य करता है कि टेक्स्ट बॉक्स –

उत्तर

27

http://www.mrexcel.com/td0097.html

Dim WS as Worksheet 
Set WS = Sheets.Add 

आपको यह नहीं पता होना चाहिए कि यह कहां स्थित है, या इसका नाम क्या है, आप इसे केवल डब्ल्यूएस के रूप में संदर्भित करते हैं।
आप अभी भी इस "पुराने जमाने" तरीके से करना चाहते हैं, इस प्रयास करें:

Sheets.Add.Name = "Test" 
+0

ओपी क्या कर रहा है उससे अलग कैसे है? – GSerg

+0

मैंने लेख नहीं लिखा, मैंने उसे एक स्रोत के लिए इंगित किया। जब मैंने आलेख में कोड का परीक्षण किया, विशेष रूप से [शीट्स.एड.नाम = "टेस्ट"] यह बेकार ढंग से काम करता था। – Sage

+4

हां, मैंने कोशिश की है। समस्या यह है कि यह दूसरी बार बेकार ढंग से काम करता है, या आप डीबगर खोलते हैं या शीट खाली है, या चंद्रमा तीसरी तिमाही में है ... –

0

आप बटन (Enter दबा कर) दबाने से पहले सेल करने से कर रहे हैं? एक शीट नाम देने के लिए इस्तेमाल किए जाने से पहले सेल की सामग्री को संग्रहीत किया जाना चाहिए।

ऐसा करने का एक बेहतर तरीका एक संवाद बॉक्स पॉप अप करना और वह नाम प्राप्त करना है जिसका आप उपयोग करना चाहते हैं।

+0

यह उपयोगकर्ता के फॉर्म पर एक टेक्स्ट बॉक्स से नाम ले रहा है। –

2

क्या आप एक त्रुटि हैंडलर का उपयोग कर रहे हैं? यदि आप त्रुटियों को अनदेखा कर रहे हैं और किसी शीट को मौजूदा शीट या अमान्य वर्णों के नाम के समान नाम देने का प्रयास करते हैं, तो यह उस पंक्ति पर बस छोड़ सकता है। अमान्य वर्ण है कि आप के लिए जाँच करने के लिए चाहते हो सकता है की एक सूची के लिए CleanSheetName समारोह यहां

http://www.dailydoseofexcel.com/archives/2005/01/04/naming-a-sheet-based-on-a-cell/

देखें।

अद्यतन

तुएं: पूरी तरह से योग्य संदर्भ, एक DoEvents, कोड सफाई में फेंक। यह कोड इस वर्कबुक के संदर्भ में आपके शीट्स संदर्भ को योग्य बनाता है (यदि आप उपयुक्त हैं तो आप इसे सक्रिय वर्कबुक में बदल सकते हैं)। यह एक हजार DoEvents भी जोड़ता है (बेवकूफ ओवरकिल, लेकिन अगर कुछ करने में कुछ समय लग रहा है, तो यह इसकी अनुमति देगा - अगर आपको वास्तव में कुछ भी ठीक हो जाता है तो आपको केवल एक DoEvents की आवश्यकता हो सकती है)।

Dim WS As Worksheet 
Dim i As Long 

With ThisWorkbook 
    Set WS = .Worksheets.Add(After:=.Sheets(.Sheets.Count)) 
End With 

For i = 1 To 1000 
    DoEvents 
Next i 

WS.Name = txtSheetName.Value 

अंत में, जब भी मैं एक नासमझ VBA समस्या यह है कि सिर्फ मतलब नहीं है, मैं रोब Bovey के CodeCleaner का उपयोग करें। यह एक ऐड-इन है जो आपके सभी मॉड्यूल को टेक्स्ट फ़ाइलों में निर्यात करता है और फिर उन्हें फिर से आयात करता है। आप इसे मैन्युअल रूप से भी कर सकते हैं। यह प्रक्रिया किसी भी दूषित पी-कोड को साफ़ करती है जो आसपास लटक रही है।

+0

दुर्भाग्यवश नहीं, मैं त्रुटियों को अनदेखा नहीं कर रहा हूं, और नाम दूसरी बार काम करता है जो आप इसे चलाते हैं जो मुझे बताता है कि यह ठीक है। –