2012-02-07 16 views
7

मैं कैच-ऑल रनटाइम त्रुटि 1004 मिलता है, जब, ठीक है, एक रेंज वस्तु के Locked गुण सेट करने की कोशिश कर "श्रेणी वर्ग के बंद गुण सेट करने में असमर्थ"। कोड इस तरह दिखता है:त्रुटि 1004 जब स्थापित करने Range.Locked

that_goddamn_sheet.Unprotect 

; Determine if we should proceed 

that_goddamn_range.Locked = True 

; Do more stuff 

that_goddamn_sheet.Protect 

जब मैं लाइन पर एक ब्रेकपाइंट सेट और तत्काल खिड़की से that_goddamn_range.Locked का मूल्य क्वेरी करने के लिए, इस समस्या के बिना काम करता कोशिश, लेकिन यह विफल रहता है की स्थापना।

अगर, हालांकि, मैं that_goddamn_range.Select चलाने के लिए, मैक्रो को तोड़ने, चादर असुरक्षित (यह चयन परिवर्तन पर स्वचालित रूप से reprotected हो जाता है) तो राइट क्लिक, गुण, संरक्षण टैब पर स्विच लेने और उसके बाद बंद की पुष्टि निशान लगाएं, चीजों को फिर भी ठीक काम ।

संभवतः गलत क्या हो सकता है?

+0

त्रुटि संदेश का पाठ क्या है? –

+0

@Tim अच्छा बिंदु, प्रश्न में शामिल है। – badp

उत्तर

3

[the sheet] gets reprotected automatically on selection change

शीट, किसी कारण के लिए, जो अपने आप विधि के बीच में reprotected। Locked संपत्ति की सेटिंग से पहले इसे फिर से असुरक्षित करना मेरी समस्या को ठीक करता है।

मेरे पास वास्तव में कई श्रेणियां थीं जिन्हें मुझे एक पंक्ति में लॉक करने की आवश्यकता थी, और प्रत्येक संपत्ति परिवर्तन से पहले शीट को असुरक्षित करना पड़ा।

3

आप एक सेल को लॉक नहीं कर सकते हैं जो विलय कोशिकाओं की एक श्रृंखला का हिस्सा है जब तक कि यह ऊपरी-बाएं कोने सेल न हो। निम्नलिखित कोशिकाओं के किसी भी सेल या विलय क्षेत्र के लिए काम करता है।

आमतौर पर, इस त्रुटि के दो कारण हैं:: और/या बंद संपत्ति को बदलने की कोशिश कर रहा एक संरक्षित शीट पर एक सेल की बंद संपत्ति को बदलने की कोशिश कर रहा

Sub LockCells() 
    Dim R As Range 
    ActiveSheet.Unprotect 
    Cells.Locked = False 
    For Each R In Range("A1", Cells.SpecialCells(xlCellTypeLastCell).Address) 
     If R.MergeArea.Range("A1").Address = R.Address And R.HasFormula Or IsText(R) Then 
     R.MergeArea.Locked = True 
     End If 
    Next 
    ActiveSheet.Protect 
End Sub 

Function IsText(What) As Boolean 
    IsText = False 
    On Error Resume Next 
    IsText = (CDbl(What) <> What) 
    If Err.Number Then IsText = True 
End Function 
12

यहाँ एक पूर्ण विवरण है एक विलय रेंज में एक एकल सेल का।

पहले मामले में, आप पत्रक अनलॉक कर सकते हैं या सेट इसके लिए UserInterfaceOnly सुरक्षा है, जो अत्यधिक की सिफारिश की है, क्योंकि आप तो बार-बार अनलॉक/यह ताला लगा के साथ गड़बड़ की जरूरत नहीं है सकते हैं।

मर्ज किए गए कक्षों के संबंध में, आप एक एकल कोशिका कि मर्ज की गई श्रेणी का हिस्सा है लॉक नहीं कर सकते हैं लेकिन वहाँ उचित विकल्प हैं:

  • आप सेल का पता अंकन उपयोग कर रहे हैं सेल संदर्भ के लिए/रेंज,

    Range("A1").Locked = True

    फिर पूरे मर्ज की गई श्रेणी को संदर्भित बजाय:

    Range("A1:A3").Locked = True 'where "A1:A3" is the entire merged range

  • यदि आप मर्ज किए गए सेल के सेट के लिए नामित श्रेणी का उपयोग कर रहे हैं, तो डिफ़ॉल्ट रूप से इसे केवल मर्ज किए गए कक्षों के पहले संदर्भित करने के लिए परिभाषित किया जाएगा।आप अपनी परिभाषा संपादित कर सकते हैं या तो पूरा मर्ज की गई श्रेणी में शामिल हैं या उसके संबंधित मर्ज की गई श्रेणी को संदर्भित करने के अपने MergeArea संपत्ति का उपयोग करें:

    Range(“SomeNamedRange”).MergeArea.Locked = True

    लेकिन ध्यान दें कि आप ऐसा नहीं कर सकते दोनों MergeArea संपत्ति के बाद से जाहिर है, एक सीमा के लिए अपरिभाषित है जो एक बड़े विलय वाले क्षेत्र के सबसेट सख्त नहीं है!

  • बेशक, आप हमेशा शामिल सेल की लॉक संपत्ति को सेट करने से पहले मर्ज किए गए रेंज को अनमर्ज कर सकते हैं और उसके बाद इसे बाद में फिर से विलय कर सकते हैं, लेकिन मैंने कभी ऐसी स्थिति नहीं देखी है जिसमें उपरोक्त दो समाधानों में से एक नहीं था पर्याप्त (और बहुत साफ)।

0

मैं एक ही समस्या थी और मैन्युअल रूप से सेल छुपाने के लिए, और निम्न चेतावनी प्राप्त करने की कोशिश की: "। शिफ्ट नहीं किया जा सकता चादर बंद वस्तुओं"

मेरी समस्या एक ही शीट की कोशिकाओं में कुछ टिप्पणियां थीं। शीट की सभी टिप्पणियों को हटाने के बाद, कोड चलता है।

मेरा कोड केवल कॉलम में मिलान केस का उपयोग करके पंक्ति ढूंढता है (क्योंकि मुझे कुछ पंक्तियां डालने की आवश्यकता है और कॉलम "बी" पंक्ति की पहचान करने का मेरा संदर्भ है)।

मेरा कोड। पंक्तियां ((वर्कशीटफंक्शन। मैच (1, रेंज ("बी: बी"), 0)) - 1 & ":" & (वर्कशीटफंक्शन। मैच (13, रेंज ("बी: बी"), 0)) + 15) .ntireRow.Hidden = True

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