Peter-
You might want to consider a 'right to left' approach, which
will allow you to deal with the possibility that the city name
consists of more than one word (e.g. "West Palm Beach"

.
This solution assumes that your state or territory abbreviation
never contains spaces:
Copy function xLastInStr() - shown below - to a module. Then,
from the debug window:
widget = "West Palm Beach FL 33401"
LastSpace = xLastInStr(Widget, " "

NextToLastSpace = xLastInStr(Left(Widget, LastSpace - 1)," "

lenState = LastSpace - NextToLastSpace - 1
City = Left(widget, NextToLastSpace -1)
State = mid(widget, NextToLastSpace + 1, lenState)
Zip = mid(widget, LastSpace + 1)
? City
West Palm Beach
? State
FL
? Zip
33401
*******************************************************************
' FUNCTION: xLastInStr()
'
' PURPOSE: Determine the position of the last character(s)
' (as specified by user) in a string.
'
' ARGUMENTS:
' tstr: The string to be tested
' twhat: The character to locate.
'
' RETURNS: An integer representing the last occurence or, if not found, 0.
'
' NOTES: To test: Type '? xLastInStr("The quick brown fox jumped over
' the lazy dog", "the"

in the debug window.
' The function will return 33.
Function xLastInStr(ByVal tstr As String, twhat As String) As Integer
Dim I As Integer, n As Integer, tlen As Integer
n = 0
tlen = Len(twhat)
For I = Len(RTrim(tstr)) To 1 Step -1
If Mid(tstr, I, tlen) = twhat Then
n = I
Exit For
End If
Next I
xLastInStr = n
End Function
HTH, Bob