Forum Discussion

AlokBeheria's avatar
AlokBeheria
Brass Contributor
Nov 07, 2022
Solved

Trying to embed special characters into referenced values

Hello All,   I am trying to fetch values from another sheet columns and not able to append special characters like "('%name%') in between values. In the given below formula , my value coming from a...
  • SnowMan55's avatar
    SnowMan55
    Nov 23, 2022

    AlokBeheria That work is certainly doable using a custom VBA function.  In fact, I wrote two.  Put either (or both) of the functions below into a standard code module (i.e., where macros are located).  To reduce visual clutter, I used an ellipsis (...) in place of some of the text.  Here are samples of the Excel formulas and results on some data I made up:

     

    For the first function (AlokBeheria1), I wrote the code to do "exactly" the requested work:

     

    Public Function AlokBeheria1(ByVal DelimitedList As String _
            , Optional ByVal Delimiter As String = ",") As Variant
    '   This function parses a delimited list of entries, and wraps the
    '       second entry, plus all others, within another set of strings.
    
        Dim vntReturnValue  As Variant
        Dim strReturnValue  As String
        
        Dim strEntries()    As String
        Dim in4UpperBound   As Long
        Dim in4Index    As Long
        Dim strRemainingEntriesAsList   As String
        
        '----   Parse the delimited list into an array of strings.
        strEntries = Split(DelimitedList, Delimiter)
        in4UpperBound = UBound(strEntries)
        If in4UpperBound < 1 Then
            '...the list does not have two entries.
            vntReturnValue = CVErr(5)
            GoTo AB1_Exit
        End If
        
        '----   Construct the desired output.
        '   Create the first part.
        strReturnValue = "... -preferred " & strEntries(1)  'Entry #2 is _
                referenced by index 1, because the array is zero-based.
        '   Create a new delimited list of entries with all but the
        '   second entry.
        strRemainingEntriesAsList = strEntries(0)
        For in4Index = 2 To in4UpperBound
            strRemainingEntriesAsList = strRemainingEntriesAsList _
                    & Delimiter & strEntries(in4Index)
        Next in4Index
        '   Put the pieces together.
        strReturnValue = strReturnValue & " -a " & strRemainingEntriesAsList
        '
        vntReturnValue = strReturnValue
        
    AB1_Exit:
        '----   Return the result.
        AlokBeheria1 = vntReturnValue
        Exit Function
        
    End Function

     

    For the function's argument, specify a cell containing the delimited list (or a string literal; e.g., =AlokBeheria1("A,B,C") ).

     

    But that function has hard-coded values, so you would have to create a separate custom function for each different set of string literals for which you wanted to use the code. And it is always the second entry in the delimited list that gets special treatment.

     

    Alternatively, you could use the second function (DelimitedListEntry) -- along with built-in Excel functions and operators -- for this purpose as well as for other purposes:

     

    Public Function DelimitedListEntry(ByVal DelimitedList As String _
            , ByVal EntryNum As Integer _
            , Optional ByVal Delimiter As String = ",") As Variant
    '   This function parses a delimited list of entries, and returns
    '       either the entry whose ordinal position number is EntryNum (if
    '       EntryNum is positive) or a modified delimited list that excludes
    '       entry number EntryNum*-1 (if EntryNum is negative).
    
        Dim vntReturnValue  As Variant
        Dim strReturnValue  As String
        
        Dim strEntries()    As String
        Dim in4UpperBound   As Long
        Dim in4Index    As Long
        Dim strRemainingEntriesAsList   As String
        
        '----   Do some validation of the parameters.
        If EntryNum = 0 Then
            vntReturnValue = CVErr(5)
            GoTo DLE_Exit
        End If
        
        '----   Parse the delimited list into an array of strings.
        strEntries = Split(DelimitedList, Delimiter)
        in4UpperBound = UBound(strEntries)
        
        '----   If a single entry is requested, return it.
        If EntryNum > 0 Then
            If EntryNum - 1 <= in4UpperBound Then
                strReturnValue = strEntries(EntryNum - 1)
                vntReturnValue = strReturnValue
            Else
                vntReturnValue = CVErr(5)
            End If
            GoTo DLE_Exit
        End If
        
        '----   Create a new delimited list of entries with all but the
        '       specified entry.
        If EntryNum = -1 Then
            '   For improved performance, handle this case separately.
            strReturnValue = Mid$(DelimitedList, 1 + Len(strEntries(0)) _
                    + Len(Delimiter))
        Else
            '   Create the first part.
            strRemainingEntriesAsList = strEntries(0)
            '   Append additional entries as appropriate.
            For in4Index = 1 To in4UpperBound
                If in4Index <> Abs(EntryNum) - 1 Then
                    strRemainingEntriesAsList = strRemainingEntriesAsList _
                            & Delimiter & strEntries(in4Index)
                End If
            Next in4Index
            '   Put that into the String return value.
            strReturnValue = strRemainingEntriesAsList
        End If
        vntReturnValue = strReturnValue
        
    DLE_Exit:
        '----   Return the result.
        DelimitedListEntry = vntReturnValue
        Exit Function
        
    End Function

     

    For the function's first argument, specify a cell with the delimited list (or a string literal). For the second argument, specify a positive number to return just a single entry whose (1-based) position is that number; or if you specify a negative number, the function returns the list excluding the single entry whose position is the absolute value of that number.

     

    Note: For both functions, I allow a delimiter other than a comma to be specified. as the last argument.

     

    I expected DelimitedListEntry to be much slower, as Excel has to make references to twice as many other cells, has to invoke the function twice, and has to do the concatenation itself. But the execution times were reasonably close for this and for AlokBeheria1.

Resources