Visual Basics for Applications (VBA) allows users to build on the existing functionality of Microsoft Excel. It comes with a strong set of inbuilt functions that are often not readily accessible from Excel’s interface. These functions have to be wrapped inside a user defined function to be usable in Excel. A classic example is the Split function.
The Split function separates a string into sub strings based on a separator/delimiter, and stores each sub string in an Array element. The lower bound of this array is ‘0’. Consequently, the Nth word could be accessed by extracting the N-1th element in the array.
'================================================================================
'Function to extract the Nth word in a String
'with an optional seperator character
'Author : Ejaz Ahmed
'Date : 22 January 2014
'Website : http://strugglingtoexcel.wordpress.com/
'================================================================================
Function GetNthWord(ByVal WhichText As String, _
ByVal WhichWord As Long, _
Optional ByVal Seperator As String = " ") As Variant
'Remove any trailing spaces
WhichText = Trim(WhichText)
'Store the Answer in a temporary string
Dim StrAns As String
'Returning Value error if the Seperator character/string is not found
If InStr(1, WhichText, Seperator) = 0 Then
GetNthWord = CVErr(xlErrValue)
Exit Function
End If
StrAns = Trim(VBA.Split(WhichText, Seperator, , _
vbBinaryCompare)(WhichWord - 1))
If IsNumeric(StrAns) Then
GetNthWord = CDbl(StrAns)
Else
GetNthWord = StrAns
End If
End Function
The number of words in a string could be obtained by tweaking this function slightly. I have also included a faster running version that I recommend using.
'=========================================================================
'Function to return the number of words in a string;
'with an optional seperator character
'Author : Ejaz Ahmed
'Date : 14 November 2013
'Website : http://strugglingtoexcel.wordpress.com/
'=========================================================================
Function NumberOfWords(ByVal WhichText As String, _
Optional ByVal Seperator As String = " ") As Variant
'Remove any trailing spaces
WhichText = Trim(WhichText)
'Returning Value error if the Seperator character/string is not found
If InStr(1, WhichText, Seperator) = 0 Then
NumberOfWords = CVErr(xlErrValue)
Exit Function
End If
NumberOfWords = CLng(UBound(VBA.Split(WhichText, Seperator, _
, vbBinaryCompare)) + 1)
'Alternate implimentation that runs faster
'NumberOfWords = (Len(WhichText) - _
Len(Replace(WhichText, Seperator, vbNullString, 1, , _
vbBinaryCompare))) / Len(Seperator) + 1
End Function
Below is a screenshot of a spreadsheet illustrating how this function could be used:


