Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1196to1200
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Text splitten mit Längenvorgabe

Text splitten mit Längenvorgabe
ing.grohn
Hallo Forum,
ich möchte Text splitten analog der Funktion Split().
einziger Unterschied: die Split-Anzahl soll längenabhängig sein.
Wie die Funktion aussehen soll, weiß ich (denk ich mir)
aber, ich weiß überhaupt nicht, wie man die Rückgabe formuliert!
Schließlich sollen die Werte in einem Array landen:
Texte=Split(strText,"/") ' so ist Split
Texte= meinSplit(strText, "/", 30) 'trenne nach frühesten 30 Zeichen beim nächsten /
kann mir da jemand auf die Sprünge helfen? Ich würde mich freuen
Mit freundlichen Grüßen
Albrecht
Dein Problem sollte doch wohl kaum die...
01.02.2011 15:27:17
Luc:-?
…Rückgabe sein, Albrecht,
denn, ist die ganze udFkt As Variant, was sie bekanntl immer ist, wenn nichts anderes angegeben wird, kann sie auch ein Feld zurückgeben. Du musst es ihr nur übergeben → meinSplit = ergebnisfeld
Damit das dann auch wirklich im Blatt steht, musst du natürl noch die entsprechende/n (Anzahl) Zellen markieren und die Fml mit der udF als Matrixfml abschließen.
Übrigens erzeugt Split immer einen 1dimensionalen Zeilenvektor. Willst du 'nen Spaltenvektor, musst du das entweder in die udF integrieren oder zusätzl MTRANS in der ZellFml verwenden.
Etwas komplizierter dürfte sich da schon dein Split-Modus gestalten…
Übrigens weiß ich, wovon ich spreche, denn ich habe solche udFktt schon lange… ;-)
Viel Spaß! Gruß Luc :-?
Anzeige
AW: Dein Problem sollte doch wohl kaum die...
01.02.2011 16:08:09
ing.grohn
Hallo Luc,
nur zum Verständnis:
Sub Function meinSpilt(...) As Variant
Dim ArrayXY() As String
meinSplit=ArrayXY
End Function

reicht?
Mein Respekt dir gegenüber verbietet es mir im Moment zu dem Rest deiner Anmerkung etwas zu sagen.
wünsch Dir einen schönen restlichen Tag
Mit freundlichen Grüßen
Albrecht
Sag's doch ruhig! Den ganzen Rest oder...
01.02.2011 16:21:04
Luc:-?
…nur den kursiven, Albrecht… ;-)
Letzterer sollte nur andeuten, dass du evtl auch im Archiv fündig wdn könntest bzw das gar nicht so einfach ist und ich dir an dieser Stelle, falls gewünscht, etwas „unter die Arme greifen“ könnte. Aber wahrscheinl willst du das ja lieber selbst packen… ;-)
Übrigens, so wie es dasteht, erhältst du eine Fehlermeldung oder 0, wenn du den Schreibfehler im Kopf nicht beseitigst… ;-)
Ob dein ArrayXY so deklariert wdn muss, hängt übrigens von deinem PgmAufbau ab.
Dito & Gruß, Luc :-?
Anzeige
AW: Sag's doch ruhig! Den ganzen Rest oder...
01.02.2011 16:45:00
ing.grohn
also, ich meinte die letzen zwei Zeilen.
Hilfe ist eine gute Sache (ich wär längst nicht so weit, wenns die Herber-Seite nicht gäbe).
Aber: ich versuchs erst mal selbst
Wenn ich nicht klar komme melde ich mich
(bei dem Schreibfehler sollte ich eigentlich über Option Explizit stolpern)
so long
Albrecht
AW: zum Rest...
01.02.2011 17:19:02
ing.grohn
..muß ich noch sagen: die Geschichte mit den Vektoren haben wir hier vor einigen Monaten/Wochen ausgiebig dikutiert. Es ging darum was die Split-Funktion zurückk gibt (Variant oder typenspezifisch). Tino war dabei u.a
Werd ich nicht so schnell vergessen
Albrecht
Anzeige
Ja, ja, ich weiß! So genau steht's leider...
01.02.2011 22:05:50
Luc:-?
…nicht in der Hilfe, Albrecht,
dass man da zu'ner endgültigen Übereinstimmung käme; aber eins war unstrittig: Split liefert ein Feld aus String-Elementen → zumindest für mich ein Variant vom Untertyp Array des Untertyps String ⇒ also keinesfalls ein String!
Über Vektoren wurde hier früher schon diskutiert! Da gibt's nämlich 3 Typen, 1 1dimensionaler, der immer horizontal ist (so auch bei Split), und 2 2dimensionale (1 Dimension=0 bzw 1) in beiden Ausrichtungen. Ein 1dimens vertikaler Vektor ist mir bei xl/vb noch nicht untergekommen, obwohl ich fürchte, dass das u.U. auch mögl sein könnte…
Übrigens verarbeitet das Pendant zu Split, Join, auch nur 1dimens bzw horizontale Vektoren.
Zitat: bei dem Schreibfehler sollte ich eigentlich über Option Explizit stolpern
Kommentar: Nicht, wenn du das so schreibst… ;-)
Gruß Luc :-?
Anzeige
AW: Dein Problem sollte doch wohl kaum die...
02.02.2011 09:22:40
ing.grohn
HAllo Luc,
Du schriebst:
Damit das dann auch wirklich im Blatt steht, musst du natürl noch die entsprechende/n (Anzahl) Zellen markieren und die Fml mit der udF als Matrixfml abschließen.
aber wie?
ich habe den Bereich markiert, die Formel eingetragen und mit SHIFT STRG RETURN abgeschlossen.
Im gesamten Feld erscheint jetzt die gekürzte ersteZeile. Unter VBA konnte ich alle Zeilen ausgeben (mit Schleife mit UBound)
was läuft falsch?
Mit freundlichen Grüßen
Albrecht
Hat si erledigt nachdenk.!! ZeilenVekt...
02.02.2011 09:28:54
ing.grohn
aber, kann man das auch begrenzen oder muß man die Längeschätzen
Mit ferundlichen Grüßen
Albrecht
Anzeige
Begrenzen? Schätzen? Was machst du sonst...
02.02.2011 15:43:01
Luc:-?
…bei Matrixfmln, Albrecht…?
Wenn du das nicht willst oder kannst, musst du mal im Archiv nach etwas suchen, das die Markierung automatisch auf die Maximalgröße ausweitet. Ich glaube, Lorenz hatte vor Jahren mal danach gefragt. Inzwischen habe ich auch so etwas… (lang und komplex!)
Gruß Luc :-?
Rückgabe als Spaltenvektor!
02.02.2011 10:29:39
ing.grohn
Hallo Luc,
die Disrkussion von vor einigen Wochen wid mir nun verständlicher!
Es ist ja wohl so, daß VBA grundsätzlich erst einmal Zeilen-Vektoren erzeugt, wenn man nichts anderes bestimmt. Wobei mir Spaltenvektoren eigentlich näher lägen, was solls?
Mit freundlichen Grüßen
Albrecht
Anzeige
...Allerdings nur in solchen Fällen! Überträgst...
02.02.2011 15:30:26
Luc:-?
…du einen Spalten-Range in ein Feld, Albrecht,
musst du mit einem formal 2dim Spaltenvektor rechnen…! ;-)
Gruß Luc :-?
AW: Nachtrag
02.02.2011 15:51:13
ing.grohn
Hallo Luc,
nur zur Info:

Function meinSplit(strText As String, L As Integer) As Variant
Dim arrText() As String
Dim TL As Integer
Dim T As Double
Dim Posi As Integer
Dim I As Integer
Dim Z As Integer
Dim Arr As Integer
Dim Ende As Boolean
I = 0
TL = Len(strText)
T = TL / L
Arr = Int(T + 1)
ReDim arrText(Arr - 1)
Do
TL = Len(strText)
If TL > L Then
Posi = InStr(L, strText, " ")
If Posi > 0 Then
If Posi > 1.3 * L Then      'Trennposition zu spät, vorher versuchen
If L > 5 Then            'Länge verkürzen um vorherige Leerstelle zu Nutzen
Z = L - 5             '5=Erfahrungswert!
Else
Z = L
End If
Posi = InStr(Z, strText, " ")
If Posi > 0 Then
If Posi > 1.3 * L Then '1.3 beispielsweise
arrText(I) = Left(strText, L)
strText = Right(strText, TL - L)
Else
arrText(I) = Left(strText, Posi)
strText = Right(strText, TL - Posi)
End If
End If
Else
arrText(I) = Left(strText, Posi)
strText = Right(strText, TL - Posi)
End If
I = I + 1
Else                        'Zwangsumbruch, weil kein Trennelement gefunden
arrText(I) = Left(strText, L)
strText = Right(strText, TL - L)
I = I + 1
End If
Else
Ende = True
arrText(I) = strText
End If
Loop Until Ende
'Array-Größe korrigieren
If Trim(arrText(UBound(arrText))) = "" Then
ReDim Preserve arrText(UBound(arrText) - 1)
End If
'meinSplit = WorksheetFunction.Transpose(arrText()) 'Zeilenvektor
meinSplit = arrText()                               'Spaltenvektor automatisch!!
End Function
mit einem 295 Zeichen langen Text probiert mit Spaltenbreiten zwischen 5 und 200 Zeichen.
Fehlerbehandlung fehlt.
Mit freundlichen Grüßen
Albrecht
Anzeige
Aha! OK! Gruß owT
02.02.2011 16:06:03
Luc:-?
:-?
AW: Split gibt "nichts" zurück?
04.02.2011 16:55:15
ing.grohn
Hallo Luc, Hallo Forum,
im Hilfetext zu Split steht:
Wenn expression eine Zeichenfolge der Länge Null ("") ist, gibt Split ein leeres Datenfeld zurück, d. h. ein Datenfeld ohne Elemente und ohne Daten.
Wie macht man das mit einer udF? chr(0), "" oder? Ich erhalte immer eine Fehlermeldung: Typen unverträglich
Hier der Code:
Function meinSplit(strText As String, L As Integer) As Variant
Dim arrText() As String
Dim TL As Integer
Dim T As Double
Dim Posi As Integer
Dim i As Integer
Dim Z As Integer
Dim Arr As Integer
Dim Ende As Boolean
If Trim(strText) = "" Then
meinSplit = ""
Exit Function
End If
i = 0
TL = Len(Trim(strText))
If TL = 0 Then
meinSplit = ""
Exit Function
End If
If Not IsNumeric(L) Or L = 0 Then
meinSplit = Chr(0)
Exit Function
End If
T = TL / L
Arr = Int(T + 1)
ReDim arrText(Arr - 1)
Do
TL = Len(strText)
If TL > L Then
Posi = InStr(L, strText, " ")
If Posi > 0 Then
If Posi > 1.3 * L Then      'Trennposition zu spät, vorher versuchen
If L > 5 Then            'Länge verkürzen um vorherige Leerstelle zu Nutzen
Z = L - 5             '5=Erfahrungswert!
Else
Z = L
End If
Posi = InStr(Z, strText, " ")
If Posi > 0 Then
If Posi > 1.3 * L Then '1.3 beispielsweise
arrText(i) = Left(strText, L)
strText = Right(strText, TL - L)
Else
arrText(i) = Left(strText, Posi)
strText = Right(strText, TL - Posi)
End If
End If
Else
arrText(i) = Left(strText, Posi)
strText = Right(strText, TL - Posi)
End If
i = i + 1
Else                        'Zwangsumbruch, weil kein Trennelement gefunden
arrText(i) = Left(strText, L)
strText = Right(strText, TL - L)
i = i + 1
End If
Else
Ende = True
arrText(i) = strText
End If
Loop Until Ende
'Array-Größe korrigieren
If Trim(arrText(UBound(arrText))) = "" Then
ReDim Preserve arrText(UBound(arrText) - 1)
End If
'meinSplit = WorksheetFunction.Transpose(arrText()) 'Zeilenvektor
meinSplit = arrText()                               'Spaltenvektor automatisch!!
End Function

Vielen Dank für eine Hilfe
Mit freundlichen Grüßen
Albrecht
Anzeige
Abfangen m. IsEmpty() oder Len()=0 und...
04.02.2011 17:20:55
Luc:-?
…dann leer oder was auch immer zurückgeben, Albrecht!
Gruß Luc :-?
AW: Abfangen m. IsEmpty() oder Len()=0 und...
04.02.2011 17:43:14
ing.grohn
Hallo Luc,
also
Funktion aufrufen mit "strText = Not IsEmpty(meinSplit("", 10))" geht nicht, keine Zuweisung an Datenfeld möglich.
Innerhalb der Funktion abfragen:
TL = Len(Trim(strText))
If TL = 0 Then
meinSplit = "leerer String"
Exit Function
End If
If Not IsNumeric(L) Or L = 0 Then
meinSplit = "Länge=0 oder keine Zahl"
Exit Function
End If

führt immer zur Fehlermeldung "Typen unverträglich".
Die Abfrage "isnumeric" ist eigentlich überflüssig, weil die Funktion einen Text statt Zahl beim Aufruf schon anmeckert. Null kann allerdings vorkommen ist zwar Quatsch aber....
Auch Leerstring und Chr(0) bringen diese Fehlermeldung.
Split macht das nicht! (mit leerstring)
Mit freundlichen Grüßen
Albrecht
Anzeige
Naja, du musst natürl VORHER fragen,...
04.02.2011 23:18:33
Luc:-?
…Albrecht,
nicht nachherNot IsEmpty(meinSplit("", 10)) ist auch nach Split. Der Fehler in der anderen Variante wäre unklar, falls das FktsErgebnis Variant oder String sein soll. 'Ne MxFml sollte damit auch kein Problem haben (sieht nur blöd aus!). Erzeuge lieber 'nen richtigen Fehler mit bspw meinSplit = CVErr(xlErrNum)
Gruß Luc :-?
AW: Naja, du musst natürl VORHER fragen,...
05.02.2011 09:55:19
ing.grohn
Hallo Luc,
vielen Dank für die Antwort. Keine schlechte Idee, einen Error-Code zu generieren!
(führt allerdings auch nicht zum Ziel, Schade). Für mich ist das auch eher ein "theoretisches" Problem. Ein Leerstring kommt bei mir nicht vor bzw wird durch Len(Trim(String))=0 vorher abgefangen.
Ich hatte gedachte, es "passiert einfach nichts" wenn der String leer ist. Man kann ja "nichts" zurückgeben (siehe Split), aber wie?
Ich belass es dabei.
ein schönes Wochenedne
Mit freundlichen Grüßen
Albrecht
OT wichtige Nachfrage
05.02.2011 17:12:43
Reinhard
Hallo Luc,
du benutzt "bsbw" das ist doch irre lang, die reinste Bytesvergeudung.
Reicht da nicht
zB
?
*grins*
Gruß
Reinhard
'bsbw' benutzt viell du, Reinhard, ich...
06.02.2011 00:25:47
Luc:-?
…benutze gelegentl 'bspw' — das hängt ganz vom Kontext ab (Stil und so)… ;->
Schön, dass du meine Beiträge mitliest, aber lies auch mal den Quelltext, da siehst du, was ich wirklich schreibe und das ist mitunter noch länger… :-)
Gruß+schöSo, Luc :-?

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige