Forum Discussion
Trying to embed special characters into referenced values
- 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 FunctionFor 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 FunctionFor 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.
Thanks a ton for your help . Greatly Appreciated !! . It seems the version is not supported by excel. Following is the version of excel, but it seems, it's not supporting the formula.
Microsoft® Excel® for Microsoft 365 MSO (Version 2202 Build 16.0.14931.20704) 64-bit.
I did bit of a researched and wondering if VBA can be used to implement same kind of a functionality?
Once again thanks a million for continues support.
Regards
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.
- AlokBeheriaDec 20, 2022Brass Contributor
Just to update , I managed make it work the way I wanted and just in case , anyone has a similar query can use following solution to achieve the same.
Regards
- AlokBeheriaDec 09, 2022Brass Contributor
Hello SnowMan ,One last thing, if you could help me on. Here, I am trying to concatenate csv values inside cell. I am looking to use concatenate function on values Val1, Val2, Val3 and it should be like 'Val1','Val2','Val3'. I tried to use concatenate function to no avail. Using concatenation, it treats entire CSV as single value, and I just couldn't be able to find ways to put "quotes" around CSV values.
Regards
- SnowMan55Dec 06, 2022Bronze Contributor
AlokBeheria No apology was necessary. We all have priorities that change and unexpected demands on our time. Good to see that once you removed the extraneous ampersand in front of the B14 cell reference that you got your solution.
- AlokBeheriaDec 06, 2022Brass Contributor
Just to update here, I managed to sort this out with following command.
Regards
- AlokBeheriaDec 06, 2022Brass Contributor
Thanks once again, as I was able to make it work. Here, what I am trying to do is to use this formula inside " " in formula bar and not sure, why it's refused to work. I have changed the function name from AlokBeheria1 to clustname here.
Using cell referencing to append values inside double quotes.
Formula I am using ..
srvctl add service -db $DBNAME -service FSD_PERM_01_S1 -pdb FSD_PERM_01_DOTCOM &clustname(&sheet_modify_First!B14) - AlokBeheriaDec 05, 2022Brass ContributorI just didn't have any clue on it and extremely I feel sorry for not commenting on a master piece of a work. I was crazy busy in some of my projects and couldn't able to check. First of all , thanks a million, I just casually looked today and discover your post.
I really have no words to praise you here. I am speechless here. you did a wonderful job .. Although I am yet to test and comprehending a function created by you , but will let you know for sure.
Once again thanks you and thanks to Mathetes as well. You both deserve a praise here. will post on my thoughts ..
Regards