2013-10-26 10 views
6

चयन करने के लिए मैं कोड का निम्न भाग है:हैंडल रद्द रेंज

dim selectRange as Range 
Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8) 

एक उपयोगकर्ता चुनता है रद्द InputBox शीघ्र, यह रिटर्न error of Object not set

मैंने एक वैरिएंट वैरिएबल प्रकार का उपयोग करने का प्रयास किया है लेकिन मैं इसे संभाल नहीं सकता। रद्द करने के मामले में, यह False देता है, इस बीच एक श्रेणी चुनने के मामले में, यह इनपुटबॉक्स की रेंज देता है।

मैं इस त्रुटि से कैसे बच सकता हूं?

+0

समस्या नहीं है कोड की इन दो पंक्तियों में, शायद यह उन पंक्तियों में है जो उनका अनुसरण करते हैं। हमें उन पंक्तियों को दिखाएं। – RBarryYoung

उत्तर

4

यह एक समस्या है जब इनपुटबॉक्स के साथ चयन श्रेणी होती है। रेंज वापस आने से पहले एक्सेल एक त्रुटि देता है, और जब आप रद्द करते हैं तो यह त्रुटि तब होती है।

इसलिए आपको सक्रिय रूप से इस त्रुटि को संभालना चाहिए। आप तो होना ही जब आप रद्द दबाएँ कुछ भी नहीं करना चाहते हैं, तो आप सिर्फ इस तरह कोड का उपयोग कर सकते हैं:

Sub SetRange() 
    Dim selectRange As Range 

    On Error Resume Next 
     Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8) 
    Err.Clear 
    On Error GoTo 0 
End Sub 
+0

इसके लिए धन्यवाद, मुझे लगता है कि यह इस तरह vbcancel पर त्रुटियों को संभालने के लिए बेकार है, लेकिन कोई अन्य विकल्प नहीं है। – Raystafarian

1

मैं ने पाया है कि "आवश्यक वस्तु" के लिए जाँच त्रुटि है कि आप का उल्लेख से निपटने का एक तरीका है रद्द करना

On Error Resume Next 
dim selectRange as Range 
' InputBox will prevent invalid ranges from being submitted when set to Type:=8. 
Set selectRange = Application.InputBox("Select your range", "Hello", , , , , , 8) 
' Check for cancel: "Object required". 
If Err.Number = 424 Then 
    ' Cancel. 
    Exit Sub 
End If 
On Error GoTo 0 
4

मैं पार्टी यहाँ करने के लिए देर हो रही है लेकिन यह केवल जगह मैं मिल सकता है कि क्यों मैं मुसीबत सिर्फ कुछ नहीं के लिए मेरी चर जाँच हो रही थी समझाया था। जैसा कि स्वीकृत उत्तर में बताया गया है, vbCancel किसी श्रेणी ऑब्जेक्ट पर स्ट्रिंग ऑब्जेक्ट के समान नहीं है। त्रुटि को एक त्रुटि हैंडलर से पकड़ा जाना चाहिए।

I त्रुटि हैंडलर से नफरत है। इसलिए मैं यह अपने आप ही समारोह

Private Function GetUserInputRange() As Range 
    'This is segregated because of how excel handles cancelling a range input 
    Dim userAnswer As Range 
    On Error GoTo inputerror 
    Set userAnswer = Application.InputBox("Please select a single column to parse", "Column Parser", Type:=8) 
    Set GetUserInputRange = userAnswer 
    Exit Function 
inputerror: 
    Set GetUserInputRange = Nothing 
End Function 
अब मेरी मुख्य उप में

को अलग कर सकते हैं मैं

dim someRange as range 
set someRange = GetUserInputRange 
if someRange is Nothing Then Exit Sub 

किसी भी तरह यह स्वीकार किया जवाब के रूप में एक ही है क्योंकि यह केवल के साथ इस त्रुटि को संभालने के लिए अनुमति देता है नहीं है एक विशिष्ट त्रुटि हैंडलर और resume next की आवश्यकता नहीं है या शेष प्रक्रिया को उसी तरह से संभाला गया है। अगर कोई यहां समाप्त होता है जैसे मैंने किया था।

4

हालांकि यह प्रश्न थोड़ा बड़ा है, फिर भी मैं बिना किसी त्रुटि के उचित तरीका दिखाना चाहता हूं। आप इसे या तो फ़ंक्शन के माध्यम से या उप के साथ कर सकते हैं।

Sub test() 
    Dim MyRange As Range 

    testSub Application.InputBox("dada", , , , , , , 8), MyRange 'doing via Sub 
    Set MyRange = testFunc(Application.InputBox("dada", , , , , , , 8)) ' doing via function 

    If MyRange Is Nothing Then 
    Debug.Print "The InputBox has been canceled." 
    Else 
    Debug.Print "The range " & MyRange.Address & " was selected." 
    End If 
End Sub 

उप -तरह (अजीब) होगा:

Sub testSub(ByVal a As Variant, ByRef b As Range) 
    If TypeOf a Is Range Then Set b = a 
End Sub 

और समारोह दिखाई देगा:

आपका मुख्य प्रक्रिया कुछ इस तरह है

Function testFunc(ByVal a As Variant) As Range 
    If TypeOf a Is Range Then Set testFunc = a 
End Function 

अब बस आप जिस तरह से आप पसंद करते हैं और अप्रयुक्त लाइन को हटा दें।

यदि उप-फ़ंक्शन को कॉल करना आपको पैरामीटर को Set करने की आवश्यकता नहीं है। उस ने कहा, इससे कोई फर्क नहीं पड़ता कि InputBox कोई ऑब्जेक्ट देता है या नहीं। आपको बस इतना करना है कि पैरामीटर वह ऑब्जेक्ट है जिसे आप चाहते हैं या नहीं और उसके अनुसार कार्य करें।

संपादित

एक और स्मार्ट तरीका इस तरह एक संग्रह के साथ समान व्यवहार उपयोग कर रहा है:

Sub test() 
    Dim MyRange As Range 
    Dim MyCol As New Collection 

    MyCol.Add Application.InputBox("dada", , , , , , , 8) 
    If TypeOf MyCol(1) Is Range Then Set MyRange = MyCol(1) 
    Set MyCol = New Collection 

    If MyRange Is Nothing Then 
    Debug.Print "The inputbox has been canceled" 
    Else 
    Debug.Print "the range " & MyRange.Address & " was selected" 
    End If 
End Sub 

आप अभी भी कोई प्रश्न हैं, बस पूछना;)

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