grasihuepfer
Goto Top

VBA Import Textdatei

Hi Leute!

Ich möchte gern eine Textdatei einlesen, im Excel ausgeben und splitten.

Jetzt habe ich schon eine VBA-Formel bekommen:

Sub Import_TxtFile()

Dim X As Double
Dim TXT As String

Open "C:\test.txt" For Input As #1

'Startpunkt
X = 1


Do While Not EOF(1)
Line Input #1, TXT
Cells(1, 1).Offset(X, 0) = TXT
X = X + 1
Loop

Close #1

For j = 1 To X
Text = Split(Cells(j, 1), " ")
For i = 0 To UBound(Text)
Cells(j, i + 1) = Text(i)
Next
Next


End Sub


Problem an der ganzen Sache ist, dass sich die Textdatei ständig automatisch aktualisiert. Ich möchte immer nur die untersten (also neuesten) 70 Zeilen eingelesen haben.

Kann mir jemand den entscheiden Tipp geben.

Ich danke Euch

Content-Key: 221471

Url: https://administrator.de/contentid/221471

Printed on: April 24, 2024 at 21:04 o'clock

Member: Meierjo
Meierjo Nov 08, 2013 at 06:12:30 (UTC)
Goto Top
HAllo

Probiers mal mit dieser Anpassung
Nach dem einlesen der Datei wird die letzte Zeile mit Inhalt gesucht, und dann 70 abgezogen (Z)

Von dort aus sollte die Auswertung gestartet werden

Close #1

'letzte Zeile mit Inhalt in Spalte A suchen, und 70 abziehen
'= Startpunkt, um Text zu splitten
Z = Range("A65536").End(xlUp).Row - 70

For j = Z To X


Gruss Meierjo
Member: grasihuepfer
grasihuepfer Nov 08, 2013 at 09:03:52 (UTC)
Goto Top
Hallo Maierjo,

vielen Dank schon mal. Leider kommt ein Laufzeitfehler, eventuell habe ich deine Bausteine nicht richtig eingefügt, schau mal hier:

Sub Import_TxtFile()

Dim X As Double
Dim TXT As String

Open "C:\test lang.txt" For Input As #1

'Startpunkt
X = 0

Do While Not EOF(1)
Line Input #1, TXT
Cells(1, 1).Offset(X, 0) = TXT
X = X + 1
Loop

Close #1

z = Range("A65536").End(xIUp).Row - 70

For j = z To X

Text = Split(Cells(j, 1), " ")
For i = 0 To UBound(Text)
Cells(j, i + 1) = Text(i)
Next
Next


End Sub


Was meinst Du, wo mein Fehler liegt?
Member: Meierjo
Meierjo Nov 08, 2013 at 09:44:57 (UTC)
Goto Top
Hallo

- Wie heisst der Laufzeitfehler?
- Wo kommt den der Laufzeitfehler?
- Wieviele Zeilen hat die Textdatei, die importiert werden soll?
- Sind eventuell leere Zeilen in der Textdatei?

Gruss meiejo
Member: grasihuepfer
grasihuepfer Nov 08, 2013 at 10:56:29 (UTC)
Goto Top
Hallo,

- Laufzeitfehler 1004 (Anwendungs- und objektdefinierter Fehler)
- er kommt, nachdem er alles in das Tabellenblatt übernommen hat, aber noch vor dem Splitten
- die Textdatei hat über 2000 Zeilen
- es kommen ca alle 50 Zeilen 3 Leerzeilen, ist aber immer unterschiedlich

Er schreibt übrigens trotzdem alle 2031 Zeilen ins Tabellenblatt, also nicht nur die 70

Gruß grasihuepfer
Member: Meierjo
Meierjo Nov 08, 2013 updated at 12:36:18 (UTC)
Goto Top
Hallo

Habe die Zeile "Z = Range("a65536").End(xlUp).Row"
nochmals neu eingetippt, jetzt funktionierts. War wahrscheinlich ein nicht darstellbares Zeichen im String.

Ja, ist korrekt, er liest alle Zeilen ein, splittet aber nur die letzten 70 Zeilen. Den Rest lässt er stehen.

Wenn du nur die 70 Zeilen einlesen und splitten willst, musst du meines Erachtens 2 Durchgänge machen, zuerst das Textfile einlesen, damit Excel weiss, wieviele Zeilen die Datei enthält, und dann im 2. Anlauf nur die letzten 70 Zeilen einlesen und splitten.

Gruss
Member: grasihuepfer
grasihuepfer Nov 09, 2013 at 06:06:37 (UTC)
Goto Top
Hallo,

kannst Du mir eventuell die Formel schicken? ich bin wirlich kein Ass in VBA.

Danke und Gruß grasihuepfer
Member: Meierjo
Meierjo Nov 09, 2013 at 18:47:07 (UTC)
Goto Top
Hallo

Könnte in etwa so aussehen

Sub Import_TxtFile()

Dim X As Double
Dim TXT As String

Open "C:\test lang.txt" For Input As #1

'Startpunkt
X = 0

Do While Not EOF(1)
Line Input #1, TXT
Cells(1, 1).Offset(X, 0) = TXT
X = X + 1
Loop

Close #1

'Zeilen zählen mit Inhalt, abzüglich 70
Z = Range("A65536").End(xlUp).Row - 70

'alle Zeilen löschen, ausser die letzten 70
Range("A1:A" & Z).Delete shift:=xlUp

'die verbleibenden 70 Zeilen splitten
For j = 1 To 70
Text = Split(Cells(j, 1), " ")
For i = 0 To UBound(Text)
Cells(j, i + 1) = Text(i)
Next
Next
End Sub

Gruss meierjo
Member: grasihuepfer
grasihuepfer Nov 11, 2013 at 16:55:47 (UTC)
Goto Top
Superklasse Meierjo!!!

Du hast mir echt aus der patsche geholfen! Das Makro funktioniert einwandfrei. jetzt habe ich noch ein letztes anliegen: wenn ich statt der letzten 70 Zeilen die ersten 15 Zeilen importieren und splitten möchte, welchen Zeilen im Makro muss ich wie umschreiben?

Danke schon mal im voraus
Member: Meierjo
Meierjo Nov 12, 2013 at 05:18:01 (UTC)
Goto Top
Hallo

Super, wenns klappt, freut mich.

Um die ersten 15 Zeilen zu erhalten, musst du 3 Zeilen umschreiben

'alle Zeilen zählen mit Inhalt
Z = Range("A65536").End(xlUp).Row

'Zeile 16 bis zur letzten löschen
Range("A16:A" & Z).Delete shift:=xlUp

'die verbleibenden 15 Zeilen splitten
For j = 1 To 15

Gruss meierjo
Member: grasihuepfer
grasihuepfer Nov 14, 2013 at 07:05:16 (UTC)
Goto Top
Hi Meierjo,

Super danke!

Jetzt habe ich leider schon wieder ein neues Problem. Ich habe die ersten Zeilen bzw. Zellen, die durch das Makro ausgegeben werden, mit anderen Zellen durch Formeln verknüpft. und jetzt passiert wahrscheinlich folgendes: Die Ergebnisse werden berechnet, wenn das Makro komplett eingelesen und ausgegeben wurde. wenn aber nun alle Zellen wieder gelöscht werden und die ersten 70 neu geschrieben werden, wird mir in allen verknüpften Zellen der #Bezug-Fehler angezeigt. Hast Du eventuell noch eine Idee, wie man das umgehen könnte?

Danke Dir schon mal im voraus

Gruß grasihuepfer
Member: Meierjo
Meierjo Nov 14, 2013 at 07:21:19 (UTC)
Goto Top
Hallo

Ist klar, wenn du eine Formel hast, die sich zB auf die Zelle A12 bezieht, und diese Zeile wird ja durch da Makro gelöscht, ist der Bezug ja weg, daher der #Bezug Fehler.

Wenn möglich, die Formel anpassen, oder per Makro die Formel nach dem löschen der Zeilen wieder neu erstellen lassen.

Gruss
Member: grasihuepfer
grasihuepfer Nov 14, 2013 at 15:02:00 (UTC)
Goto Top
Hallo,

Kannst Du mir da noch mal Schützenhilfe leisten? Wie sieht das Makro dazu aus, um die Formel nach dem löschen neu zu erstellen bzw. wie soll ich denn die Formel umschreiben? Ich muss ja diesen Vorgang (Makro) öfters wiederholen, da ich immer wieder neue Textdateien bearbeiten muss.

Man müsste also eine einheitliche Lösung finden, die sich immer wiederholen lässt, ohne Fehler zu bringen.

Ich hoffe, ich habe mich verständlich ausgedrückt.

Gruss
Member: Meierjo
Meierjo Nov 14, 2013 at 15:16:59 (UTC)
Goto Top
Hallo

Dazu bräuchte ich am besten die Textdatei, sowie die bestehende Excel-Datei, in der das Makro drin ist.

Dann müsste ich möglichst genau wissen, was da gesplittet werden muss, und was davon dann schlussendlich gebraucht wird.

Wie kompliziert ist denn die Formel?
Kennst du den Makro-Recorder? Damit kannst du die Formel aufzeichnen.


Gruss meierjo
Member: grasihuepfer
grasihuepfer Nov 14, 2013 at 19:41:23 (UTC)
Goto Top
Hi,

mir ist gerade noch ne andere Idee gekommen. Was hälst du davon:

Ich habe ja Tabellenblatt 1. Hier wird dein Makro mit den letzten 70 Zeilen ausgeführt und hier sind auch alle Zellen verknüpft durch die Formeln.

Wenn ich aber jetzt dein Makro für Tabellenblatt 2 verwende, quasi als temporäres Tabellenblatt, und dann noch mit einem neuen Makro die fertigen 70 Zeilen in das erste Tabellenblatt kopiere, würde doch der Bezugfehler nicht kommen. Im Grunde wird ja dann in Blatt 1 nichts gelöscht. Die Makros lass ich dann einfach nacheinander laufen.

Ich bräuchte allerdings noch dieses wahrscheinlich relativ einfache und kurze Makro zum Kopieren. Und zwar betrifft das den Bereich A1:W70. Es sollen letztendlich A1:W70 aus Tabelle 2 in A1:W70 in Tabelle 1 kopiert werden.

Wäre super, wenn Du mir hier noch mal helfen könntest.

Gruss grasihuepfer
Member: Meierjo
Meierjo Nov 15, 2013 at 05:25:36 (UTC)
Goto Top
Hallo und guten morgen

Die Zellen kopierst du mit folgenden Teil (zB am Ende des bestehenden Makros einfügen):
Worksheets("Tabelle2").Range("A1:W70").Copy
Worksheets("Tabelle1").Range("A1:W70").PasteSpecial xlPasteValues
Application.CutCopyMode = False


Zum Kennenlernen von Excel und VBA kann ich dir übrigens die Seite http://www.herber.de/ empfehlen.

Hat viele Erklärungen und praktische Beispiele. Damit habe ich bereits vor Jahren meine ersten Geh-Versuche in VBA gemacht.

Gruss Meierjo
Member: grasihuepfer
grasihuepfer Nov 15, 2013 at 12:57:12 (UTC)
Goto Top
Hi Meierjo,

vielen Dank für Deine tatkräftige Unterstützung. Das war echt eine große Hilfe für mich!!

Alles Gute und bis bald face-smile
Member: grasihuepfer
grasihuepfer Nov 29, 2013 at 05:18:34 (UTC)
Goto Top
Hi Meierjo,

um noch mal auf diese Frage zurück zu kommen. Gibt es eigentlich de Möglichkeit, gleich nur die ersten 15 Zeilen einzulesen. Problem ist, dass die Textdatei ziemlich groß ist. Nun dauert es ewig, bis Excel alles erst mal schreibt um dann wieder alle Zeilen ab Zeile 15 zu löschen. Man könnte ja geschickterweise nur die ersten 15 Zeilen einlesen und splitten.

Hast Du eine Idee?

Danke im voraus
Member: Meierjo
Meierjo Nov 29, 2013 at 05:32:44 (UTC)
Goto Top
Gutes mörgeli

Diesen Teil des Codes anpassen:

Open "C:\temp\test lang.txt" For Input As #1
'Startpunkt
X = 0
'Do While Not EOF(1)
' Line Input #1, TXT
' Cells(1, 1).Offset(X, 0) = TXT
' X = X + 1
' Loop
For I = 1 To 15
Line Input #1, TXT
Cells(1, 1).Offset(X, 0) = TXT
X = X + 1
Next

Gruss
Member: grasihuepfer
grasihuepfer Nov 29, 2013 at 11:52:03 (UTC)
Goto Top
Vielen Dank,

dann müsste es doch auch möglich sein, den punkt 70 Zeilen vor Ende zu finden und nur von hier aus bis zum Ende einzulesen. Ein weiteres Problem, was ich noch habe, ist das die Texte unterschiedlich viele Spalten haben. Und wenn ich dann die aktualisierte Textdatei einlese und sich Zeilen verkürzt haben, bleibt vom vorhergehenden Import noch etwas stehen. Man müsste also das Tabellenblatt in einem bestimmtem Bereich vor dem nächsten Import löschen.
Member: Meierjo
Meierjo Nov 29, 2013 at 12:23:57 (UTC)
Goto Top
Hallo

dann müsste es doch auch möglich sein, den punkt 70 Zeilen vor Ende zu finden und nur von hier aus bis zum Ende
Wenn das Textfile immer gleich viele Zeilen hat, dann ja
Dann könntest du im Code in etwa folgendes eingeben:

X = 0
For I = 1 To 120
Line Input #1, TXT
If I > 90 Then
Cells(1, 1).Offset(X, 0) = TXT
X = X + 1
End If
Next

So würde der Code zB die Zeilen 91 bis 120 einlesen

Ein weiteres Problem, was ich noch habe, ist das die Texte unterschiedlich viele Spalten haben. Und wenn ich dann die
aktualisierte Textdatei einlese und sich Zeilen verkürzt haben, bleibt vom vorhergehenden Import noch etwas stehen. Man
müsste also das Tabellenblatt in einem bestimmtem Bereich vor dem nächsten Import löschen.

Am Anfang vom Ccode
Cells.Delete shift:=xlUp
leert die ganze Tabelle.

Gruss meierjo
Member: grasihuepfer
grasihuepfer Dec 04, 2013 at 04:58:19 (UTC)
Goto Top
Moin Moin,

leider ändert sich die Länge der Textdatei ständig, von daher ist mit dem oberen Code leider nichts zu machen.

Wie sieht es denn aus, wenn man den Text von hinte nach vorn einlesen und schreiben könnte?

Dann gebe es die Möglichkeit, erst alles einzulesen und quasi die ersten 70 Zeilen (eigentlich dann die letzten ) zu schreiben.

Hast Du ne Idee?
Member: Meierjo
Meierjo Dec 04, 2013 at 05:37:17 (UTC)
Goto Top
Hallo

wie lange ist den die Textdatei?? Wenn ich eine Textdatei mit ca 50'000 Zeilen einlese, dauert das Einlesen ca 3 Sekunden.
Ich denke, das sollte schnell genug sein.

Wenn zuerst alles eingelesen werden soll, und dann zB nur die letzten 70 weiter verwertet werden, dauert das mE gleich lange, wie wenn du alle eingelesenen Zeilen schreibst.

Gruss meierjo
Member: grasihuepfer
grasihuepfer Dec 04, 2013 at 13:07:26 (UTC)
Goto Top
Meine Textdatei hat ca. 2000 Zeilen. Sie ändert sich 1 - 2 Mal die Minute und muss relativ zügig abgefragt werden. Im Moment dauert bei mir die Makroabfolge mit insgesamt 4 Makros 4 Sekunden + 2 Sekunden für die Berechnung aller meiner verbauten Formeln.

Das Ganze könnte schon etwas schneller gehen. Es geht hier um Online-Poker Dateien, die schnell abgefragt werden müssen, um dann selbst schnell die richtigen Entscheidungen treffen zu können. Ist etwas zu komplex, um das alles zu erläutern.

Es wäre halt toll gewesen, wenn man etwas Zeit einsparen würde.

Aber was nicht geht, geht halt nicht.

Ich dank Dir für die Hilfe
Member: grasihuepfer
grasihuepfer Dec 05, 2013 at 05:03:40 (UTC)
Goto Top
Hi meierjo,

hab bezüglich der Schnelligkeit der Makros was tolles gefunden. Schau mal hier: http://www.experto.de/en/b2b/office/excel/excel-vba-makros-turbo-schnel ...

Die Makros laufen in weniger als einer halben Sekunde durch, echt super!!!