Besides SUBSTITE not being available as a SharePoint Calculated Column Formula you have another problem..
If Speciality is a Choice-CheckBox Field it is not available for use in a Calculated Column
I presume that is why you state "I have a workflow setup to export that data" and assume your Speciality column is a Text column filled with the choices by the workflow.
Without a SUBSTITUTE you have to use nested REPLACE functions:
Source: https://www.365csi.nl/vm365com/365coach/#/Calculated_Column_Functions_List
This is up to two replacements, so separating 3 Choice values
=REPLACE(
REPLACE(
Specialty
,FIND(
";#"
,Specialty
)
,2
,"<br>"
)
,FIND(
";#"
,REPLACE(
Specialty
,FIND(
";#"
,Specialty
)
,2
,"<br>"
)
)
,2
,"<br>")
Takes some carefull copy pasting to get more choices in. Steps are:
- Take a copy of this Formula
- Paste/Replace all 4 Specialty references
Note! You can only nest function 7 levels deep! Need more than you have to use multiple Calculated Columns which do part of the original string and Concat them
Using the Workflow or CSR
I suggest you move all your replace logic into the Workflow. Much easier to do string replacements.
If you are on SP2013 you also have to look at using CSR - Client Side Rendering
But it can be done.. in SP2010 and SP2013
Provided your Speciality Column is that Text string!
And only in VIEWS, not on Forms (then use Client Side Rendering in SP2013)
You just have to do some out of the box thinking...
As you can output HTML in a Calculated Column you can also output JavaScript.. alas Microsoft disabled use of the SCRIPT tag in summer 2013, but we can execute JavaScript when an IMG has loaded..
Put this Formula in a Calculated Column and set the datatype to Number:
="<div style=text-align:left>"
&"<img src=/_layouts/images/blank.gif onload=""{"
&"var choices='"
& [Specialty]
&"';"
&"this.parentNode.innerHTML=choices.replace(/;#/g,'<br>');"
&"}""></div>"
This will load a blank IMG for every listitem, the onload event will execute javascript which (pre-built with your [Specialty] Choice values by the Calculated Column) replaces all separators with a BR code, then puts it in the enclosing DIV (set with align:left because datatype Number was aligned to the right)
Full explanation and more at: https://www.365csi.nl/vm365com/#/How