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.
ich will per Excell teile einer TXT-Datei einlesen
die TXT-Datei sieht so aus:
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...
ich habe folgendes Problem. Ich kenne mich mit VBA mal gar nicht aus.
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...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94865
Url: https://administrator.de/forum/txt-datei-einlesen-naechste-zeile-einblenden-und-teile-der-txt-datei-in-zellen-kopieren-94865.html
Ausgedruckt am: 25.12.2024 um 15:12 Uhr
27 Kommentare
Neuester Kommentar
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
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
Hallo Landstreicher!
Hier was zum Testen:
Es ist ja nun nicht so, dass ich an der Berechnung der Zeile für die KW gescheitert wäre , 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 in einem "Select Case"-Block.
Grüße
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.
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
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 in einem "Select Case"-Block.
Grüße
bastla
Moin Landstreicher,
wenn in der Variablen Tabelle der Wert "Tabelle34" steht, dann würde funktionieren:
-oder-
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
wenn in der Variablen Tabelle der Wert "Tabelle34" steht, dann würde funktionieren:
If Worksheets(Tabelle).Cells(Zeile, "A").Value = KW Then
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
Hallo Landstreicher!
Mit Fehlermeldung ginge es ev leichter ...
Kurz zu den Zeilen ab 9:
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:
Du kannst zum Nachvollziehen mit Strg-G das "Direktfenster" einblenden und mit
als neue (eingefügte) Zeile 13 die gelesenen Zeilen im Format "System_Daten" jeweils in einer Zeile anzeigen lassen.
Grüße
bastla
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 ...If i < U Then 'noch eine Datenzeile vorhanden
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)
GB = Daten(2)
GBfree = Daten(3)
Du kannst zum Nachvollziehen mit Strg-G das "Direktfenster" einblenden und mit
Debug.Print Line & "_" & Line(i+1)
Grüße
bastla
Hallo Landstreicher!
Vor das "Next" (derzeit noch Zeile 48) muss dann noch eine weitere Zeile mit
Grüße
bastla
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 (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
End If
bastla
Hallo Landstreicher!
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
... 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
Hallo Landstreicher!
Rein mnemotechnisch würde sich für "erfassen" aber eigentlich Strg-e anbieten ...
Grüße
bastla
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 ? Ö Ä Ü ?
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
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.
Grüße
bastla
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
bastla