2015-05-27 8 views
18

मैंने जितना संभव हो उतना ऑनलाइन देखा है (माइक्रोसॉफ्ट समर्थन वेबसाइट को छोड़कर, जो कि किसी कारण से काम पर अवरुद्ध है)। मैं बस एक त्रुटि छोड़ने की कोशिश कर रहा हूँ। यहां लिखा गया मेरा कोड सरलीकृत है लेकिन उसी तरह काम करना चाहिए।वीबीए एक्सेल सरल त्रुटि

मेरी कोड करने के लिए माना जाता है क्या: एक मेरे बाद के चरणों की एक पाश में आकृति और नाम बनाता है उन्हें (btn_1, btn_2, आदि)। लेकिन उन्हें बनाने से पहले, यह एक उप-कॉल करता है जो उन्हें हटाने की कोशिश करता है ताकि डुप्लीकेट न बनें। इस उप (btn_1, btn_2, आदि) के माध्यम से लूप और का उपयोग कर आकार हटाता है:

for i = 1 to (a certain number) 
    Set shp = f_overview.Shapes("btn_" & i) 
    shp.delete 
next 
बेशक

, ऐसा होता है कि आकार, क्योंकि यह बस मौजूद नहीं है हटाया नहीं जा सकता। मैंने पाया है कि अधिकांश समय, आकार निर्धारित करने से पहले संशोधित फ़िक्स (अगली बार फिर से शुरू करने पर) जोड़ना है, क्योंकि मुझे यह कहते हुए एक त्रुटि मिलती है कि यह अस्तित्व में नहीं है। मैं, पाश अंदर यह कोशिश की है, पाश से पहले आदि, इसलिए जैसे:

for i = 1 to (a certain number) 
    On Error Resume Next 
    Set shp = f_overview.Shapes("btn_" & i) 
    shp.delete 
next 

जहां तक ​​मैं समझता हूँ कि यह सही के माध्यम से करता है, तो आकार मौजूद नहीं है पाश माना जाता है, लेकिन मैं अभी भी एक ही मिलता है त्रुटि करें कि मैं ऑन त्रुटि फिर से शुरू करता हूं या नहीं! मैं क्या गलत कर रहा हूं?

संपादित करें: आकार मौजूद होने पर कोई त्रुटि नहीं है।

उत्तर

8

ऐसा लगता है कि आप विकल्प सेट फँसाने गलत त्रुटि है। वीबीए संपादक के भीतर, Tools -> Options का चयन करें। खुलने वाली विंडो में, General tab का चयन करें, और Break on Unhandled Errors रेडियो बटन चुनें। यह एक्सेल को On Error Resume Next कमांड को सही तरीके से संसाधित करने की अनुमति देनी चाहिए।

मुझे संदेह है कि आपके पास Break on All Errors चयनित है।

+0

धन्यवाद! मैंने अन्य उत्तरदाताओं के सुझावों की कोशिश की और सभी असफल रहे। यही कारण है कि हालांकि उन्होंने मूल्यवान जानकारी भी प्रदान की! –

+0

@ डेविड ग्रैंड मैमिसन मैं मानता हूं कि अन्य उत्तरों में किए गए त्रुटि प्रबंधन को क्लीनर और बेहतर है। लेकिन आपका मूल कोड काम करना चाहिए था। – Degustaf

2

प्रयास करें:

On Error Resume Next 

for i = 1 to (a certain number) 
    Set shp = f_overview.Shapes("btn_" & i) 
    if err<>0 then err.clear else shp.delete 
next 

on Error Goto 0 
14

आकारों को अंधाधुंध हटाने और त्रुटियों को छोड़ने की कोशिश करने के बजाय, ज्ञात आकारों की सूची के माध्यम से क्यों न चलें और उन्हें हटाएं। तो आपको On Error Resume Next के बारे में चिंता करने की ज़रूरत नहीं है जो अक्सर दुर्व्यवहार किया जा रहा है।

Sub Test(TheSheet As Worksheet) 

Dim Shp as Shape 

For Each Shp in TheSheet.Shapes 
    If left(Shp.Name, 4) = "btn_" Then 
    Shp.Delete 
    End if 
Next 

End Sub 

यदि आप सभी आकारों को हटाना चाहते हैं, तो If कथन हटा दें। यदि आप कई अलग-अलग नामों को हटाना चाहते हैं, तो If कथन उचित रूप से संशोधित करें।

+0

++ आकृतियों को हटाने का एक और अच्छा तरीका :) –

+0

एएच उत्कृष्ट! इस तरह से मैं इसे करने का विकल्प चुनूंगा। फिक्स के लिए धन्यवाद। उत्तर के लिए +1, भले ही आप त्रुटि प्रबंधन का उपयोग कैसे करें :-) –

+0

आप त्रुटि प्रबंधन विवरण की कमी के बारे में सही हैं - इस लूप को इसकी आवश्यकता नहीं है, विशेष रूप से जिस तरह से आप सोच रहे थे। [मैट्स मग] (http://stackoverflow.com/a/30489275/2344413) सामान्य रूप से त्रुटि प्रबंधन को कवर करने का एक अच्छा काम करता है। – FreeMan

22

मुझे पता चला है कि अधिकांश समय, आकार को सेट करने से पहले रिक्त अनुक्रम (अगली बार फिर से शुरू करने पर) जोड़ना है, क्योंकि मुझे यह कहते हुए एक त्रुटि मिलती है कि यह अस्तित्व में नहीं है।

नहीं! जो है कि वास्तव में क्या On Error Resume Next है -

संभाल क्रम त्रुटियों के लिए सुझाया गया तरीका कालीन के तहत उन्हें धक्का और निष्पादन जारी रखने के लिए जैसे कि कुछ हुआ नहींहै।

For i = 1 To (a certain number) 
    Set shp = f_overview.Shapes("btn_" & i) 
    If Not shp Is Nothing Then shp.Delete 
Next 
:

सबसे आसान तरीका करने से बचने के क्रम त्रुटियों एक वस्तु संदर्भ कि Nothing है पर एक विधि को चलाने के लिए कोशिश की तरह त्रुटि की स्थिति के लिए जाँच, और कोड है कि 100% की विफलता की दर में जो परिणाम को क्रियान्वित करने से बचने के लिए, है


मामलों में जहां आप त्रुटि की स्थिति और चाहिए संभाल त्रुटियों की जांच नहीं कर सकते में, सुझाया गया तरीका संभाल करने के लिए उन्हें है:

Private Sub DoSomething() 
    On Error GoTo CleanFail 

    '...code... 

CleanExit: 
    'cleanup code here 
    Exit Sub 

CleanFail: 
    If Err.Number = 9 Then 'subscript out of range 
     Err.Clear 
     Resume Next 
    Else 
     MsgBox Err.Description 
     Resume CleanExit 
    End If 
End Sub 
+1

++ उचित त्रुटि हैंडलिंग पर + –

+0

@ सिद्धार्थ राउट हाँ, सिवाय इसके कि मैंने इसका परीक्षण नहीं किया और अब जितना अधिक मैं सोचता हूं, उतना ही मुझे लगता है कि असाइनमेंट 'रेंज' त्रुटि से बाहर निकल जाएगा, इस मामले में [फ्रीमैन का जवाब] (http://stackoverflow.com/a/30489225/1188513) का एक बेहतर समाधान है। –

+0

वह; ठीक है :) अपना उपरोक्त कोड संपादित करें। मेरी टिप्पणी उचित त्रुटि प्रबंधन थी जिसे आपने पोस्ट के नीचे दिखाया था। मैंने इसके बारे में भी मेरे पोस्ट में उल्लेख किया :) –

13

OERN का उपयोग कर (त्रुटि को फिर से शुरू अगला) में गलत कुछ भी नहीं है कि आप समझते हैं कि आप क्या कर रहे हैं और यह आपके कोड को प्रभावित करने जा रहा है प्रदान की है।

आपके मामले में यह पूरी तरह OERN

Dim shp As Shape 

For i = 1 To (a certain number) 
    On Error Resume Next 
    Set shp = f_overview.Shapes("btn_" & i) 
    shp.Delete 
    On Error GoTo 0 
Next 

उपयोग करने के लिए एक ही समय में यह सुनिश्चित करें कि आप की तरह

On Error Resume Next 
<Your Entire Procedure> 
On Error GoTo 0 

यह कुछ ऐसा नहीं करते हैं सभी त्रुटियों को दबाने जाएगा सामान्य है। के रूप में मैट

संपादित द्वारा दिखाए गए उचित त्रुटि हैंडलिंग का उपयोग करें:

यहाँ एक विशेष वर्कशीट मौजूद है या नहीं, तो कैसे OERN यह फ़ंक्शन जांच का उपयोग करने पर एक और सुंदर उदाहरण है।

Function DoesWSExist(wsName As String) As Boolean 
    Dim ws As Worksheet 

    On Error Resume Next 
    Set ws = ThisWorkbook.Sheets(wsName) 
    On Error GoTo 0 

    If Not ws Is Nothing Then DoesWSExist = True 
End Function 

यदि आप चाहते हैं कि आप चेक करने के लिए सभी चादरों के माध्यम से लूप भी कर सकते हैं तो शीट मौजूद है या नहीं!

+0

धन्यवाद! हालांकि, यह असफल रहा क्योंकि कारण गलत सेटिंग्स थी (चयनित उत्तर देखें)। –

+3

++ लेकिन दुर्भाग्यवश अधिकांश ओईआरएन का उपयोग करने के प्रभावों को समझ में नहीं आता है। मुझे वह संक्षिप्त शब्द बीटीडब्ल्यू पसंद है।मैं इसे रख रहा हूँ – RubberDuck