Task:

Split a string into adjacent cells. A formula has to be used, not a Split or Import Assistant.

A2: 2.3#30000#Grant#3/31/2008#5003.67#

Solution (Klaus "Perry" Pago 2007/06/15):

B2:F2: =MID("#"&$A2,

FIND("_",SUBSTITUTE("#"&$A2,"#","_",COLUMN(A2)))+1,

FIND("_",SUBSTITUTE("#"&$A2,"#","_",COLUMN(B2)))-

FIND("_",SUBSTITUTE("#"&$A2,"#","_",COLUMN(A2)))-1)

- is not a array

- must be copied into one cell like B2

- and then be filled in until F2

SUBSTITUTE is the only text function (before xl2007) using the argument "instance n°". Originally needed here for FIND, it gets converted by the usage of SUBSTITUTE. To convert to numbers instantly, proceed the formula with a -- (double minus). This also works for data like 3/31/2008, then simply being converted into serial numbers.

What, if the sub strings have a variable count? Then:

B2:F2: =IF(COLUMN(A2)<=LEN($A2)-LEN(SUBSTITUTE($A2,"#","")),MID("#"&$A2,

FIND("_",SUBSTITUTE("#"&$A2,"#","_",COLUMN(A2)))+1,

FIND("_",SUBSTITUTE("#"&$A2,"#","_",COLUMN(B2)))-

FIND("_",SUBSTITUTE("#"&$A2,"#","_",COLUMN(A2)))-1),"")

Sundry 1:

Bernd Plumhoff, 2007/06/16,
offers a VBA function array. Select B2:F2 first, and then type it by
CTRL-SHIFT-ENTER, as you would do for a simple array formula in B2 only.

B2:F2: =wssplit(A1,"#")

Function wssplit(s As String, _

Optional sdelimiter As String = ".", _

Optional lcount As Long = -1) As Variant

wssplit = Split(s, sdelimiter, lcount)

End Function

Sundry 2:

The fields as in 3,4#MEI#600#723# have the same length of 3:

B2: =MID($A2,COLUMN(B2)*4-7,3)

Note: In such a case you would not need the separators #.