landstreicher
Goto Top

TXT-Datei einlesen, nächste Zeile einblenden und Teile der TXT-Datei in Zellen kopieren

Hallo,

ich habe folgendes Problem. Ich kenne mich mit VBA mal gar nicht aus. face-sad

ich will per Excell teile einer TXT-Datei einlesen
die TXT-Datei sieht so aus:

P42 
2008-08-14;33;513;140                                                            
PO5 
2008-08-14;33;3637;186                                                           
PO3 
2008-08-14;33;2145;179                                                           
PONP 
2008-08-11;33;429;151                                                            
PONDP 
2008-08-11;33;195;12                                                             
REPOP 
2008-08-11;33;2.09;.59                                                           
COG 
2008-08-11;33;5.41;.47                                                           

das datum ist hier egal mich interessiert nur das was danach kommt KW;GB;GB free und natürlich vorweg das System (P42 oder PO5 ect...)

die Exceldatei sieht so aus:
in Spalte A stehen die KalenderWochen (KW) ausgeblendet sind (ganze zeilen) die KW´s doch erst noch kommen.
in Spalte B GB
in Spalte C GB free
(usw.. fangen wir erst mal nur mit spalte B und C an)

steht in der TXT-Datei also
PONP
2008-08-11;33;429;151 soll er die noch ausgeblendete nächste Zeile in Excel in der die aktuelle KW 33 (spalte A) steht einblenden (die anderen die ausgeblendet sind nicht, die wären dann nächste KW an der reihe stück für stück) und anschliessend Spalte B mit dem Wert (hinter der KW (33)) 429 und Spalte C mit dem Wert dahinter füllen also 151.


hat jemand eine idee ?
PS: id ewerte ändern sich von woche zu woche...

Content-Key: 94865

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

Printed on: April 25, 2024 at 08:04 o'clock

Member: bastla
bastla Aug 20, 2008 at 20:55:44 (UTC)
Goto Top
Hallo Landstreicher!

Was mir noch nicht klar ist: Gibt es für jedes System aus der Textdatei eine eigene Zeile für jede KW (sodass also sowohl nach KW als auch nach System zu suchen wäre), oder gibt es für jedes System ein eigenes Blatt?

Außerdem: Wenn für jede KW eine Zeile existiert, sollte sich deren Zeilennummer (ohne in Spalte A suchen zu müssen) ja eigentlich berechnen lassen (etwa KW 1 in Zeile 4 --> KW 33 in Zeile 36) ...

Grüße
bastla
Member: Landstreicher
Landstreicher Aug 21, 2008 at 07:35:35 (UTC)
Goto Top
Moin bastla,

also es gibt für jedes System aus meiner TXT-Datei eine eigene Spalte ausser für die ersten 3 Systeme, die haben dummer weise jeweils ein eigenes Blatt.
PONP: Spalte B; Spalte C
PONDP: Spalte G; Spalte H
REPOP: Spalte L; Spalte M
COG : Spalte Q; Spalte R

in der Excel Datei ist es so, das die 1 KW diesen jahres in Zeile 55 beginnt. Die letzte eingeblendete Zeile ist die letzte KW 33 in Zeile 87. Wenn das natürlich so fortgeführt wird, sollte sich das wirklich berechnen lassen können ... sofern man weiss wie face-wink

ich schlage vor, wir kümmern uns erst mal um diese 4 Systeme und dann der Rest, oder ?

gruß Landstreicher
Member: bastla
bastla Aug 21, 2008 at 19:14:33 (UTC)
Goto Top
Hallo Landstreicher!

also es gibt für jedes System aus meiner TXT-Datei eine eigene Spalte ausser für die ersten 3 Systeme, die haben dummer weise jeweils ein eigenes Blatt.
Einen Kommentar zu dieser "Struktur" erspare ich uns beiden ...

Hier was zum Testen:
Sub EintragenUndEinblenden()
Const Liste As String = "D:\Liste.txt"  
Tabelle = "Tabelle1"  
ZeileAb = 55 'Hier beginnen die Zeilen für die Kalenderwochen  

Set fso = CreateObject("Scripting.FileSystemObject")  
Lines = Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf) 'alle Zeilen der Textdatei in Array "Lines" einlesen  

U = UBound(Lines)
For i = 0 To U Step 2 'je Datensatz gibt es 2 Zeilen  
    System = Trim(Lines(i))
    If i < U Then 'noch eine Datenzeile vorhanden  
        Daten = Split(Trim(Lines(i + 1)), ";") 'Datensatz anhand des Trennzeichens ";" aufteilen  
        KW = CInt(Daten(1)) 'KW als Zahl  
        GB = Daten(2)
        GBfree = Daten(3)
        

        Zeile = ZeileAb 'ab hier könnte die KW in Spalte A stehen  
        Do
            If Worksheets(Tabelle).Cells(Zeile, "A").Value = KW Then  
                ZeileKW = Zeile 'Zeile gefunden  
            Else
                Zeile = Zeile + 1 'in nächster Zeile suchen  
            End If
        Loop Until Zeile > 65536 Or ZeileKW > 0
    
        If ZeileKW > 0 Then 'Zeile der KW wurde gefunden, ...  
            Select Case System '... jetzt Spalte festlegen  
                Case "PONP": Spalte = "B"  
                Case "PONDP": Spalte = "G"  
                Case "REPOP": Spalte = "L"  
                Case "COG": Spalte = "Q"  
                Case Else: Spalte = ""  
            End Select
        
            If Spalte <> "" Then 'Spalte wurde gefunden -> Daten eintragen ...  
                Worksheets(Tabelle).Cells(ZeileKW, Spalte).Value = GB
                Worksheets(Tabelle).Cells(ZeileKW, Spalte).Offset(0, 1).Value = GBfree
                Worksheets(Tabelle).Rows(ZeileKW).Hidden = False '... und Zeile einblenden  
            End If
        Else
            MsgBox "Zeile der KW " & KW & " (für System """ & System & """) wurde nicht gefunden!", vbCritical  
        End If
    Else
        MsgBox "Keine Daten für System """ & System & """ vorhanden!", vbCritical  
    End If
Next
MsgBox "Fertig."  
End Sub
Es ist ja nun nicht so, dass ich an der Berechnung der Zeile für die KW gescheitert wäre face-wink, aber da ich vorhabe, ein paar möglicherweise auftretende Fehler abzufangen, wird die entsprechende Zeile auf Basis des Eintrages in Spalte A gesucht. Ich habe dazu unterstellt, dass in dieser Spalte jeweils nur die Nummer der KW (und daher eine Zahl) steht.

Die passende Spalte für jedes System ließe sich vermutlich anhand einer Überschriftenzeile finden - da Du aber dazu keine Angaben gemacht hast, stehen die jeweiligen Spalten hart codiert face-sad in einem "Select Case"-Block.

Grüße
bastla
Member: Landstreicher
Landstreicher Aug 28, 2008 at 09:51:52 (UTC)
Goto Top
Hallo bastla,

sorry hatte die letzte zeit keine zeit hier rein zu schauen und zu antworten, aber besten dank schon mal vorab für alles.
ich teste das nun mal und melde mich dann wieder hier zu worte face-wink

gruß landstreicher
Member: Landstreicher
Landstreicher Aug 28, 2008 at 12:12:07 (UTC)
Goto Top
Hallo bastla,

also ich habe mal folgendes getan:

neues Modul erstellt und dort deinen code eingefügt.
Statt Tabelle = "Tabelle1" habe ich Tabelle = "Tabelle34" gesetzt, da es sich um Tabelle 34 handelt.

leider fliegt er immer an der selben stelle raus.

If Worksheets(Tabelle34).Cells(Zeile, "A").Value = KW Then  

hast du ne idee was ich falsch mache, oder liegt es am code ?

grüße Landstreicher
Member: bastla
bastla Aug 28, 2008 at 12:43:41 (UTC)
Goto Top
Hallo Landstreicher!

So sollte es gehen:
If Worksheets("Tabelle34").Cells(Zeile, "A").Value = KW Then  
Grüße
bastla
Member: Landstreicher
Landstreicher Aug 29, 2008 at 07:16:18 (UTC)
Goto Top
Hallo Bsatla,

leider brachte auch das keinen Erfolg.

was habe ich getan.
1) neues Modul angelegt und deinen Code eingefügt.
2) 2 Zeilen geändert
Tabelle = "Tabelle34"   
und
If Worksheets("Tabelle").Cells(Zeile, "A").Value = KW Then  

wenn ich das richtig verstanden habe musss ich nur oben "TABELLE" ändern da hier ja die 34 gesetzt wird.
aber ich hab natürlich alle versionen getestet, leider ohne erfolg.

gruß landstreicher
Member: Biber
Biber Aug 29, 2008 at 09:17:01 (UTC)
Goto Top
Moin Landstreicher,

wenn in der Variablen Tabelle der Wert "Tabelle34" steht, dann würde funktionieren:
If Worksheets(Tabelle).Cells(Zeile, "A").Value = KW Then  
-oder-
If Worksheets("Tabelle34").Cells(Zeile, "A").Value = KW Then  

Eine Variable zu verwenden hat übrigens nur dann Sinn, wenn diese Variable mehr als einmal verwendet wird ODER wenn Du aus Wartungsgründen alle Werte, die sich jemals ändern konnten an wiederfindbaren Codestellen griffbereit halten.

Grüßr
Biber
Member: Landstreicher
Landstreicher Aug 29, 2008 at 11:12:09 (UTC)
Goto Top
Hallo Biber,

komisch, bei mir Debuggt er immer an der selben Stelle immer bei
If Worksheets(Tabelle).Cells(Zeile, "A").Value = KW Then  

als meldung kommt :

"Laufzeitfehler '9'

Index aussserhalb des gültigen Bereichs"

benutzt ihr eine andere Version des VB ? meine ist 6.5

grüße Landstreicher
Member: bastla
bastla Aug 29, 2008 at 11:40:42 (UTC)
Goto Top
Hallo Landstreicher!

Die Fehlermeldung kann eigentlich nur darauf zurückzuführen sein, dass es keine Tabelle mit dem Namen "Tabelle34" (in der aktuellen MAppe) gibt - mit der VB-Version hat das sicher nix zu tun ...

Versuchst Du ev, von einer anderen Mappe aus auf die Tabelle zuzugreifen?

Grüße
bastla
Member: Landstreicher
Landstreicher Aug 29, 2008 at 12:37:53 (UTC)
Goto Top
Hallo Leute,

gibt es eine Möglichkeit, einen Hardcopy hochzuladen ?
da könnte ich euch zeigen was ich wie wo eingetragen habe.

momentan stehe ich wie der ochs vorm berg face-wink

also nochmal:
ich habe in dem Excelblatt in dem ich auch die Werte brauche ein neues Modul angelegt und dort den Code eingetragen.
Auf Reiter/Blatt 34 ist meine Tabelle die ich befüllen will.
auf meiner Platte liegt unter D:\ auch das besagte File.

gruß landstreicher


...moment ,..... ich habe etwas gefunden
Member: Landstreicher
Landstreicher Aug 29, 2008 at 12:49:55 (UTC)
Goto Top
Ok ich bin darauf reingefallen das er in VBA die tabelle "DKS-PRO7 DB-Größe Werte" Tabelle34 nennt.

also habe ich ihm folgendes gesagt

If Worksheets("DKS-PRO7 DB-Größe Werte").Cells(Zeile, "A").Value = KW Then  
und nun fliegt er schon mal nicht mehr an dieser Stelle raus, sondern an einer anderen face-wink

 KW = CInt(Daten(1)) 'KW als Zahl  

ich habe keine Ahnung was er da genau macht bzw was dort gesetzt wird.
bastla, haste ne idee ... oder Biber ich will dich ja nicht ausschließen *g*

gruß Landstreicher
Member: bastla
bastla Aug 29, 2008 at 13:08:50 (UTC)
Goto Top
Hallo Landstreicher!

Mit Fehlermeldung ginge es ev leichter ...

Kurz zu den Zeilen ab 9:
U = UBound(Lines)
Die Textdatei wurde vorher in ein Array "Lines" eingelesen - hier wird festgehalten, welches die höchste Zeilennummer ist (da die Zählung bei 0 beginnt, siehe nächste Anweisung, ist dies Zeilenanzahl-1)
For i = 0 To U Step 2 'je Datensatz gibt es 2 Zeilen
Schleife, um paarweise die Zeilen verarbeiten zu können
System = Trim(Lines(i)) 'Systemname (ohne ev davor oder dahinter befindliche Leerzeilen)
If i < U Then 'noch eine Datenzeile vorhanden
Wenn der Systemname nicht in der (oben ermittelten) letzten eingelesenen Zeile steht ...
Daten = Split(Trim(Lines(i + 1)), ";") 'Datensatz anhand des Trennzeichens ";" aufteilen
... sollten auch noch Daten gelesen worden sein - diese werden in ein neues Array "Daten" zerlegt, sodass folgende Felder entstehen (sollten, wenn die Struktur der Zeile ok ist):
Daten(0) Datum
Daten(1) KW
Daten(2) GB
Daten(3) GBfree

In den nächsten Zeilen werden diese Teile dann noch einzelnen Variablen zugewiesen, wobei die Kalenderwoche, welche ja als Suchkriterium dienen soll, explizit in eine Zahl umgewandelt wird, da in der Tabelle als KW (vermutlich) ebenfalls eine Zahl steht:
KW = CInt(Daten(1)) 'KW als Zahl
GB = Daten(2)
GBfree = Daten(3)

Du kannst zum Nachvollziehen mit Strg-G das "Direktfenster" einblenden und mit
Debug.Print Line & "_" & Line(i+1)  
als neue (eingefügte) Zeile 13 die gelesenen Zeilen im Format "System_Daten" jeweils in einer Zeile anzeigen lassen.

Grüße
bastla
Member: Landstreicher
Landstreicher Sep 01, 2008 at 09:08:57 (UTC)
Goto Top
Moin bastla,

fehler gefunden ...
Er sagte immer "index ausserhalb des gültigen Bereichs". Das Problem war, das in der Datei ein Wert doppelt geliefert wurde. Als ich diesen Rausgelöscht habe, funktioniert es einwandfrei. face-wink

ich teste nun noch ein wenig alles durch und melde mich dann wieder .

wie immer besten dank
Landstreicher
Member: Landstreicher
Landstreicher Sep 01, 2008 at 12:05:24 (UTC)
Goto Top
Hallo Bastla,

kleines Problemchen noch.

In der TXT - Datei sind hinter jeder Zeile, wo die Werte stehen 58 leerzeichen.
Kennst du eine schnelle Lösung diese zu entfernen, denn diese sorgen am ende deines für mich geschrieben Scripts dazu bei, das die Fehlermeldung ""Keine Daten für System """ & System & """ vorhanden!"" kommt.

also entweder wir fangen es in deinem Script ab, oder schon vorher per Batch.
ich habe hier im Forum mal etwas gefunden wie das in einer Batch gemacht werden könnte, leider weiss ich im moment nicht ganz wie ich das umsetzen könnte bei mir.

set "var1=   das ist eine variable     "   
echo Vorher:  #%var1%# 
:loop1 
if "%var1:~0,1%"==" " set "var1=%var1:~1%" & goto :loop1   
:loop2 
if "%var1:~-1%"==" " set "var1=%var1:~0,-1%" & goto :loop2   
echo Nachher: #%var1%#

Gruß Landstreicher
Member: bastla
bastla Sep 01, 2008 at 12:21:22 (UTC)
Goto Top
Hallo Landstreicher!

In der TXT - Datei sind hinter jeder Zeile, wo die Werte stehen 58 leerzeichen. Kennst du eine schnelle Lösung diese zu entfernen ...
Einfach die Zeilen 11 und 13 so lassen, wie sie immer schon waren face-wink (Trim() erfüllt genau diesen Zweck).

... denn diese sorgen am ende deines für mich geschrieben Scripts dazu bei, das die Fehlermeldung ""Keine Daten für System """ & System & """ vorhanden!"" kommt.
Eher liegt es an einer Leerzeile am Ende der Datei - dagegen sollte folgende neue Zeile 12 helfen:
If System <> "" Then  
Vor das "Next" (derzeit noch Zeile 48) muss dann noch eine weitere Zeile mit
End If
Grüße
bastla
Member: Landstreicher
Landstreicher Sep 01, 2008 at 14:34:40 (UTC)
Goto Top
Hallo bastla,

das END If meckert er sofort an ... das wäre zu viel.

und auch Änderung 1 ergibt keinen erfolg. face-sad

wenn ich nun die Leerzeile in der TXT-DAtei entferne läuft alles OK durch, allerdings auch wenn Daten nicht zur Verfügung stehen.

ne Idee ?

Gruß Landstreicher
Member: bastla
bastla Sep 01, 2008 at 14:38:49 (UTC)
Goto Top
Hallo Landstreicher!

Die beiden Änderungen gehören zusammen - bei der ersten Zeile beginnt ein neuer "If"-Block, und die zweite Zeile schließt ihn ab.

Grüße
bastla
Member: Landstreicher
Landstreicher Sep 03, 2008 at 07:44:44 (UTC)
Goto Top
Hallo bastla,

sorry hatte die vergangen Tage keine Zeit. Hab nun mal einige Sachen durchgetestet und bin zu folgedendem Ergebnis gekommen.

Ändert man in der TXT-Datei nur einen Wert für die KW also bsp so:
PONP
2008-08-25;40;429;150
PONDP
2008-08-25;40;195;7
REPOP
2008-08-25;40;2.09;.59
COG
2008-08-25;41;5.41;.43

So blendet er Zeile 41 ein und füllt dort alle Datein rein.
Ursprünglich dachte ich er würde dann 2 Zeilen einblenden (40 & 41) in KW40 dann die Werte für PONP POND und REPOP einfügen und in KW41 dann nur für die COG und anschliessend meckern das ihm Daten für KW40 und 41 fehlen.

momentan sieht der code so aus:

Sub EintragenUndEinblenden_pro7()

Const Liste As String = "D:\SLA_DB_Groessen\space.txt"  

Tabelle = "DKS-PRO7 DB-Größe Werte" 'Hier wird das Tabellenblatt angegeben  

ZeileAb = 55 'Hier beginnen die Zeilen für die Kalenderwochen  

 

Set fso = CreateObject("Scripting.FileSystemObject")  

Lines = Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf) 'alle Zeilen der Textdatei in Array "Lines" einlesen  

 

U = UBound(Lines)

For i = 0 To U Step 2 'je Datensatz gibt es 2 Zeilen  

    System = Trim(Lines(i))
    If System <> "" Then  
    If i < U Then 'noch eine Datenzeile vorhanden  

        Daten = Split(Trim(Lines(i + 1)), ";") 'Datensatz anhand des Trennzeichens ";" aufteilen  

        KW = CInt(Daten(1)) 'KW als Zahl  
 
        GB = Daten(2)

        GBfree = Daten(3)

         

 

        Zeile = ZeileAb 'ab hier könnte die KW in Spalte A stehen  
 
        Do

            If Worksheets("DKS-PRO7 DB-Größe Werte").Cells(Zeile, "A").Value = KW Then  

                ZeileKW = Zeile 'Zeile gefunden  

            Else

                Zeile = Zeile + 1 'in nächster Zeile suchen  
 
            End If

        Loop Until Zeile > 65536 Or ZeileKW > 0

     

        If ZeileKW > 0 Then 'Zeile der KW wurde gefunden, ...  

            Select Case System '... jetzt Spalte festlegen  

                Case "PONP": Spalte = "B"  

                Case "PONDP": Spalte = "G"  

                Case "REPOP": Spalte = "L"  

                Case "COG": Spalte = "Q"  

                Case Else: Spalte = ""  
 
            End Select

         

            If Spalte <> "" Then 'Spalte wurde gefunden -> Daten eintragen ...  
 
                Worksheets(Tabelle).Cells(ZeileKW, Spalte).Value = GB

                Worksheets(Tabelle).Cells(ZeileKW, Spalte).Offset(0, 1).Value = GBfree
 
                Worksheets(Tabelle).Rows(ZeileKW).Hidden = False '... und Zeile einblenden  

            End If

        Else
 
            MsgBox "Zeile der KW " & KW & " (für System """ & System & """) wurde nicht gefunden!", vbCritical  

        End If

    Else

        MsgBox "Keine Daten für Pro7 """ & System & """ vorhanden!", vbCritical  

    End If
    End If
Next
End Sub

gruß Landstreicher
Member: bastla
bastla Sep 03, 2008 at 20:14:19 (UTC)
Goto Top
Hallo Landstreicher!

... sorry hatte die vergangen Tage keine Zeit.
Warum sollte es auch nur mir so gehen ...
Da Du vorausschauend schon jede Menge Leerzeilen in Deinen Code integriert hast face-wink, kannst Du gleich die Zeile 39 mit folgendem Inhalt füllen:
        ZeileKW = 0
Grüße
bastla
Member: Landstreicher
Landstreicher Sep 04, 2008 at 08:45:37 (UTC)
Goto Top
Hallo Bastla,

japp so funktioniert es schon face-wink

jetzt wäre noch etwas offen ... wie bekomme ich es hin, das ich das einlesen der daten zb mit str s hinbekomme ?

Gruß Landstreicher
Member: bastla
bastla Sep 04, 2008 at 09:31:55 (UTC)
Goto Top
Hallo Landstreicher!

... das einlesen der daten zb mit str s ...
Willst Du wirklich einen Standard-Shortcut "verbiegen"? Anyhow, unter Excel 2003 zB so: "Extras / Makro / Makros... / EintragenUndEinblenden_pro7 / Optionen..."

Alternativ dazu könntest Du zB auch eine beliebige Grafik (AutoForm, Clipart, ...) auf dem Blatt platzieren und über das Kontextmenü "Makro zuweisen..." eine "Schaltfläche" daraus machen.

Grüße
bastla
Member: Landstreicher
Landstreicher Sep 04, 2008 at 12:14:29 (UTC)
Goto Top
Hallo Bastla,

nö verbiegen will ich lieber nichts face-wink aber ich brauche eine Startmöglichkeit und ein Button kommt nicht in Frage, da diese am ende beim erstellen einer PDF mit zu sehen ist.

was wäre denn so frei mit STRG ? Ö Ä Ü ? face-wink

gruß Landstreicher
Member: bastla
bastla Sep 04, 2008 at 14:06:36 (UTC)
Goto Top
Hallo Landstreicher!

ein Button kommt nicht in Frage, da diese am ende beim erstellen einer PDF mit zu sehen ist.
Dem muss nicht so sein - wenn Du etwa eine AutoForm verwendest, kannst Du über das Kontextmenü "AutoForm formatieren...", Register Eigenschaften, die Option "Objekt drucken" ausschalten (Excel 2003).

was wäre denn so frei mit STRG ? Ö Ä Ü ? face-wink
Abgesehen davon, dass sich das ja verhältnismäßig leicht testen lässt, könntest Du durch die Verwendung von Großbuchstaben (also zB "S" statt "s") auch die Umschalt-Taste ins Spiel bringen ...

Rein mnemotechnisch würde sich für "erfassen" aber eigentlich Strg-e anbieten ...

Grüße
bastla
Member: Landstreicher
Landstreicher Sep 05, 2008 at 07:15:17 (UTC)
Goto Top
Moin Bastla,

na dann mach ich es doch mit Button face-wink

jetzt habe ich heute den fall gehabt, das für 1 system doppelte werte angelefiert wurden bsp:

 
PONP  
2008-08-11;33;429;151
2008-08-11;33;410;140

ist dies der fall wird sofort debuggt. Kann man das abfangen, so dass eine Meldung erscheint, bsp "Quelldatei enthällt mehr Daten für System XY als erwartet. Bitte prüfen sie die Quelldatei!" ?

Viele meiner Kollegen, sind da sehr ähm komisch face-wink die kommen dann damit nicht mehr klar.

gruß Landstreicher
Member: bastla
bastla Sep 05, 2008 at 20:41:44 (UTC)
Goto Top
Hallo Landstreicher!

Ich frage gleich gar nicht, woher derartige Daten stammen ...

Soferne Du nicht noch mehr Überraschungen parat hast, sollte die in der folgenden Version vorgenommene formale Überprüfung der Textzeilen ausreichen, um den Benutzer vorweg auf nicht korrekte Zeilen der Textdatei aufmerksam machen zu können.
Sub EintragenUndEinblenden_pro7()

Const Liste As String = "D:\SLA_DB_Groessen\space.txt"  
tabelle = "DKS-PRO7 DB-Größe Werte" 'Hier wird das Tabellenblatt angegeben  
ZeileAb = 55 'Hier beginnen die Zeilen für die Kalenderwochen  

Set fso = CreateObject("Scripting.FileSystemObject")  
Lines = Split(fso.OpenTextFile(Liste).ReadAll, vbCrLf) 'alle Zeilen der Textdatei in Array "Lines" einlesen  

U = UBound(Lines)
Fehler = ""  
For i = 0 To U Step 2 'je Datensatz gibt es 2 Zeilen  
    If Fehler = "" Then 'noch kein Fehler gefunden  
        System = Trim(Lines(i))
        If System <> "" Then 'System gefunden  
            S = Split(System, ";")  
            If UBound(S) > 0 Then 'Zeile mit Trennzeichen  
                Fehler = Fehler & "Zeile " & i + 1 & " enthält kein gültiges ""System""" & vbCrLf  
            End If 'Zeile mit Trennzeichen  

            If i < U And Fehler = "" Then 'noch eine Datenzeile vorhanden  
                Daten = Split(Trim(Lines(i + 1)), ";")  
                If UBound(Daten) < 3 Then 'zu wenige Felder in Datenzeile  
                    Fehler = Fehler & "Zeile " & i + 2 & " enthält keine gültigen Daten" & vbCrLf  
                End If 'zu wenige Felder in Datenzeile  
            End If 'noch eine Datenzeile vorhanden  
        Else 'System nicht gefunden  
            If i <> U Then 'Nicht letzte Zeile?  
                Fehler = Fehler & "Zeile " & i + 1 & " enthält kein ""System""" & vbCrLf  
            End If 'Nicht letzte Zeile?  
        End If 'System gefunden  
    End If 'noch kein Fehler gefunden  
Next

If Fehler = "" Then 'Daten OK  
    For i = 0 To U Step 2 'je Datensatz gibt es 2 Zeilen  
        System = Trim(Lines(i))
        If System <> "" Then  
            Daten = Split(Trim(Lines(i + 1)), ";") 'Datensatz anhand des Trennzeichens ";" aufteilen  
            KW = CInt(Daten(1)) 'KW als Zahl  
            GB = Daten(2)
            GBfree = Daten(3)
        
            Zeile = ZeileAb 'ab hier könnte die KW in Spalte A stehen  
            ZeileKW = 0
            Do
                If Worksheets("DKS-PRO7 DB-Größe Werte").Cells(Zeile, "A").Value = KW Then  
                    ZeileKW = Zeile 'Zeile gefunden  
                Else
                    Zeile = Zeile + 1 'in nächster Zeile suchen  
                End If
            Loop Until Zeile > 65536 Or ZeileKW > 0

            If ZeileKW > 0 Then 'Zeile der KW wurde gefunden, ...  
                Select Case System '... jetzt Spalte festlegen  
                    Case "PONP": Spalte = "B"  
                    Case "PONDP": Spalte = "G"  
                    Case "REPOP": Spalte = "L"  
                    Case "COG": Spalte = "Q"  
                    Case Else: Spalte = ""  
                End Select

                If Spalte <> "" Then 'Spalte wurde gefunden -> Daten eintragen ...  
                    Worksheets(tabelle).Cells(ZeileKW, Spalte).Value = GB
                    Worksheets(tabelle).Cells(ZeileKW, Spalte).Offset(0, 1).Value = GBfree
                    Worksheets(tabelle).Rows(ZeileKW).Hidden = False '... und Zeile einblenden  
                End If 'Spalte wurde gefunden  
            Else 'Zeile der KW nicht gefunden  
                MsgBox "Zeile der KW " & KW & " (für System """ & System & """) wurde in der Tabelle nicht gefunden!", vbCritical  
            End If 'Zeile der KW  
        End If 'System nicht leer  
    Next
Else 'Daten nicht OK  
    MsgBox Fehler, vbCritical, "Fehler gefunden!"  
End If 'Daten OK  
End Sub
Grüße
bastla
Member: Landstreicher
Landstreicher Sep 08, 2008 at 13:33:12 (UTC)
Goto Top
Hallo Bastla,

ja das mit den Daten ist so ne Sache, würd ich es dir verraten, müsste ich dich ... face-wink

besten Dank, das haut alles hin was du mir da gebastelt hast .

Gruß Landstreicher