2009-01-15 4 views
10

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

Me.unprotect 
... 
Me.protect 

के साथ एक रन-टाइम त्रुटि

Run-time error '-2147417848 (80010108)':

Method 'Add' of object 'Validation' failed

मैं कोड लपेटकर की कोशिश की है को जन्म देती है लेकिन यह ठीक से काम नहीं करता है। तो, उपर्युक्त रन-टाइम त्रुटि के बिना शीट सुरक्षित होने पर मैं काम करने के लिए नीचे दिए गए कोड को संशोधित कर सकता हूं (यानी कोड अनलॉक सेल के सत्यापन को संशोधित करता है)?

अद्यतन

मेरे मूल कृति पुस्तक एक एक्सेल 2003 मैं Workbook_Open

Sub WorkBook_Open() 
    Me.Worksheets("MainTable").Protect contents:=True, userinterfaceonly:=True 
End Sub 

कोड अभी भी साथ रन निम्नलिखित में विफल रहता है के लिए निम्नलिखित परिभाषा के साथ Excel 2007 @eJames समाधान का परीक्षण किया है वर्कशीट सुरक्षित होने पर समय त्रुटि

Run-time error '1004': Application-defined or object-defined error

धन्यवाद, अज़ीम


कोड स्निपेट

'cell to add drop down validation list' 
dim myNamedRange as String 
dim modifyCell as Range 
modifyCell = ActiveCell.Offset(0,1) 


' set list values based on some conditions not defined for brevitity' 
If myCondition then 
    myNamedRange = "range1" 
Else 
    myNamedRange = "range2" 
End If 

With modifyCell.Validation 
    .Delete 

    'Run time error occurs on the next line' 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _ 
     Operator:=xlBetween, Formula1:="=" & myNamedRange 

    ... 
    ' skipping more property setting code ' 
    ... 
End With 
+0

संभव डुप्लिकेट [एक्सेल में कोशिकाओं की रक्षा कैसे करें, लेकिन इन्हें वीबीए स्क्रिप्ट द्वारा संशोधित करने की अनुमति दें] (http://stackoverflow.com/questions/125449/how-to-protect-cells-in-excel-but- पासवर्ड पर जानकारी के लिए –

उत्तर

11

अगर मैं सवाल सही ढंग से समझ, आप पत्रक की रक्षा हो जाएगा। अगर ऐसा है, तो आपको निम्न VBA का उपयोग कर सकते हैं: ": = सच userinterfaceonly"

myWorksheet.Protect contents:=True, userinterfaceonly:=True 

यहाँ महत्वपूर्ण हिस्सा है। जब इस ध्वज सेट के साथ वर्कशीट सुरक्षित होती है, तो वीबीए मैक्रोज़ को अभी भी परिवर्तन करने की अनुमति है।

इस कोड को WorkBook_Activate ईवेंट में रखें ताकि कार्यपुस्तिका को स्वचालित रूप से सुरक्षित किया जा सके और जब भी यह सक्रिय हो, ध्वज सेट कर सके।

संपादित करें:Lance Roberts के लिए धन्यवाद उनकी सिफारिश Workbook_Activate बजाय Workbook_Open का उपयोग करने के लिए।

संपादित करें: चूंकि उपर्युक्त काम नहीं कर रहा था, इसलिए आपको असुरक्षित/सुरक्षा आदेशों के साथ अपने वीबीए कोड के असफल हिस्से को लपेटना पड़ सकता है। आप ऐसा करते हैं, तो मैं भी पूरे मैक्रो एक त्रुटि हैंडलर के साथ, लपेट ताकि चादर एक त्रुटि के बाद असुरक्षित नहीं छोड़ा है:

Sub MyMacro 
    On Error Goto HandleError 

    ... 

    myWorksheet.unprotect 
    With ModifyCell.Validation 
     ... 
    End With 
    myWorksheet.protect contents:=True, userinterfaceonly:=True 

    ... 

Goto SkipErrorHandler 
HandleError: 
    myWorksheet.protect contents:=True, userinterfaceonly:=True 
    ... some code to present the error message to the user 
SkipErrorHandler: 
End Sub 

संपादित करें: PCreview पर this thread पर एक नज़र डालें। वे एक ही कदम से गुजर गए, और एक ही निष्कर्ष पर आए। कम से कम आप अकेले नहीं हैं!

+0

http://support.microsoft.com/kb/810788 अनुमति दें-इन-टू-संशोधित-द्वारा-vba-script)। – Fionnuala

+0

लिंक के लिए धन्यवाद, रेमो। मैंने अभी तक उस समस्या में भाग नहीं लिया है, लेकिन कम से कम अब मुझे पता चलेगा कि ऐसा होने पर क्या हो रहा है! –

+0

हाँ आप मेरे प्रश्न को सही ढंग से समझ गए हैं; मैं चादर की रक्षा कर रहा हूं। मैंने आपके समाधान (एक्सेल 2007 में) की कोशिश की और वर्कशीट सुरक्षित होने पर रन-टाइम त्रुटि '1004' प्राप्त करें। – Azim

2

मुझे यकीन नहीं है कि यह एक सार्वभौमिक समाधान है, लेकिन जब मुझे हाल ही में यह त्रुटि हुई, तो मुझे बस एक माईवशीट करना पड़ा। प्रमाणीकरण करने से ठीक पहले सक्रिय करें। जोड़ें।तो:

' set list values based on some conditions not defined for brevitity' 
If myCondition then 
    myNamedRange = "range1" 
Else 
    myNamedRange = "range2" 
End If 

''-------------------------------------------------- 
Sheets("mysheet").Activate 
''-------------------------------------------------- 

With modifyCell.Validation 
    .Delete 

    'Run time error occurs on the next line' 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAltertStop, _ 
     Operator:=xlBetween, Formula1:="=" & myNamedRange 

    ... 
    ' skipping more property setting code ' 
    ... 
End With 

मेरे मामले में, ScreenUpdating बंद पहले से ही था, इसलिए उपयोगकर्ता कभी नहीं देखता है आगे और पीछे स्विचन चादरें। HTH।