Merri;
Thanks for your input.
Of course it is not suitable for every application in it's present version, but see how easily it can be changed to allow for other input that would not normally be expected.
In the revision below to accept characters 0 - 255, I simply changed 1 array variable, and the constant.

B&(255), & Const Q& = 0

This is all it takes to allow more varied input, and there should be no crash on non-standard input.
There are some situations where the input is more controlable however, and where that is possible, and
due care is taken, one could use a version which can be Optimized for your particular application.

Code:
Public Sub PH91(ByRef L$(), ByVal S&)
'Recursive
'Initial call with S = 1
Dim A$(), T$(), K&, P&, I&, J&, C&, B&(255), D&
Const Q& = 0

K& = UBound(B&):P& = UBound(L$):ReDim A$(K&, 0)
For I& = 0 To P&
    If S& <= Len(L$(I&)) Then
        J& = AscW(Mid$(L$(I&), S&, 1)) - Q&:D& = B&(J&)
        If D& > UBound(A$, 2) Then ReDim Preserve A$(K&, D&)
        A$(J&, D&) = L$(I&):B&(J&) = D& + 1
    Else
        L$(C&) = L$(I&): C& = C& + 1
    End If
Next I&

K& = UBound(A$, 1)
For I& = 1 To K&
    If B&(I&) Then
        If B&(I&) > 1 Then
            P& = B&(I&) - 1: ReDim T$(P&)
            For J& = 0 To P&
                T$(J&) = A$(I&, J&)
            Next J&
            S& = S& + 1:Call PH91(T$, S&):P& = UBound(T$)
            For J& = 0 To P&
                L$(C&) = T$(J&): C& = C& + 1
            Next J&
            S& = S& - 1
        Else
            L$(C&) = A$(I&, 0): C& = C& + 1
        End If
    End If
Next I&

End Sub
I don't visit here much at all anymore, but I have to drop in to say that statement above is far too ignorant.
I can't plead Ignorance, I did think of it, but chose not to make it initially in the above variation, so I will admit that I am unaccomodating at times. Please accept my apology.