manuel5
Goto Top

Werte aus txt-File in Excel einlesen

Hallo mal wieder,

folgendes Problem --> habe ein TXT-File in welchen viele viele Daten angegeben sind - die Werte sind so aufgebaut -->

?FELDBEZEICHNUNG FELDINHALT FEHLERTEXT
"?FIRMENNUMMER (MANDANT) " 11111
"?KUNDENNUMMER " 1111
"?KUNDENINDEX " 0
"?LIEFERUNGS-/LEISTUNGSDATUM " 20080229
"?FIRMENNUMMER (MANDANT) " 22222
"?KUNDENNUMMER " 2222
"?KUNDENINDEX " 0
"?LIEFERUNGS-/LEISTUNGSDATUM " 20080229
"?FIRMENNUMMER (MANDANT) " 11111
"?KUNDENNUMMER " 112211
"?KUNDENINDEX " 0
"?LIEFERUNGS-/LEISTUNGSDATUM " 20080229
"?FIRMENNUMMER (MANDANT) " 33333
"?KUNDENNUMMER " 1212
"?KUNDENINDEX " 0
"?LIEFERUNGS-/LEISTUNGSDATUM " 20080229

nun mein Problem - ich wuerde die Daten gerne so einlesen das er mir nur die Daten des Lieferanten 1212 einliesst (Dieser kommt in dem Text-File öfter vor) UND die Daten die jetzt links stehen --> KUNDENNUMMER ; FIRMENNUMMER (MANDANT) etc als Spaltenüberschriften nimmt.

Das einlesen einer Textdatei in Excel ist das kleinste Problem - simple everst! face-smile

Aber das umsteigen von der Zellen"Überschrfit" in ne Spalten"Überschrift" -- keine Ahnung und auch das er mir nur die Werte des KUNDEN 1212 ins Excel übergibt.

Und die Feldbezeichnung Feldinhalt und Fehlertext sollte dann lnks in den Zellen stehen...


HAt da jemand ne Idee zu?

Gruß Manuel

Content-ID: 82640

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

Ausgedruckt am: 20.11.2024 um 13:11 Uhr

bastla
bastla 09.03.2008 um 16:18:59 Uhr
Goto Top
Hallo manuel5!

So ganz klar sind mir Deine Ausgangsdaten und auch Dein Vorhaben nicht - wie ich das zu verstehen meine, würde sich aus Deinem angeführten Beispiel unter Berücksichtigung der Forderung, nur Daten mit "?KUNDENNUMMER " 1212 zu verwenden, etwa folgende Exceltabelle ergeben:

ABCDE
1FELDBEZEICHNUNGFIRMENNUMMER (MANDANT)KUNDENNUMMERKUNDENINDEXLIEFERUNGS-/LEISTUNGSDATUM
2FELDINHALT333331212020080229
3FEHLERTEXT

Entspricht dies Deiner Zielvorstellung? Falls nein, versuche doch bitte, die gewünschte Anordnung ebenfalls tabellarisch (siehe dazu die "Formatierungs-Hilfe" in "Häufige Fragen" bzw beim Erstellen eines Kommentars) darzustellen.

Auch der Inhalt der Textdatei wird mit einer anderen Formatierung (verwende dazu -Tags) leichter nachvollziehbar.

Grüße
bastla
manuel5
manuel5 09.03.2008 um 16:33:52 Uhr
Goto Top
Ja, sorry - genaus solls aussehen

AB CD EF GH
1FELDBEZEICHNUNG FIRMENNUMMER (MANDANT) KUNDENNUMMER KUNDENINDEX LIEFERUNGS-/LEISTUNGSDATUM FEHLER
2 Feldbezeichnung 333331212020080229Formal fehlerhaftFormal fehlerhaft
3 3 3 3 3 3 3 3


also ich brauch die "Spalten" aus dem Texfile in Zellen untereinander im Excel

Gruß Manuel
bastla
bastla 09.03.2008 um 16:39:44 Uhr
Goto Top
Hallo manuel5!

Woher kommt "Formal fehlerhaft" (und wozu brauchst Du eigentlich die erste Spalte - hier würde sich ja eigentlich ohnehin nur immer der Text "Feldbezeichnung" wiederholen)?

Grüße
bastla
manuel5
manuel5 09.03.2008 um 17:05:55 Uhr
Goto Top
Stimmt die erste Spalte kann man knicken face-smile

Das "Formal fehlerhaft" kommt eigentlich in der Spalte weit unten - Hier gehts um Belege welche eben hier auschlaggebend sind

Ein Beleg sieht im ganzen so aus -->

?FELDBEZEICHNUNG FELDINHALT "FEHLERTEXT
?* Beleg " "
"?FIRMENNUMMER (MANDANT) " 10
"?Firmennummer " 1212
"?FirmenINDEX " 0
"?LIEFERUNGS-/LEISTUNGSDATUM " 20080219
"?UMSATZSTEUERTYP " DEUTSCHE
"?FAELLIGKEIT " 20080325
"?LEISTUNGSKENNZIFFER (LZB) "
"?VORGANG " GKLIE
"?WAEHRUNG " EUR
"?KURS "
"?WAREN-/LEISTUNGSWERT " 1.500
"?FRACHTWERT " 0
"?VERPACKUNGSWERT " 0
"?UMSATZSTEUERWERT " 1,5
"?RECHNUNGSENDWERT " 10,8
"?SKONTOWERT "
"?SKONTOSATZ "
"?SKONTOANGEBOT-SATZ " 0
"?SKONTOANGEBOT-FRIST " 0
"?BARCODENUMMER " #22222222222
"?AUFTRAGSNUMMER " 111111111
"?LIEFERSCHEINNUMMER "
"?VORLAEUFIGE FREIGABE "
"?SPERRNUMMER "
"?REFERENZ " 26584
"?DFUE-KENNUNG " NORM=INVOICD 96ADATE=2008022918292677
"?DFUE-DATUM " 20080229
"?BestellNUMMER " ???????? _________________________________________ FORMAL FEHLERHAFT

Dann faengst wieder von vorne an mit -->

?FELDBEZEICHNUNG FELDINHALT "FEHLERTEXT
?* BELEG "
"?FIRMENNUMMER (MANDANT) " 10
"?FirmenNUMMER " 1213
..
.
..
.
..
.
..


uns so weiter - s geht über ca 200 Belege im Word-Doc sinds ca 230 Seiten

Ist schwer zu erklären - ich könnte dir das txt-File per Mail zukommen lassen.

Gruß Manuel
bastla
bastla 09.03.2008 um 18:13:53 Uhr
Goto Top
Hallo manuel5!

Ein Excel-Makro zur Umsetzung Deines Vorhabens könnte etwa so aussehen:
Option Explicit

Sub Einlesen()

Dim Kunde As String, Kundenfeld As Integer, Feldauswahl(), Feldbezeichnungen()
Dim fso As Object, TextDatei As Object, Felder() As String, Zeile As Integer, i As Integer, Daten() As String

'####### Anpassungen #######  
Const Datei As String = "D:\Datei mit Buchungen.txt"  

Kunde = "1212" 'nur Daten dieses Kunden übernehmen ("" für: alle Kunden)  
Kundenfeld = 4 'Lfd (Zeilen-)Nummer des Feldes mit der Kundennummer lt Textdatei  

Feldbezeichnungen = Array("FIRMENNUMMER (MANDANT)", "KUNDENNUMMER", "KUNDENINDEX", "LIEFERUNGS-/LEISTUNGSDATUM", "FEHLER")  
Feldauswahl = Array(3, 4, 5, 6, 30) 'Lfd (Zeilen-)Nummer des in die Tabelle einzutragenden Feldes  

Zeile = 1 'Zeilennummer für Spaltenüberschriften  

Const Header As String = "?FELDBEZEICHNUNG FELDINHALT ""FEHLERTEXT" 'erstes Feld jeden Datensatzes  
Const FeldAnzahl As Integer = 30 'Feldanzahl je Datensatz  
'####### Anpassungen Ende #######  


For i = 0 To UBound(Feldbezeichnungen)
    Cells(Zeile, i + 1).Value = Feldbezeichnungen(i)
Next
Zeile = Zeile + 1

Set fso = CreateObject("Scripting.FileSystemObject")  
Set TextDatei = fso.OpenTextFile(Datei, 1)

If Not TextDatei.AtEndOfStream Then
    Do
        ReDim Felder(FeldAnzahl) 'Array für neuen Datensatz löschen  
        Felder(1) = TextDatei.ReadLine
        If UCase(Felder(1)) = UCase(Header) Then 'Datensatz gefunden  
            For i = 2 To FeldAnzahl
                If Not TextDatei.AtEndOfStream Then
                    Daten = Split(TextDatei.ReadLine, """")  
                    Felder(i) = Trim(Daten(UBound(Daten)))
                Else
                    MsgBox "Datensatz nicht vollständig!", vbExclamation, "Datenfehler"  
                    Exit Do
                End If
            Next
            If InStr(1, Felder(Kundenfeld), Kunde, vbTextCompare) Then 'nur Daten des vorgegebenen Kunden eintragen  
            'If Felder(Kundenfeld) = Kunde Then 'Daten nur bei exakter Übereinstimmung eintragen  
                For i = 0 To UBound(Feldauswahl) 'vorgegebene Felder in Tabelle eintragen  
                    Cells(Zeile, i + 1).Value = Felder(Feldauswahl(i))
                Next
                Zeile = Zeile + 1
            End If
        End If
    Loop Until TextDatei.AtEndOfStream
Else
    MsgBox "Die Datei " & Datei & " enthält keine Daten!", vbExclamation, "Keine Daten gefunden!"  
End If
TextDatei.Close
End Sub
Zur Verwendung: Erstelle eine neue Excel-Mappe, wechsle über Rechtsklick auf das Blattregister "Tabelle1" und die Auswahl "Code anzeigen" in den VBA-Editor und füge dort das Makro in das große Codefenster ein.

Die Zeilen zwischen "####### Anpassungen #######" und "####### Anpassungen Ende #######" enthalten die Vorgaben, welche Du zunächst überprüfen und (zumindest hinsichtlich des Dateinamens) anpassen musst.

Die Einschränkung auf eine vorgegebene Kundennummer (im Beispiel "1212") erfolgt in dieser Version so, dass geprüft wird, ob die eingelesene Kundennummer den Suchbegriff enthält - daher würden auch Datensätze des Kunden "12125" erfasst. Falls Du auf eine genaue Übereinstimmung überprüfen willst, musst Du das Apostroph (') vor der Zeile
'If Felder(Kundenfeld) = Kunde Then 'Daten nur bei exakter Übereinstimmung eintragen  
entfernen und vor die vorherige Zeile
If InStr(1, Felder(Kundenfeld), Kunde, vbTextCompare) Then 'nur Daten des vorgegebenen Kunden eintragen  
setzen.

Starte das Makro, indem Du den Cursor an eine beliebige Position zwischen "Sub Einlesen()" und "End Sub" setzt und "F5" drückst oder die grüne "Play"-Schaltfläche in der Symbolleiste anklickst - das sollte es eigentlich gewesen sein ... face-wink

Grüße
bastla
manuel5
manuel5 09.03.2008 um 19:29:29 Uhr
Goto Top
Hallo bastla,

das schaut sich schon sehr gut aus - er macht mir zumindst schon mal die Überschriften

Was er aber nicht macht is - Wenn AUFTRAGSNUMMER FORMAL FEHLERHAFT das trage mir in Zeile 1 in Spalte A die Firmennummer/Kundennummer ein in Zeile 1 Spalte B die Kundenummer usw ein
Duchsuche den nächsten Beleg der bei ?FELDBEZEICHNUNG FELDINHALT "FEHLERTEXT wieder beginnt und Wenn AUFTRAGSNUMMER FORMAL FEHLERHAFT das trage mir in Zeile 2 in Spalte A die Firmennummer/Kundennummer ein in Zeile 2 Spalte B die Kundenummer usw ein
wenn nicht trage nichts ein und gehe zum nächsten Beleg

Da haperst noch nStück, aber es wird face-smile)

Gruß Manuel
bastla
bastla 09.03.2008 um 19:36:54 Uhr
Goto Top
Hallo manuel5!

Seit wann soll denn "AUFTRAGSNUMMER FORMAL FEHLERHAFT" das Kriterium für das Eintragen eines Datensatzes sein?

However - wenn Du die Zeilen
Kunde = "1212" 'nur Daten dieses Kunden übernehmen ("" für: alle Kunden)  
Kundenfeld = 4 'Lfd (Zeilen-)Nummer des Feldes mit der Kundennummer lt Textdatei  
durch
Kunde = "FORMAL FEHLERHAFT"  
Kundenfeld = 23
ersetzt, sollte es auch damit klappen (vorausgesetzt, die Struktur Deiner Textdatei entspricht dem oben angegebenen Beispiel und es ist mit "AUFTRAGSNUMMER" die Zeile 23 gemeint) ...

Grüße
bastla
manuel5
manuel5 09.03.2008 um 19:57:25 Uhr
Goto Top
HAllo bastla,

hmmmm - genau das is das Problem auch - die Belege bzw die Felder sind nicht immer "gleich viele"
Kann man da nicht sagen - Fange bei ?FELDBEZEICHNUNG FELDINHALT "FEHLERTEXT an und dann suche ob AUFTRAGSNUMMER FORMAL FEHLERHAFT wenn ja -->

dann trage mir in Zeile 1 in Spalte A die Firmennummer/Kundennummer ein in Zeile 1 Spalte B die Belegnummer usw ein dann gehe zum nächsten ?FELDBEZEICHNUNG FELDINHALT "FEHLERTEXT und ob hier bei AUFTRAGSNUMMER FORMAL FEHLERHAFT dann trage mir in Zeile 2 in Spalte A die Firmennummer/Kundennummer ein in Zeile 2 Spalte B die Kundenummer usw ein

Was noch gehen könnte wäre - Wenn AUFTRAGSNUMMER = Formal fehlerhaft dann gehe hoch bis Kundennummer -- nimm diese und trage sie ein dann die Rechnungsnummer/Belegnummer und trage sie ein.....


Das grundsätzlich wie ich vorgehen soll/kann ist mit n Rätsel.

Gruß Manuel