2013-04-26 10 views
5

मैं मैक 2011एक्सेल मैक 2011 के लिए: UBound() काम नहीं कर रहा

के लिए एक मौजूदा मैक्रो-सक्षम स्प्रेडशीट एक्सेल पर कार्यात्मक बनाने पर काम कर रहा हूँ मैं एक समारोह (Source) है कि एक निर्धारित मूल्य के लिए सरणियों खोज :

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

यह एक्सेल 2013 में पूरी तरह से काम करता है, लेकिन मैक 2011 के लिए Excel पर, मैं त्रुटि प्राप्त:

Runtime error '9': Subscript out of range 

मैं इसे अलग तोड़ दिया और पाया कि UBound कॉल क्या है त्रुटि का कारण बन रहा है।

मैं रखरखाव के लिए जितना संभव हो सके बदलना चाहता हूं। मैक संस्करण के लिए मैं इस त्रुटि को कैसे ठीक कर सकता हूं?

किसी भी उत्तर के लिए अग्रिम धन्यवाद!

संपादित करें: @Siddharth राउत के समाधान के स्थान है, लेकिन बाद से मैं एक पाश के भीतर सरणियों खोज रहा था, मैं एक यात्रा के बीच सरणी रीसेट करने के लिए इस प्रकार है पाश को संशोधित करने के लिए किया था (मामले में किसी और को एक ही में चलाता है मुद्दा!):

' --- START Reset Array for OS X --- 
Dim OS_X_Hack(99) As String 

For intIndex = 0 To 99 
    OS_X_Hack(intIndex) = Original(intIndex) 
Next 

Erase Original() 
ReDim Original(0 To 99) As String 

For intIndex = 0 To 99 
    Original(intIndex) = OS_X_Hack(intIndex) 
Next 

Erase OS_X_Hack() 
' --- END Reset Array for OS X --- 
+0

बस Excel 2011 में इसका परीक्षण किया। यह मेरे लिए बिल्कुल ठीक काम करता है। आशा है कि आप एक समारोह में एक ऐरे पास कर रहे हैं? क्या आप मुझे दिखा सकते हैं कि आप इस फ़ंक्शन को कैसे कॉल कर रहे हैं? –

उत्तर

4

ठीक है यह मेरा अवलोकन है। यदि आप प्रक्रिया में एक बार फ़ंक्शन को कॉल करते हैं तो यह ठीक काम करेगा। उदाहरण

लिए
Sub Sample() 
    Dim a As Variant 
    Dim s As String 
    Dim strTemp As String 

    s = "CC" 
    strTemp = "A,B,C,D" 

    a = Split(strTemp, ",") 

    Debug.Print IsInArray(s, a) 
End Sub 

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

enter image description here

लेकिन यदि आप प्रक्रिया में दो बार इसे कहते तो आपको एक त्रुटि Runtime error '9': Subscript out of range मिल जाएगा। शायद यह एक एक्सेल 2011 बग है?

Sub Sample() 
    Dim a As Variant 
    Dim s As String 
    Dim strTemp As String 

    s = "CC" 
    strTemp = "A,B,C,D" 

    a = Split(strTemp, ",") 

    Debug.Print IsInArray(s, a) 

    s = "A" 
    Debug.Print IsInArray(s, a) 
End Sub 

enter image description here

समाधान

सरणी से बनाएं। यह उदाहरण देखें। इस समाधान के लिए

Sub Sample() 
    Dim a As Variant 
    Dim s As String 
    Dim strTemp As String 

    s = "CC" 
    strTemp = "A,B,C,D" 

    a = Split(strTemp, ",") 
    Debug.Print IsInArray(s, a) 

    s = "A" 
    a = Split(strTemp, ",") 
    Debug.Print IsInArray(s, a) 
End Sub 

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

enter image description here

+0

बहुत बढ़िया; बहुत बहुत धन्यवाद! जिस सरणी को मैं खोज रहा था वह एक लूप में था, इसलिए मैंने इसे रीसेट करने के लिए एक विधि में जोड़ा (मूल प्रश्न में संपादित)। –

+1

@CameronSumpter मुझे लगता है कि आपकी समस्या यह हो सकती है कि आपने एक संस्करण के रूप में अपनी सरणी को एक स्ट्रिंग सरणी ("मंद ए() स्ट्रिंग" के रूप में परिभाषित किया है) ("डि ए ए वेरिएंट") के रूप में परिभाषित किया है। जब मैं संस्करण में बदल गया, सिद्धार्थ का समाधान मेरे लिए काम करता था-यानी, मिटाएं() और रीडीम() का उपयोग किए बिना। – litturt

0

क्रेडिट this answer by Brian Hinchey को जाता है। नीचे दिए गए कोड का उपयोग करके, मैं मैक 2011 के लिए एक्सेल में एक लूप के भीतर IsInArray को कॉल करने में सक्षम हूं।

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0)) 
End Function 
संबंधित मुद्दे