Discussion:
ASCII-Datei - Import nach Excel mit VBA
(zu alt für eine Antwort)
Florian Zille
2007-06-20 10:54:03 UTC
Permalink
Hallo,

wie kann ich eine eingelesene Zeile aus einer ASCII-Datei
mit jeweils unterschiedlich breiten Spalten einlesen?
Bei Trennungszeichen wie TAB oder , kann ich die Split-Funktion
verwenden. Was mache ich jedoch, wenn zwischen den Spalten
eine jeweils unterschiedliche Anzahl von Leerzeichen (>1) steht?

Zeilenformat: Name Anzahl Beschreibung Nummer

In der Beschreibung stehen einzelne Leerzeichen zwischen Wörtern.
Hier darf nicht getrennt werden! Erst wenn es mehr als 1 Leerzeichen
sind.

Bsp.

AAA 4 ABC, D, EF Z1
BB 3 CDE, EF Z2
CCCC 3 ABCDF, EE, DD Z3

Wie kann ich dies in VBA realisieren?
s***@web.de
2007-06-20 11:35:17 UTC
Permalink
On 20 Jun., 12:54, Florian Zille
Post by Florian Zille
Hallo,
wie kann ich eine eingelesene Zeile aus einer ASCII-Datei
mit jeweils unterschiedlich breiten Spalten einlesen?
Bei Trennungszeichen wie TAB oder , kann ich die Split-Funktion
verwenden. Was mache ich jedoch, wenn zwischen den Spalten
eine jeweils unterschiedliche Anzahl von Leerzeichen (>1) steht?
Hallo zurück,
ich würde ja ersteinmal mit suchen ersetzen alle " " (zwei
Leerzeichen) durch " " (ein Leerzeichen) ersetzten und dann Text in
Spalten.
- Ich finde es manchmal einfacher den Makrorekorder zu nehmen und den
Code dann zu bearbeiten!

Gruß
Sabine
Post by Florian Zille
Zeilenformat: Name Anzahl Beschreibung Nummer
In der Beschreibung stehen einzelne Leerzeichen zwischen Wörtern.
Hier darf nicht getrennt werden! Erst wenn es mehr als 1 Leerzeichen
sind.
Bsp.
AAA 4 ABC, D, EF Z1
BB 3 CDE, EF Z2
CCCC 3 ABCDF, EE, DD Z3
Wie kann ich dies in VBA realisieren?
Florian Zille
2007-06-20 11:45:00 UTC
Permalink
danke, aber das gibt probleme mit einzelne leerzeichen.
ich brauche schon eine lösung ohne makro-rekorder und ohne leerzeichen zu
ersetzen. Soll ja vollautomatisch beliebig oft verwendbar sein.
Post by s***@web.de
On 20 Jun., 12:54, Florian Zille
Post by Florian Zille
Hallo,
wie kann ich eine eingelesene Zeile aus einer ASCII-Datei
mit jeweils unterschiedlich breiten Spalten einlesen?
Bei Trennungszeichen wie TAB oder , kann ich die Split-Funktion
verwenden. Was mache ich jedoch, wenn zwischen den Spalten
eine jeweils unterschiedliche Anzahl von Leerzeichen (>1) steht?
Hallo zurück,
ich würde ja ersteinmal mit suchen ersetzen alle " " (zwei
Leerzeichen) durch " " (ein Leerzeichen) ersetzten und dann Text in
Spalten.
- Ich finde es manchmal einfacher den Makrorekorder zu nehmen und den
Code dann zu bearbeiten!
Gruß
Sabine
Post by Florian Zille
Zeilenformat: Name Anzahl Beschreibung Nummer
In der Beschreibung stehen einzelne Leerzeichen zwischen Wörtern.
Hier darf nicht getrennt werden! Erst wenn es mehr als 1 Leerzeichen
sind.
Bsp.
AAA 4 ABC, D, EF Z1
BB 3 CDE, EF Z2
CCCC 3 ABCDF, EE, DD Z3
Wie kann ich dies in VBA realisieren?
Alexander Wolff
2007-06-20 12:41:25 UTC
Permalink
B1: =WECHSELN(WECHSELN(WECHSELN(WECHSELN(WECHSELN(WECHSELN(A1;" ";
"#");"##";"#");"##";"#");"##";"#");"##";"#");"# ";"#")

als Vorabreinigung für A1, damit mehrfache (bis 32) Leerzeichen zu einem
einzigen Trennzeichen werden.

VBA-makros kannst Du ja selbst aufzeichnen und diese Formel dort einsetzen.
--
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2
Florian Zille
2007-06-20 14:29:03 UTC
Permalink
die spaltenanzahl variiert in der quelldatei auch...

gibts da nicht so was wie split? sonst müßte ich alles zeichenweiße
zerlegen...
Post by Alexander Wolff
B1: =WECHSELN(WECHSELN(WECHSELN(WECHSELN(WECHSELN(WECHSELN(A1;" ";
"#");"##";"#");"##";"#");"##";"#");"##";"#");"# ";"#")
als Vorabreinigung für A1, damit mehrfache (bis 32) Leerzeichen zu einem
einzigen Trennzeichen werden.
VBA-makros kannst Du ja selbst aufzeichnen und diese Formel dort einsetzen.
--
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2
Alexander Wolff
2007-06-20 15:25:53 UTC
Permalink
Post by Florian Zille
Post by Alexander Wolff
B1: =WECHSELN(WECHSELN(WECHSELN(WECHSELN(WECHSELN(WECHSELN(A1;" ";
"#");"##";"#");"##";"#");"##";"#");"##";"#");"# ";"#")
die spaltenanzahl variiert in der quelldatei auch...
gibts da nicht so was wie split? sonst müßte ich alles zeichenweiße
zerlegen...
Deine Kleinschreibung tut in den Augen weh. Außerdem könntest Du erst mal
ein Feedback geben, bevor Du Probleme nachschiebst.

Für den Split - nach der Reinigungsformel - nimm www.xxcl.de/0043.htm. Da
stimmt sogar schon das Trennzeichen zu der o.g. Formel.
--
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2
Bernd P
2007-06-20 15:54:56 UTC
Permalink
Hallo Florian,

ohne eine genauere Beschreibung ist es nicht einfach, Dir zu helfen.

Du kannst ggf. ganze Zeilen einlesen, dann "," durch " " ersetzen,
dann Application.Worksheetfunction.Proper anwenden (um mehrere
Leerzeichen durch ein Einzelnes zu ersetzen) und dann split auf " "
anwenden.

Aber wie gesagt: Was genau willst Du machen und wie genau sehen Deine
Eingabezeilen aus?

Viele Grüße,
Bernd
Florian Zille
2007-06-20 17:29:01 UTC
Permalink
Hallo Bernd,

das Problem hatte ich ja eingangs schon beschrieben. Ich formuliere es mal
anders:

Nehmen wir folgende Zeilen an:

Zelle A1: Text1 6 Text11a, Text12a R1
Zelle A2: Text2 4 Text21a, Text22a, Text23a R2 R21
R3
...

Ergebnis sollte sein:

Zelle B1: Text1
Zelle C1: 6
Zelle D1: Text11a, Text12a
Zelle E1: R1

Zelle B2: Text2
Zelle C2: 4
Zelle D2: Text21a, Text22a, Text23a
Zelle E2: R2 R21
Zelle F2: R3
...

Gruß,
Flo.
Post by Bernd P
Hallo Florian,
ohne eine genauere Beschreibung ist es nicht einfach, Dir zu helfen.
Du kannst ggf. ganze Zeilen einlesen, dann "," durch " " ersetzen,
dann Application.Worksheetfunction.Proper anwenden (um mehrere
Leerzeichen durch ein Einzelnes zu ersetzen) und dann split auf " "
anwenden.
Aber wie gesagt: Was genau willst Du machen und wie genau sehen Deine
Eingabezeilen aus?
Viele Grüße,
Bernd
Claus Busch
2007-06-20 17:55:10 UTC
Permalink
Hallo Florian,
Post by Florian Zille
das Problem hatte ich ja eingangs schon beschrieben. Ich formuliere es mal
Zelle A1: Text1 6 Text11a, Text12a R1
Zelle A2: Text2 4 Text21a, Text22a, Text23a R2 R21
R3
...
Zelle B1: Text1
Zelle C1: 6
Zelle D1: Text11a, Text12a
Zelle E1: R1
Zelle B2: Text2
Zelle C2: 4
Zelle D2: Text21a, Text22a, Text23a
Zelle E2: R2 R21
Zelle F2: R3
dann probiere mal an einer Kopie deiner Mappe folgenden Code:
Sub Trennen()
Dim LRow As Long

LRow = Cells(Rows.Count, 1).End(xlUp).Row

Range("B1").FormulaR1C1 = _
"=SUBSTITUTE(RC[-1],"" "",""#"")"
Range("B1").AutoFill _
Destination:=Range("B1:B" & LRow), Type:=xlFillDefault
Range("B1:B" & LRow).Copy
Range("B1").PasteSpecial Paste:=xlValues, _
Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("B1:B" & LRow).TextToColumns Destination:=Range("B1"), _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, _
Other:=True, OtherChar:="#", _
FieldInfo:=Array(Array(1, 1), Array(2, 1), _
Array(3, 1), Array(4, 1), Array(5, 1))
Columns("B:G").AutoFit
End Sub
--
Mit freundlichen Grüssen
Claus Busch

Win XP Prof SP2 / Vista Ultimate
Office 2000 SP3 / 2007 Ultimate
Florian Zille
2007-06-20 18:15:01 UTC
Permalink
Hallo Claus,

vielen Dank für Deine Hilfe! Du hast mein Problem gelöst!
Vielen Dank! Hab es gleich ausprobiert und es klappt einwandfrei.

Gruß,
Flo.
Post by Bernd P
Hallo Florian,
Post by Florian Zille
das Problem hatte ich ja eingangs schon beschrieben. Ich formuliere es mal
Zelle A1: Text1 6 Text11a, Text12a R1
Zelle A2: Text2 4 Text21a, Text22a, Text23a R2 R21
R3
...
Zelle B1: Text1
Zelle C1: 6
Zelle D1: Text11a, Text12a
Zelle E1: R1
Zelle B2: Text2
Zelle C2: 4
Zelle D2: Text21a, Text22a, Text23a
Zelle E2: R2 R21
Zelle F2: R3
Sub Trennen()
Dim LRow As Long
LRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("B1").FormulaR1C1 = _
"=SUBSTITUTE(RC[-1],"" "",""#"")"
Range("B1").AutoFill _
Destination:=Range("B1:B" & LRow), Type:=xlFillDefault
Range("B1:B" & LRow).Copy
Range("B1").PasteSpecial Paste:=xlValues, _
Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("B1:B" & LRow).TextToColumns Destination:=Range("B1"), _
DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, _
Other:=True, OtherChar:="#", _
FieldInfo:=Array(Array(1, 1), Array(2, 1), _
Array(3, 1), Array(4, 1), Array(5, 1))
Columns("B:G").AutoFit
End Sub
--
Mit freundlichen Grüssen
Claus Busch
Win XP Prof SP2 / Vista Ultimate
Office 2000 SP3 / 2007 Ultimate
Bernd P
2007-06-20 18:01:12 UTC
Permalink
Hallo Florian,

das ist schon eine nette Herausforderung.

Ich würde nach dem RegExpReplace Makro meines Namensvetters Bernd S in
dieser Gruppe suchen und dann die Eingabezeilen nach regulären
Ausdrücken trennen.

Viele Grüße,
Bernd
Florian Zille
2007-06-20 18:18:01 UTC
Permalink
Hallo Bernd,

Claus Busch hat das Problem inzwischen gelöst.
Trotzdem Danke!

Gruß,
Flo.
Post by Bernd P
Hallo Florian,
das ist schon eine nette Herausforderung.
Ich würde nach dem RegExpReplace Makro meines Namensvetters Bernd S in
dieser Gruppe suchen und dann die Eingabezeilen nach regulären
Ausdrücken trennen.
Viele Grüße,
Bernd
Loading...