वीबीए में मैंने यह लिखा था

Function SPLITTER(data As String, delimiter As String) As String()
    SPLITTER = Split(data, delimiter)
End Function

जो मेरे लिए बहुत अच्छा काम करता है

enter image description here

हालांकि, SPLITTER स्ट्रिंग्स लौटाता है लेकिन मैं इसे विशेष रूप से संख्याओं के लिए उपयोग करूंगा। अब मैं इसे वापस कर देता हूं As String () लेकिन किसी अन्य प्रकार का उपयोग करने से मेरे लिए काम नहीं हुआ। मुझे लगता है कि यह Split फ़ंक्शन में हस्तक्षेप करता है

मैं उस फ़ंक्शन का उपयोग कोशिकाओं के मान को मैन्युअल रूप से संख्याओं में परिवर्तित करने के लिए चीजों को स्वचालित करने के लिए करता हूं जो मेरे लिए काम नहीं करता है। क्या फ़ंक्शन को दशमलव के रूप में मान वापस करने का कोई तरीका है?

क्षमा करें अगर मैं अपनी शब्दावली में गलत हो सकता हूं लेकिन मैं वीबीए के लिए नया हूं।

3
Kuehlschrank 6 जुलाई 2021, 09:26

4 जवाब

सबसे बढ़िया उत्तर

या तो आप VALUE सूत्र का उपयोग करें जैसा कि @norie ने सुझाव दिया था या आपको अपना फ़ंक्शन बदलने की आवश्यकता है ताकि यह आपके द्वारा प्राप्त स्ट्रिंग्स को Split को Double मानों में परिवर्तित कर दे।

ध्यान दें कि यह पूरे सरणी के लिए एक बार में नहीं किया जा सकता है और आपको प्रत्येक मान को परिवर्तित करना होगा। यह VALUE सूत्र का उपयोग करने की तुलना में थोड़ा धीमा (विशाल डेटा या फ़ंक्शन के व्यापक उपयोग पर) हो सकता है। छोटे डेटा के लिए आपको कोई अंतर नहीं दिखेगा।

Option Explicit

Public Function SPLITTER(ByVal Data As String, ByVal Delimiter As String) As Variant()
    ' split strings
    Dim SplittedStrings() As String
    SplittedStrings = Split(Data, Delimiter)
    
    ' create variant array of the same size (variant so we can return errors)
    Dim Values() As Variant
    ReDim Values(LBound(SplittedStrings) To UBound(SplittedStrings)) As Variant
    
    ' convert each value into double
    Dim i As Long
    For i = LBound(Values) To UBound(Values)
        If IsNumeric(SplittedStrings(i)) Then
            ' return value as double
            Values(i) = CDbl(SplittedStrings(i))
        Else
            ' return #VALUE! error if a value is not numeric
            Values(i) = CVErr(xlErrValue)
        End If
    Next i
    
    SPLITTER = Values
End Function

ध्यान दें कि वापसी सरणी को As Variant() के रूप में परिभाषित किया गया है और As Double() नहीं, इसलिए यदि कोई विभाजित तार संख्यात्मक नहीं है तो यह इस एक मान के लिए एक #VALUE! त्रुटि लौटा सकता है और अभी भी अन्य आउटपुट कर सकता है . यदि आप ऐसा नहीं करते हैं तो पूरा फ़ंक्शन विफल हो जाता है और सभी मानों के लिए #VALUE! आउटपुट करता है, भले ही केवल एक को परिवर्तित नहीं किया जा सकता है।


चूंकि आप पूरी सरणी को फिर से लिखते हैं, वैसे भी आप इसे सही दिशा में भी ला सकते हैं: पंक्ति या स्तंभ के रूप में आउटपुट:

Option Explicit

Public Function SPLITTER(ByVal Data As String, ByVal Delimiter As String, Optional ByVal OutputAsRow As Boolean = False) As Variant()
    ' split strings
    Dim SplittedStrings() As String
    SplittedStrings = Split(Data, Delimiter)
    
    ' create variant array of the same size (variant so we can return errors)
    Dim Values() As Variant
    If OutputAsRow Then
        ' 2-dimensional array with 1 row and n columns
        ReDim Values(1 To 1, LBound(SplittedStrings) To UBound(SplittedStrings)) As Variant
    Else
        ' 2-dimensional array with n rows and 1 column
        ReDim Values(LBound(SplittedStrings) To UBound(SplittedStrings), 1 To 1) As Variant
    End If
    
    ' convert each value into double
    Dim i As Long
    For i = LBound(SplittedStrings) To UBound(SplittedStrings)  ' for each value in the input string string
        Dim RetVal As Variant
        If IsNumeric(SplittedStrings(i)) Then  ' check if it is a number
            ' return value as double
            RetVal = CDbl(SplittedStrings(i))
        Else
            ' return #VALUE! error if a value is not numeric
            RetVal = CVErr(xlErrValue)
        End If
        
        If OutputAsRow Then
            Values(1, i) = RetVal  ' fill columns
        Else
            Values(i, 1) = RetVal  ' fill rows
        End If
    Next i

    SPLITTER = Values
End Function

तो =SPLITTER($A$1,";") या =SPLITTER($A$1,";",0) इसे एक कॉलम के रूप में और =SPLITTER($A$1,";",1) को एक पंक्ति के रूप में आउटपुट करेगा।

3
Pᴇʜ 6 जुलाई 2021, 09:10

आप सूत्र में VALUE जोड़कर फ़ंक्शन को बदले बिना संख्याएं वापस कर सकते हैं।

=VALUE(TRANSPOSE(SPLITTER(D5,";")))
3
Pᴇʜ 6 जुलाई 2021, 06:37

ऐसा लगता है कि आपके पास मूल्यों की एक सीमित श्रेणी है, जो इंगित करती है कि आप Microsoft 365 का उपयोग कर रहे हैं। यदि आवश्यक न हो तो मैं यूडीएफ का उपयोग भी नहीं करने का सुझाव दूंगा (और इसके बजाय एक .xlsx फ़ाइल रखें):

=FILTERXML("<t><s>"&SUBSTITUTE(A1,";","</s><s>")&"</s></t>","//s")

यह तब आपकी स्ट्रिंग को वैध xml/xpath अभिव्यक्तियों के माध्यम से "विभाजित" करेगा और एक्सेल संख्याओं को स्वतः पहचान लेगा।

3
JvdV 6 जुलाई 2021, 07:15

JvdV के समाधान पर विस्तार

यह मानते हुए कि सेल सामग्री BV71 में गैर-संख्यात्मक टोकन हैं, आप XPath "//s[.*0=0]" के माध्यम से सभी xml नोड सामग्री को केवल संख्यात्मक तत्वों तक सीमित कर सकते हैं:

    =FILTERXML("<t><s>"&SUBSTITUTE(A8,";","</s><s>")&"</s></t>","//s[.*0=0]")

स्पष्टीकरण: सभी s नोड्स (किसी भी पदानुक्रम स्तर पर) को खोजने के लिए XPath व्यंजक को [] कोष्ठक में एक अतिरिक्त शर्त मिलती है। शून्य (*0) के साथ नोड सामग्री (. के प्रतीक) को गुणा करना और यह जांचना कि क्या परिणाम एक संख्या के बराबर है (यानी =0) केवल संख्या प्राप्त करने की अनुमति देता है, क्योंकि यह गुणन स्ट्रिंग्स के साथ विफल हो जाता है .

ध्यान दें बिंदु सीमांकक वाली क्षेत्रीय तिथि सेटिंग 8.2 जैसे टोकन को तिथि के रूप में व्याख्यायित कर सकती हैं, जिसके लिए और रूपांतरण की आवश्यकता होगी।

2
T.M. 6 जुलाई 2021, 20:24