Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

VBA Import Textdatei

Frage Entwicklung VB for Applications

Mitglied: grasihuepfer

grasihuepfer (Level 1) - Jetzt verbinden

08.11.2013, aktualisiert 21.11.2013, 3859 Aufrufe, 24 Kommentare

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
Mitglied: Meierjo
08.11.2013 um 07:12 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
08.11.2013 um 10:03 Uhr
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?
Bitte warten ..
Mitglied: Meierjo
08.11.2013 um 10:44 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
08.11.2013 um 11:56 Uhr
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
Bitte warten ..
Mitglied: Meierjo
08.11.2013, aktualisiert um 13:36 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
09.11.2013 um 07:06 Uhr
Hallo,

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

Danke und Gruß grasihuepfer
Bitte warten ..
Mitglied: Meierjo
09.11.2013 um 19:47 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
11.11.2013 um 17:55 Uhr
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
Bitte warten ..
Mitglied: Meierjo
12.11.2013 um 06:18 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
14.11.2013 um 08:05 Uhr
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
Bitte warten ..
Mitglied: Meierjo
14.11.2013 um 08:21 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
14.11.2013 um 16:02 Uhr
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
Bitte warten ..
Mitglied: Meierjo
14.11.2013 um 16:16 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
14.11.2013 um 20:41 Uhr
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
Bitte warten ..
Mitglied: Meierjo
15.11.2013 um 06:25 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
15.11.2013 um 13:57 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
29.11.2013 um 06:18 Uhr
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
Bitte warten ..
Mitglied: Meierjo
29.11.2013 um 06:32 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
29.11.2013 um 12:52 Uhr
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.
Bitte warten ..
Mitglied: Meierjo
29.11.2013 um 13:23 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
04.12.2013 um 05:58 Uhr
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?
Bitte warten ..
Mitglied: Meierjo
04.12.2013 um 06:37 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
04.12.2013 um 14:07 Uhr
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
Bitte warten ..
Mitglied: grasihuepfer
05.12.2013 um 06:03 Uhr
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!!!
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
VB for Applications
Import Textdatei von Dateiname aus Zelle (2)

Frage von grasihuepfer zum Thema VB for Applications ...

VB for Applications
gelöst Excel VBA .csv Import in Tabelle x, ab Spalte y

Frage von drimrim zum Thema VB for Applications ...

VB for Applications
gelöst Wie mittels VBA beim Import von CSV dateien das Format aller Zellen auf "Zahl" ändern? (2)

Frage von Glibber4 zum Thema VB for Applications ...

Batch & Shell
Powershell - In Textdatei suchen und ersetzen (3)

Frage von Raaja89 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...