2013-05-17 21 views
12

में ByRef तर्क प्रकार मेल नहीं है मैं वीबीए के साथ काम कर रहा हूं। मैंने एक उपयोगकर्ता को परिभाषित फ़ंक्शन लिखा है जो string लेता है, इसे संसाधित करता है और string साफ़ करता है। मुझे यकीन नहीं है कि इसमें क्या गलत है। मैं इसे कॉल करने में सक्षम नहीं हूं और इसे अपनी स्ट्रिंग को संसाधित करने और इसे वापस करने के लिए कहता हूं। मैं सोच रहा हूं कि जिस तरह से मैं परिभाषित कर रहा हूं या इसे वापस कर रहा हूं, वहां कोई गलती है।एक्सेल वीबीए

Public Function ProcessString(input_string As String) As String 
    ' The temp string used throughout the function 
    Dim temp_string As String 

    For i = 1 To Len(input_string) 
     temp_string = Mid(input_string, i, 1) 
     If temp_string Like "[A-Z, a-z, 0-9, :, -]" Then 
      return_string = return_string & temp_string 
     End If 
    Next i 
    return_string = Mid(return_string, 1, (Len(return_string) - 1)) 
    ProcessString = return_string & ", " 
End Function 

और मैं इस

Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name) 

अंतिम नाम की तरह इस फ़ंक्शन का उपयोग एक स्ट्रिंग चर रहा है, आम तौर पर इस Lastname***** की तरह लग रहा है, और मैं इसके पीछे सभी सितारों को दूर करने की कोशिश कर रहा हूँ। सितारों के बिना Lastname वापस करें।

मुझे Compile error: ByRef arugment type mismatch प्राप्त हुआ जब मैंने इसे चलाने की कोशिश की। मैं विंडोज 2003 के साथ विंडोज एक्सपी का उपयोग कर रहा हूं।

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

Private Sub CommandButton2_Click() 
' In my original production code I have a chain of these 
' Like this Dim last_name, first_name, street, apt, city, state, zip As String 
Dim last_name As String 

' I get the last name from a fixed position of my file. Because I am 
' processing it from another source which I copied and pasted into excel 
last_name = Mid(Range("A4").Value, 20, 13) 

' Insert the data into the corresponding fields in the database worksheet 
Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name) 
+3

किस लाइन पर एरो आर झंडा? – Gaffi

+0

जब मैं इसे कॉल करता हूं तो यह लाइन पर फहराया जाता है। 'वर्कशीट्स (डेटा_शीट) .ेंज ("सी 2")। वैल्यू = प्रोसेस स्ट्रिंग (last_name) ' – George

उत्तर

29

मुझे संदेह है कि आपने कॉलर में last_name ठीक से सेट नहीं किया है।

बयान Worksheets(data_sheet).Range("C2").Value = ProcessString(last_name)

यह कार्य तभी last_name एक स्ट्रिंग है काम करेंगे साथ

, अर्थात

Dim last_name as String 

कहीं फोन करने वाले में दिखाई देता है।

इसका कारण यह है कि VBA वैरिएबल में संदर्भ से डिफ़ॉल्ट रूप से गुजरता है जिसका अर्थ है कि डेटा प्रकारों को कॉलर और कैली के बीच बिल्कुल मिलान करना होता है।

दो फिक्स:

1) Public Function ProcessString(ByVal input_string As String) As String

2 करने के लिए अपने समारोह बदलें) फोन करने वाले में Dim last_name As String डाल इससे पहले कि आप इसका इस्तेमाल करते हैं।

(1) ByVal के लिए काम करता है, इसलिए फ़ंक्शन को पास करते समय इनपुट_स्ट्रिंग की एक प्रति ली जाती है जो इसे सही डेटा प्रकार में जोड़ती है। इससे बेहतर प्रोग्राम स्थिरता भी होती है क्योंकि फ़ंक्शन कॉलर में चर को संशोधित नहीं कर सकता है।

+0

धन्यवाद! 'ByVal' को जोड़कर समस्या ठीक हुई, अब कोड ठीक चलाता है! – George

+1

मैं हमेशा अपने सभी वीबीए कार्यों को ByVal के साथ घोषित करता हूं क्योंकि यह स्थिरता में सुधार करता है। जावा के साथ आपके पास कोई विकल्प नहीं है, सब कुछ मूल्य से गुजरता है। – Bathsheba

2

एक समय में आपकी स्ट्रिंग एक वर्ण के माध्यम से लूपिंग एक व्यवहार्य विधि है, इसकी कोई आवश्यकता नहीं है। VBA बात इस तरह का के लिए अंतर्निहित कार्य:

Public Function ProcessString(input_string As String) As String 
    ProcessString=Replace(input_string,"*","") 
End Function 
+0

यह वास्तव में एक अच्छा समाधान है। लेकिन क्या आप कृपया मुझे समस्या को ठीक करने के लिए दिखा सकते हैं? क्योंकि मैं यह भी पता लगाने की कोशिश कर रहा हूं कि मैंने क्या गलत किया। धन्यवाद! – George

3

मैं Option Explicit के साथ काम करने के लिए कुछ चीजें बदल गया है, और कोड जो "abc.12," लौटे एक सेल "abc.123" युक्त, के खिलाफ ठीक भाग गया। कोई संकलन त्रुटियां नहीं थीं।

Option Explicit ' This is new 

Public Function ProcessString(input_string As String) As String 
    ' The temp string used throughout the function 
    Dim temp_string As String 
    Dim i As Integer ' This is new 
    Dim return_string As String ' This is new 
    For i = 1 To Len(input_string) 
     temp_string = Mid(input_string, i, 1) 
     If temp_string Like "[A-Z, a-z, 0-9, :, -]" Then 
      return_string = return_string & temp_string 
     End If 
    Next i 
    return_string = Mid(return_string, 1, (Len(return_string) - 1)) 
    ProcessString = return_string & ", " 
End Function 

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

+0

जब मैंने मिस्ड डिम स्टेटमेंट जोड़ा, तो उसने उस लाइन को संकेत दिया (हाइलाइट किया गया) जहां मेरे पास 'प्राइवेट सब कमांड बटन 2_Click()' है, और 'last_name' भी हाइलाइट किया गया है। बहुत अजीब व्यवहार, मेरा सब मूल रूप से एक कट्टरपंथी है जो चीजों की एक सूची करता है। – George

+0

मिस्ड डिम स्टेटमेंट को इंगित करने के लिए धन्यवाद! – George

5

मुझे नहीं पता क्यों, लेकिन यदि आप अन्य प्रक्रिया या फ़ंक्शन में चर (चर के रूप में) को पास करना चाहते हैं तो चर को अलग से घोषित करना बहुत महत्वपूर्ण है।

उदाहरण के लिए एक प्रक्रिया है जो डेटा के साथ कुछ हेरफेर बनाती है: आईडी रिटर्न भाग संख्या और मात्रा जानकारी के आधार पर। निरंतर मान के रूप में आईडी, अन्य दो तर्क चर हैं।

Public Sub GetPNQty(ByVal ID As String, PartNumber As String, Quantity As Long) 

अगले मुख्य कोड मुझे "ByRef तर्क बेमेल 'देता है:

Sub KittingScan() 
Dim BoxPN As String 
Dim BoxQty, BoxKitQty As Long 

    Call GetPNQty(InputBox("Enter ID:"), BoxPN, BoxQty) 

End sub 

और अगले एक के रूप में अच्छी तरह से काम कर रहा है:

Sub KittingScan() 
Dim BoxPN As String 
Dim BoxQty As Long 
Dim BoxKitQty As Long 

    Call GetPNQty(InputBox("Enter ID:"), BoxPN, BoxQty) 

End sub 
+1

हां, यह मेरी समस्या थी। वीबीए - इतना भ्रमित। होना चाहिए क्योंकि यह 'सुलभ' है। – Eric

+0

मैं अपना दिमाग खो रहा था, मुझे विश्वास नहीं है कि मुझे इसकी आवश्यकता है, धन्यवाद। –

0

कुछ ऐसा जो स्ट्रिंग की कोशिश के साथ कुछ गलत है इस तरह:

Worksheets(data_sheet).Range("C2").Value = ProcessString(CStr(last_name))