Anzeige
Archiv - Navigation
892to896
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
892to896
892to896
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Textdatei einlesen mit Besonderheit

Textdatei einlesen mit Besonderheit
08.08.2007 12:20:22
Pascal
Hallo zusammen,
hätte mal eine Frage, vielleicht kann mir jemand helfen.
Habe dank einer Hilfestellung geschafft eine Textdatei vor dem Einlesen in Exscel zu selektieren, um so nur bestimmte Datensätze ins Excel zu bekommen.
Dabei beginnt jeder Datensatz mit der Zeichenfolge "&8"
In der 5. Zeile nach dieser Zeichenfolge sind sowohl Kundenangaben, al auch eine 7-stellige Kundennummer enthalten. Ich möchte nun, dass die Datei nach wie vor einliest, allerdings jeweils für die 5. Zeile nach dieser Zeichenfolge ("&8") nur die ersten 7 Zeichen von rechts aus der Textdatei übernimmt.
Gibt es hierfür eine Lösung?
Viele Grüße
Pascal

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Textdatei einlesen mit Besonderheit
08.08.2007 12:25:17
Ramses
Hallo
"...Gibt es hierfür eine Lösung?..."
Es gibt für fast alles eine Lösung, aber erwarte nicht dass wir das Rad neu erfinden.
Wo ist der Code zum einlesen ?
Gruss Rainer

AW: Textdatei einlesen mit Besonderheit
08.08.2007 12:36:00
Pascal
Hallo Rainer,
hier der Code mit dem die Datei bisher eingelesen werden kann

Sub sammelrechnung()
Dim mytext As String, i As Long, flag As Boolean
Open "C:\liste.txt" For Input As #1
While Not (EOF(1))
Line Input #1, mytext
If Left(mytext, 6) = "    &5" Then flag = False
If Left(mytext, 6) = "    &6" Then flag = False
If Left(mytext, 6) = "    --" Then flag = False
If Left(mytext, 6) = "    &8" Or flag Then
If Not (flag) Then flag = True
i = i + 1
Cells(i, 2).Value = mytext
End If
Wend
Close #1
End Sub


Gruß
Pascal

Anzeige
AW: Textdatei einlesen mit Besonderheit
08.08.2007 12:54:00
Rudi
Hallo,
ungetestet:

Sub sammelrechnung()
Dim mytext As String, i As Long, flag As Boolean, n As Integer
Open "C:\liste.txt" For Input As #1
While Not (EOF(1))
Line Input #1, mytext
Select Case Left(mytext, 6)
Case "    &5", "    &6", "    --"
flag = False
Case "    &8"
flag = True
i = i + 1
n = 0
End Select
If flag = True Then
If n = 5 Then
Cells(1, 2) = Right(mytext, 7)
Else
Cells(i, 2).Value = mytext
n = n + 1
End If
Wend
Close #1
End Sub


Gruß
Rudi
Eine Kuh macht Muh, viele Kühe machen Mühe

Anzeige
AW: Textdatei einlesen mit Besonderheit
08.08.2007 16:19:43
Pascal
Hallo Rudi,
danke für den Tipp. Allerdings hat es noch nicht geklappt.
Ich bekomme die Fehlermeldung: "Fehler beim kompilieren. Wend ohne while"
Gruß

AW: Textdatei einlesen mit Besonderheit
08.08.2007 16:48:00
Ramses
Hallo
Das ist ein Debugger Fehler, es fehlt eigentlich ein "End If"
If flag = True Then
If n = 5 Then
Cells(1, 2) = Right(mytext, 7)
Else
Cells(i, 2).Value = mytext
n = n + 1
End If
End If
Wend
Gruss Rainer

AW: Textdatei einlesen mit Besonderheit
08.08.2007 16:58:00
Pascal
Hi,
also, ich habe jetzt das end if noch ergänzt.
Er macht auch etwas, allerdings nicht genau was er soll...
Excel listet mir nun jede 5. Zeile nach dem "&8" komplett auf.
Ich möchte aber, dass die anderen Zeilen (Zeile 1-4 und 6-x) beibehalten und für die jeweils 5. nur die rechten 7 Zeichen.
Der Code sieht zur Zeit folgendermaßen aus:

Sub sammelrechnung2()
Dim mytext As String, i As Long, flag As Boolean, n As Integer
Open "c:\liste.txt" For Input As #1
While Not (EOF(1))
Line Input #1, mytext
Select Case Left(mytext, 6)
Case "    &5", "    &6", "    --"
flag = False
Case "    &8"
flag = True
i = i + 1
n = 0
End Select
If flag = True Then
If n = 6 Then
Cells(1, 2) = Right(mytext, 7)
Else
Cells(i, 2).Value = mytext
n = n + 1
End If
End If
Wend
Close #1
End Sub


Viele Grüße
Pascal

Anzeige
AW: Textdatei einlesen mit Besonderheit
09.08.2007 09:56:09
Pascal
...noch offen...

AW: Textdatei einlesen mit Besonderheit
09.08.2007 10:17:00
Ramses
Hallo
Sub sammelrechnung2()
    Dim mytext As String, i As Long, flag As Boolean, n As Integer
    Open "c:\liste.txt" For Input As #1
    While Not (EOF(1))
        Line Input #1, mytext
        Select Case Left(mytext, 6)
            Case " &5", " &6", " --"
                flag = False
            Case " &8"
                flag = True
                n = 0
        End Select
        i = i + 1
        If flag = True And n = 6 Then
            Cells(i, 2) = Right(mytext, 7)
        Else
            Cells(i, 2).Value = mytext
            n = n + 1
        End If
    Wend
    Close #1
End Sub

Sollte tun.
Gruss Rainer

Anzeige
AW: Textdatei einlesen mit Besonderheit
09.08.2007 11:26:00
Pascal
Hallo Rainer,
leider nicht ganz, mít diesem Makro liest er zusätzlich zu den "&8"er Bereichen, die er einlesen soll auch die anderen ein. Ausserdem liest er nicht nur in der 6. Spalte unter dem "&8" die rechten 7 zeichen ein, sondern ab der 6. spalte für den gesamten "&8" Bereich...
Bin irgendwie ratlos.
Gruß
Pascal

Noch offen...
09.08.2007 11:41:00
Ramses
Hallo
in deinem vorletzten Posting schreibst du
"..Ich möchte aber, dass die anderen Zeilen (Zeile 1-4 und 6-x) beibehalten .."
Nun schreibst du dass du dies nicht willst.
Sorry. ich komme bei dem ganzen Konstrukt und dem Import-File sowieso nicht klar.
Ich empfehle dir folgendes:
Stell das ImportFile online zum Download
Estelle ein EXCEL File mit dem Inhalt wie das aussehen soll und lade es ebenfalls hoch.
Mit deinen Beschreibungen komme ich auf jeden Fall nicht klar.
Solltest du die Dateien hochladen, sehe ich mir das nochmal an, ansonsten steige ich hier aus.
Gruss Rainer

Anzeige
AW: Noch offen...
09.08.2007 12:08:51
Pascal
Hallo Rainer,
habe die Dateien hochgeladen.
Die Problematik ist nicht ganz so einfach in Worte zu fassen. Die Zeilen 1-4 und 6-x sollen beibehalten werden, allerdings nur in dem jeweiligen sich wiederhoilenden "&8"er Bereich.
Vielleicht sagen die Dateien mehr aus, als die Beschreibungen:
https://www.herber.de/bbs/user/44904.txt
https://www.herber.de/bbs/user/44905.xls
Es handelt sich dabei nur um einen Ausschnitt. Insgesamt sind es über 250.000 Zeilen.
Danke für deine Hilfe.
Gruß
Pascal

Anzeige
Geht weiter...
09.08.2007 12:27:00
Ramses
Hallo
Verstehe ich das richtig:
Es werden nur die Daten zwischen
-----------------------------------------------------------------------------
&8
JULI 2001
HERR
MAX MUSTER NR11: 1111111
MUSTERFACHGESCHÄFT KUNDENNUMMER-NUMMER : 1234567
MUSTERSTRAßE 1 Nummer1: 111
11111 MUSTERHAUSEN 11111
DATENBEREICH 1
DATENBEREICH 2
DATENBEREICH 3
DATENBEREICH 4
DATENBEREICH 5
DATENBEREICH 6
DATENBEREICH 7
DATENBEREICH 8
DATENBEREICH 9
DATENBEREICH 10
SUMME DATENBEREICH 11.111,11 1.111,11
SUMME DATENBEREICH 1,11
&5
----------------------------------------------------------
eingelesen ?
Die Daten die mit etwas anderem als "&8" anfangen werden NICHT eingelesen oder verarbeitet ?
Gruss Rainer

Anzeige
AW: Geht weiter...
09.08.2007 12:34:27
Pascal
Ja, richtig, nur die Daten hinter "&8" bis jeweils etwas anderes vorangestellt ist.
Das funktioniert auch bereits, allerdings kommt erschwernd hinzu, dass in der Zeile, die die Kundennummer enthält ausschliesslich die 7 Zahlen der Kundenummer stehen sollen.
Gruß

AW: Geht weiter...
09.08.2007 19:41:27
Ramses
Hallo
Den Namen der Datei musst du anpassen.
Was du mit den ganzen Leerzeichen in den Datensätzen machen willst, ist mir auch unklar.
Aber es funktioniert
Sub ImportKundenTextFile()
    Dim fileToOpen As String, impRow As Long
    Dim impLine As Variant, impFlag As Boolean
    fileToOpen = "C:\Himport.txt"
    Open fileToOpen For Input As #1
    impRow = 1
    Do While Not EOF(1)
        Line Input #1, impLine
        If InStr(1, impLine, "&") > 1 Then
            If InStr(1, impLine, "&8") > 1 Then
                impFlag = True
            Else
                impFlag = False
            End If
        End If
        If impFlag = True Then
            If InStr(1, impLine, "KUNDENNUMMER") > 1 Then
                Cells(impRow, 1) = Trim(Right(impLine, 7))
            Else
                Cells(impRow, 1) = Trim(impLine)
            End If
            impRow = impRow + 1
        End If
    Loop
    Close #1
End Sub

Gruss Rainer

Anzeige
AW: Geht weiter...
10.08.2007 10:45:19
Pascal
Hi Rainer,
vielen vielen Dank für Deine Hilfe...
Es funktioniert. Aber wie meinst du das mit den Leerzeichen?
Wenn ich das so sehe, dann sehe ich, dass ich noch viel Arbeit vor mir habe. Bin grade dabei, Visual Basic ein bisschen zu lernen, aber habe hier nichts, als ein Buch und das Internet und immer wenn man denkt, man hat was verstanden, dann klappts eben doch nicht!
Nochmals vielen Dank für Deine Mühe
Grüße
Pascal

Abschluss...
10.08.2007 13:51:41
Ramses
Hallo
Hier noch eine kleine Spielerei, weil du ja gesagt hast, dass es über 250'000 Datensätze sind
Option Explicit


Sub ImportKundenTextFile()
    '(C) Ramses
    'Liest nur Datensätze ein, die nach
    'einer bestimmten Zeichenfolge stehen
    'bis eine spezifische Zeichenfolge wiederkehrt
    'Das spezifische Zeichen ist hier "&"
    Dim fileToOpen As String, impRow As Long, Qe As Integer
    Dim impLine As Variant, impFlag As Boolean
    Dim spezString As String
    'Nach dieser Zeichenfolge wird
    'zum Beginn des einlesens gesucht
    spezString = "&8"
    'Das ist das File zum importieren
    fileToOpen = "C:\Himport.txt"
    '*********************************************
    'Hier nichts mehr ändern
    Open fileToOpen For Input As #1
    impRow = 1
    Do While Not EOF(1)
        Line Input #1, impLine
        If InStr(1, impLine, Left(spezString, 1)) > 1 Then
            If InStr(1, impLine, spezString) > 1 Then
                impRow = impRow + 1
                impFlag = True
            Else
                impFlag = False
            End If
        End If
        If impFlag = True Then
            If InStr(1, impLine, "KUNDENNUMMER") > 1 Then
                Cells(impRow, 1) = Trim(Right(impLine, 7))
            Else
                Cells(impRow, 1) = Trim(impLine)
            End If
            impRow = impRow + 1
        End If
        'Importlimit liegt bis E2003 bei 65536 Zeilen pro Tabelle
        'ab E2007 ist das Importlimit bei über 1'000'000
        'Dann entsprechend anpassen
        If impRow >= 65500 And impFlag = False Then
            Qe = MsgBox("Das Tabellenlimit zum einlesen ist erreicht." & vbCrLf & _
            "Soll eine neue Tabelle angelegt werden ?", vbYesNo + vbInformation, "Import Limit")
            If Qe = vbNo Then
                MsgBox "Datenimport wird gestoppt", vbCritical + vbOKOnly, "Import Fehler"
                Close #1
                Exit Sub
            Else
                Worksheets.Add
                impRow = 1
            End If
        End If
    Loop
    Close #1
End Sub

Gruss Rainer

Anzeige
AW: Abschluss...
10.08.2007 14:23:00
Pascal
Hallo Rainer,
ich kann nur noch staunen und dir danken!
Wie lange muss man denn Erfahrung sammeln, um sowas aus dem Kopf schreiben zu können?
Du kannst mir nicht zufällig ein gutes Buch empfehlen, mit dem ich ein bisschen schneller voran komme, oder?
Gruß
Pascal

AW: Abschluss...
10.08.2007 15:24:00
Ramses
Hallo
Das ist 3-dimensionales Denken :-)
Nein.... das kommt mit der Zeit (bei mir schon über 15 Jahre :-)).
Ich habe nämlich mit EXCEL 2.1 begonnen.
Der Witz an der ganzen Sache:
Die meisten Nutzen EXCEL heute zu nicht mehr oder weniger als damals schon möglich war.
Allerdings ist heute etwas komfortabler :-)
Ein gutes Buch ?
Für Formeln auf jeden Fall das ultimative Buch, da kommt nichts anderes ran, wenn man EXCEL verstehen und wirklich nutzen will.
http://www.excelformeln.de/uberuns.html
Das sind teilweise Moderatoren aus anderen Foren, aber auf jeden Fall Praktiker, und sie bringen es wirklich gut rüber.
Für VBA:
Nur Michael Kofler,... allerdings programmiert er auf einem hohen Level. Man muss sich dafür interessieren
http://www.bol.ch/shop/home/artikeldetails/excel_programmieren/michael_kofler/ISBN3-8273-2021-6/ID4106765.html
Ansonsten:
Klare Fragen mit klaren Anforderungen hier im Herber-Forum oder im http://www.online-excel.de stellen.
Denn problemorientiert lernst du am schnellsten
Gruss Rainer

neues Problem
13.08.2007 10:30:53
Pascal
Hallo,
vielen Dank für die Infos. Werde mir das Buch wohl mal bestellen.
Wo wir gerade beim problemorientierten lernen sind, hätte ich gleich noch zwei kleine Fragen:
1. Kann ich irgendwie festlegen, dass Excel beim Einlesen eine bestimmte Spalte verwenden soll? Also die Liste beispielsweise in Spalte C packen soll?
(Zum Abgleich mit anderen Daten soll später eine Vergleichsliste daneben eingelesen werden. Ich möchte diese Listen alle auf ein Tabellenblatt packen, da aich diese später ausblenden will)
2. Bei der obigen Liste handelt es sich um Rechnungen. Diese enthalten für alle Kunden unterschiedliche Positionen. Allerdings habe ich eine Musterrechnung, auf der alle Positionen aufgeführt sind. Nun möchte ich festlegen, dass Excel prüfen soll, wie vollständig die tatsächlichen Rechnungen sind und ggf Zeilen einfügen soll, um so für jeden Kunden auf die Länge der Musterrechnung zu kommen.
( Zur späteren Berechnung möchte ich die Zellen einfach per Formel festlegen. Verweise benötigen meines Erachtens zu viel Speicher)
Viele Grüße und einen guten Start in die Woche
Pascal

AW: neues Problem
13.08.2007 11:00:00
Ramses
Hallo
hier mit automatischer Berechnung der Importspalte.
Beginn ab Spalte C
Option Explicit

Sub ImportKundenTextFile()
    '(C) Ramses
    'Liest nur Datensätze ein, die nach
    'einer bestimmten Zeichenfolge stehen
    'bis eine spezifische Zeichenfolge wiederkehrt
    'Das spezifische Zeichen ist hier "&"
    Dim fileToOpen As String, impRow As Long, Qe As Integer
    Dim impLine As Variant, impFlag As Boolean
    Dim spezString As String
    'In diese Spalte wird mit dem Einlesen begonnen
    'wird automatisch berechnet
    Dim impCol As Integer
    'Nach dieser Zeichenfolge wird
    'zum Beginn des einlesens gesucht
    spezString = "&8"
    'Das ist das File zum importieren
    fileToOpen = "C:\Himport.txt"
    '*********************************************
    'Hier nichts mehr ändern
    Open fileToOpen For Input As #1
    'In dieser Zeile wird mit dem Einlesen begonnen
    impRow = 1
    'Importspalte berechnen
    impCol = Cells(1, 255).End(xlToLeft).Column + 1
    If impCol < 3 Then
        'Dann in Spalte C beginnen
        impCol = 3
        ElseIf impCol = 255 Then
        MsgBox "Keine Spalte zum Import mehr frei", vbOKOnly + vbCritical, "Fehler"
        Exit Sub
    End If
    Do While Not EOF(1)
        Line Input #1, impLine
        If InStr(1, impLine, Left(spezString, 1)) > 1 Then
            If InStr(1, impLine, spezString) > 1 Then
                impRow = impRow + 1
                impFlag = True
            Else
                impFlag = False
            End If
        End If
        If impFlag = True Then
            If InStr(1, impLine, "KUNDENNUMMER") > 1 Then
                Cells(impRow, impCol) = Trim(Right(impLine, 7))
            Else
                Cells(impRow, impCol) = Trim(impLine)
            End If
            impRow = impRow + 1
        End If
        'Importlimit liegt bis E2003 bei 65536 Zeilen pro Tabelle
        'ab E2007 ist das Importlimit bei über 1'000'000
        'Dann entsprechend anpassen
        If impRow >= 65500 And impFlag = False Then
            Qe = MsgBox("Das Tabellenlimit zum einlesen ist erreicht." & vbCrLf & _
            "Soll eine neue Tabelle angelegt werden ?", vbYesNo + vbInformation, "Import Limit")
            If Qe = vbNo Then
                MsgBox "Datenimport wird gestoppt", vbCritical + vbOKOnly, "Import Fehler"
                Close #1
                Exit Sub
            Else
                Worksheets.Add
                impRow = 1
                impCol = 3
            End If
        End If
    Loop
    Close #1
End Sub

Der Rest erscheint mir verdächtig nach Auftragsprogrammierung.
Sorry,... aber das sprengt den Rahmen des Forums.
Gruss Rainer

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige