Du könntest statt vbFkt 'Split' die ebenfalls ...
13.07.2015 19:46:22
Luc:-?
…auf Split basierende UDF Splint benutzen, Christian,
wenn du das nicht alles selbst pgmmieren willst. Die kannst du dann in einem PgmZyklus (sog Schleife), der von 1 bis anzahlWorteImSatz - 3 läuft, einsetzen. Die UDF enthält bereits einen AuswahlMechanismus, der auf jeweils 4 Elemente (Worte) bei flfd wechselndem Beginn eingestellt wdn kann. Anderenfalls müsstest du wohl WorksheetFunction.Index einsetzen bzw den entsprd Teil der UDF übernehmen. Die Einzel-Arrays könnten dem AuswahlStart analog indiziert wdn und bilden dann einen Variant mit einem Array, genauer, ein Array, dessen Elemente ebenfalls aus Arrays bestehen. Dieser Vektor ist vertikal orientiert, während seine ElementVektoren horizontal orientiert sind. Der Index für alle Vektoren (auch den vertikalen HptVektor!) ist stets 1dimensional. Ein Element eines ElementVektors wird mit (i)(j) indiziert.
Mit einer um diese (innere) Schleife herumliegenden äußeren, könntest du einen TextSatz nach dem anderen aufrufen. Wenn du für alle Sätze ebenfalls einen Vektor anlegst, der dann den jeweiligen vertikalen SatzVektor enthält, kommst du auf 3 separate Indizes (i)(j)(k). i für den jeweiligen Satz, j für dessen 4-Elemente-Variationen und k für ein einzelnes Wort in der jeweiligen Variation.
Nachfolgend wird das WirkungsPrinzip für einen Satz, bei Einsatz der UDF in einer ZellFml gezeigt:
| K | L | M | N |
1 | Franz fährt heute mit dem Zug von Berlin nach Dresden. |
2 | Franz | fährt | heute | mit |
3 | fährt | heute | mit | dem |
4 | heute | mit | dem | Zug |
5 | mit | dem | Zug | von |
6 | dem | Zug | von | Berlin |
7 | Zug | von | Berlin | nach |
8 | von | Berlin | nach | Dresden. |
9 | K2:N2;K3[:N8]: {=Splint(K$1;;ZEILEN(A$1:A1);ZEILEN(A$1:A1)+3)} |
Der PgmCode der UDF ist dann hier zu finden. Dort sind aber marginale Korrekturen nicht enthalten, weshalb ich ausnahmsweise noch den letzten Stand einstelle:
Rem Bildet aus Einzeltexten TeilTextFelder von
bis
Pos (lfdElemNr) im Text
' m.d.Möglichkeit Ersatz d.jeweiligen Endposition durch d.letzte Element
' Vs 1.2a -Autor: LSr -CDate:20070427 -1Pub:20070428herber -LUpd:20080109n
Function Splint(Text, Optional Trenner As String = " ", Optional ByVal AnfPos As Integer, _
Optional ByVal EndPos As Integer, Optional ByVal LetztEnd As Boolean)
Dim i As Long, j As Long, l As Long, m As Long, TxtVkt, x, y() As String
If AnfPos = 0 And EndPos = 0 Then Splint = Split(Text, Trenner): Exit Function
If InStr(Text, Trenner) = 0 Then
m = Len(Text)
TxtVkt = Evaluate("if(row(1:" & m & ")=0,0,mid(""" & Text & """,row(1:" & m & "),1))")
Else: TxtVkt = Split(Text, Trenner): m = UBound(TxtVkt) + 1 - LBound(TxtVkt)
End If
If AnfPos = 0 Then AnfPos = 1
If EndPos = 0 Then EndPos = m
l = EndPos - AnfPos: If l = AnfPos And i l) Then y(l) = x: Exit For
Next x
Splint = y
End Function
Übrigens, diese alte UDF ist nicht aktiv matrixfml-fähig, d.h., ihr Argument1 (Text) muss stets ein einzelner Text oder ein Bezug auf einen solchen (nur 1 Zelle!) sein.
Gruß, Luc :-?
Besser informiert mit …