AW: Vielen Dank!
22.02.2017 14:27:30
Michael
Hi Iris,
die Trennzeichen interessieren mich quasi nicht...
Entscheidend sind diese Zeilen in der Sub TextImport:
For iIn = 1 To Len(sIn)
s0 = Mid(sIn, iIn, 1)
If (s0 >= "0" And s0
Das Trennzeichen ist hier das "," im ElseIf-Zweig.
Das Ding funktioniert so, daß alle Ziffern (0-9), vbLF, vbCr (LF-line feed, Zeilenschaltung und CR=carriage return, Wagenrücklauf - Du hattest doch mal ne Schreibmaschine?) und der Punkt erhalten bleiben, während das Trennzeichen "," durch ein "|" ersetzt wird (um die englischen Dezimalpunkte und die Kommas auseinander zu halten).
Der Punkt ist aber, daß Dein neues Format nicht "ein" Trennzeichen hat (Deine Vermutung war ja ein Tabulator), also NICHT vbTab (das Zeichen Nr. 9), sondern eine variable Anzahl von Leerzeichen (Nr. 32), mit der die Werte so aufgefüllt werden, daß sie rechtsbündig in den Spalten stehen.
Das könnte man ändern, aber nicht, indem man einfach einen Wert ersetzt; vielmehr müßte man zwischen den Zahlenwerten jeweils alle 32er bis auf eines rauswerfen und das dann durch "|" ersetzen.
Das wäre mit vertretbarem Aufwand möglich, aber: was ist, wenn sich die Struktur erneut ändert?
Also, schaun wir mal: ich habe den TextImport auf TextImportT (T!) kopiert, bei dem ein Trennzeichen für die Werte angegeben werden *kann*; beim neuen Aufruf
Call TextImportT(Blatt, Datei, vbCrLf, nZ, "")
wird allerdings ein Leerstring übergeben (also nicht " " mit Leerzeichen, sondern "" ohne was zwischendrin), mit dem übrigens auch die alten Dateien funktionieren.
Der Kern wurde geändert:
Dim valW$ ' valide Werte
valW = "0123456789.-" & vbLf & vbCr
' usw., dann
For iIn = 1 To Len(sIn)
s0 = Mid(sIn, iIn, 1)
If InStr(valW, s0) > 0 Then
sOut = sOut & s0
Else
If WerteTrennung "" Then
If s0 = WerteTrennung Then sOut = sOut & "|"
Else
sOut = sOut & "|"
While InStr(valW, Mid(sIn, iIn + 1, 1)) = 0 And iIn
Durch das While werden die "beliebigen" Zeichen nach dem 1., das nicht in valW enthalten ist, ignoriert.
Es scheint zu funktionieren, allerdings ist mir nicht ganz wohl dabei, eine derartige Konstruktion zu verwenden wie:
Sub forTest()
Dim i&
For i = 1 To 5
MsgBox i
If i = 3 Then i = 4
Next
End Sub
bei der der Wert des Schleifenzählers in einer For-Schleife direkt geändert wird.
Eigentlich würde ich lieber eine while..wend verwenden, bin jetzt aber zu faul, das umzuschreiben.
Das Makro erzeugt weiterhin einzelne Blätter. Um da nicht groß eingreifen zu müssen, habe ich einen extra Button für eine Übersicht hinzugefügt, bei man die zu kopierenden Bereiche eingeben kann.
Der neue Code hat den Nachteil, daß die 1. Spalte immer leer bleibt, weil führende " " vorhanden sind.
Auch das könnte man ändern, was allerdings mit einem gewissen Aufwand verbunden ist, weil ich den *kompletten*, eingelesenen String in der Schleife verwurschtele und erst später eine Trennung in einzelne Zeilen vornehme (dann wäre es einfach, Leerzeichen mit trim/ltrim wegzuwerfen).
Na, vielleicht taugt's ja so: https://www.herber.de/bbs/user/111664.xlsm
Schöne Grüße,
Michael