Textdatei per VBA auslesen

Hallo liebes Forum,

ich möchte eine erstellte Textdatei Zeile für Zeile auslesen. Die Textdatei hat folgenden Inhalt:

Wort1,Wort2,Wort3,Wort4,Wort5,Wort6,Wort7

Die 7 Strings sollen in die Zeilen A1 bis G1 einer Tabelle geschrieben werden. Nach dem einlesen einer Zeile soll zusätzlich noch ein Makro aufgerufen werden, dass die Inhalte der Zellen A1 bis G1 in andere Tabelle ordnet und danach die Zellen A1 bis G1 wieder löscht, um den Platz fürs Einlesen der nächsten Zeile freizumachen(muss hier nicht ausgeführt werden). Ist das möglich?
Vielen dank schonmal für Eure Anregungen.

Viele Grüße

Achim

Die Datei hat also folgendes Format:

Wort1,Wort2,Wort3,Wort4,Wort5,Wort6,Wort7
Wort1,Wort2,Wort3,Wort4,Wort5,Wort6,Wort7
Wort1,Wort2,Wort3,Wort4,Wort5,Wort6,Wort7
Wort1,Wort2,Wort3,Wort4,Wort5,Wort6,Wort7
.
.
.
u.s.w.

Hallo, Achim!

ich möchte eine erstellte Textdatei Zeile für Zeile auslesen.
Die Textdatei hat folgenden Inhalt:
Wort1,Wort2,Wort3,Wort4,Wort5,Wort6,Wort7

Die 7 Strings sollen in die Zeilen A1 bis G1 einer Tabelle
geschrieben werden. Nach dem einlesen einer Zeile soll
zusätzlich noch ein Makro aufgerufen werden, dass die Inhalte
der Zellen A1 bis G1 in andere Tabelle ordnet und danach die
Zellen A1 bis G1 wieder löscht, um den Platz fürs Einlesen der
nächsten Zeile freizumachen(muss hier nicht ausgeführt
werden). Ist das möglich?

Wie ich schon sagte: Nichts ist unmöglich… Toyota.

Sub DateiEinlesen()
 Dim lngFile As Long
 Dim strZeile As String
 Dim lngPos As Long
 Dim lngSpalte As Long

 lngFile = FreeFile
 ' hier Deine Datei:
 Open "C:\Temp\Achim.txt" For Input As #lngFile
 Do While Not EOF(lngFile)
 ' Zeile einlesen
 Line Input #lngFile, strZeile
 ' Komma auch am Ende
 strZeile = strZeile & ","
 lngSpalte = 1
 ' an Kommata aufsplitten
 Do
 lngPos = InStr(strZeile, ",")
 Tabelle1.Cells(1, lngSpalte) = Left$(strZeile, lngPos - 1)
 strZeile = Mid$(strZeile, lngPos + 1)
 lngSpalte = lngSpalte + 1
 Loop Until strZeile = ""
 ' das andere Makro aufrufen
 Call AnderesMakro
 ' Bereich wieder löschen
 Tabelle1.Range("A1:G1").Clear
 Loop
 Close #lngFile

End Sub

Das ist halt noch nicht wirklich fehlertolerant und geht davon aus, dass die Datei auch wirklich immer den korrekten Aufbau hat. Alles weitere bleibt Dir dann überlassen.

Gruß, Manfred

Hallo manfred,

vielen Dank für Deine Ausführung. Leider werden meine Werte immer in folgender Form in die Datei abgespeichert:

„wort1,wort2,wort3,wort4,wort5,wort6,wort7,“

jetzt liest er immer die " mit ein bzw. sucht das letzte komma der zeile. Kann man das irgendwie ändern? Oder kann man das abspeichern so ändern, dass er ohne " abspeichert?
Mein Code:

Function Speichern()
Dim Textdatei As String
var1 = Range(„A1“)
var2 = Range(„B1“)
var3 = Range(„C1“)
var4 = Range(„D1“)
var5 = Range(„E1“)
var6 = Range(„F1“)
var7 = Range(„G1“)
var8 = „Text.txt“
Eintrag = var1 & „,“ & var2 & „,“ & var3 & „,“ & var4 & „,“ & var5 & „,“ & var6 & „,“ & var7 & „,“
Textdatei = Application.GetSaveAsFilename(var8, „Textdokument (*.txt),*.txt“)
Open „C:\Text.txt“ For Append Access Write As #1
Write #1, Eintrag
Close #1
End Function

Hallo, Achim!

vielen Dank für Deine Ausführung. Leider werden meine Werte
immer in folgender Form in die Datei abgespeichert:
„wort1,wort2,wort3,wort4,wort5,wort6,wort7,“
jetzt liest er immer die " mit ein bzw. sucht das letzte komma
der zeile. Kann man das irgendwie ändern? Oder kann man das
abspeichern so ändern, dass er ohne " abspeichert?
Mein Code:

Function Speichern()
Dim Textdatei As String

Gewöhne Dir am besten an, in jedem Modul „Option Explicit“ zu verwenden. Das stellst Du (Achtung! Nur für NEUE Module) unter Extras-Optionen-Editor-Variablendeklaration erforderlich ein.

In diesem Fall müsstest Du noch Deine anderen Variablen deklarieren.

Eintrag = var1 & „,“ & var2 & „,“ & var3 & „,“ & var4 & „,“ &
var5 & „,“ & var6 & „,“ & var7 & „,“

Hier machst Du immer ein Komma ans Ende jeder Zeile, ohne was anderes zu schreiben. Gewollt?

Textdatei = Application.GetSaveAsFilename(var8, „Textdokument
(*.txt),*.txt“)

Die Textdatei ignorierst Du. Oder willst Du in die eingegebene Datei speichern? Dann muss Dein Open auf die Variable Textdatei gehen

Open „C:\Text.txt“ For Append Access Write As #1

Hilfe! Gewöhne Dir auch hier an, FreeFile zu verwenden, um den Dateihandle zu bekommen. Wenn Du nämlich das Makro aufrufst, während vorher durch ein anderes bereits eine Datei geöffnet wurde, die den VBA-Handle 1 zugewiesen bekommen hat, wird’s ordentlisch scheppern!

Write #1, Eintrag

Verwende statt Write „Print“, und die Anführungszeichen sind weg…

Gruß, Manfred

Hallo manfred,

ich habe deinen code jetzt mal eingebaut, aber beim versuch, die datei zu öffnen, wird immer der laufzeitfehler 52 ausgegeben: Dateiname oder Nummer falsch! Woran liegt es? Die Pfadangabte stimmt, der Dateiname auch…Was mache ich falsch?

pfad: C:\text.txt

code: Open „C:\text.txt“ For Input As #lngFile

gruß achim

Hallo Achim!

code: Open „C:\text.txt“ For Input As #lngFile

Das langt nicht. Poste mal den ganzen Code der Funktion, die den Fehler erzeugt.

Gruß, Manfred

Private Sub CommandButton5_Click()

Dim lngFile As Long
Dim strZeile As String
Dim lngPos As Long
Dim lngSpalte As Long
ngFile = FreeFile
’ hier Deine Datei:
Open „C:\text.txt“ For Input As #lngFile
Do While Not EOF(lngFile)
’ Zeile einlesen
Line Input #lngFile, strZeile
’ Komma auch am Ende
strZeile = strZeile & „,“
ngSpalte = 1
’ an Kommata aufsplitten
Do
ngPos = InStr(strZeile, „,“)
Tabelle1.Cells(1, lngSpalte) = Left$(strZeile, lngPos - 1)
strZeile = Mid$(strZeile, lngPos + 1)
lngSpalte = lngSpalte + 1
Loop Until strZeile = „“
’ das andere Makro aufrufen
'Call AnderesMakro
’ Bereich wieder löschen
Tabelle1.Range(„A1:G1“).Clear
Loop
Close #lngFile
End Sub

Hi, Achim!

Genau deswegen solltest Du immer ein Option Explicit verwenden.

Dim lngFile As Long
ngFile = FreeFile

Diese Variable „NGFILE“ gibt’s nicht.
Und hier ist die Variable LNGFILE nicht gesetzt, d. h. immer noch auf dem Wert 0, und das funktioniert mit dem Open nicht:

Open „C:\text.txt“ For Input As #lngFile

Mit Option Explicit kriegst Du die Meldung, dass ngFile nicht deklariert ist. Und somit findest Du raus, dass Du Dich vertippt hast…

ngSpalte = 1
ngPos = InStr(strZeile, „,“)

Hier das gleiche: das sollte LNGSPALTE bzw. LNGPOS sein.

Gruß, Manfred

Split statt Schleife

„wort1,wort2,wort3,wort4,wort5,wort6,wort7,“

Habe mir den Code jetzt nicht genau angeschaut, aber das Split kam da nicht drin vor, glaube ich:

Statt mit einer Schleife die ganzen Positionen der Kommata zu suchen und den Text dann auseinander zu pulen, ist folgendes viel einfacher:

Sub test()
Const s\_Sep As String = "," 'verwendetes Trennzeichen (Separator)
Const xOffs As Byte = 2 'Start in Spalte 2
Const y As Byte = 1 'Zeile 2

Dim sZeile As String
Dim arrWoerter() As String 'Array für die Einzelstrings
Dim i As Byte

 sZeile = InputBox("Testzeile:", "Test", """wort1,wort2,wort3,wort4,wort5,wort6,wort7,""")

 'löschen der Anführungszeichen:
 sZeile = Replace(sZeile, """", "")

 'letztes Trennzeichen löschen (muss aber nicht sein)
 If Right(sZeile, 1) = s\_Sep Then sZeile = Left(sZeile, Len(sZeile) - 1)

 'Zeile in seine Bestandzeile zerlegen:
 arrWoerter = Split(sZeile, s\_Sep)

 'Array auslesen und Inhalt ins Blatt schreiben:
 For i = 0 To UBound(arrWoerter)
 ActiveSheet.Cells(y, i + xOffs).Value = arrWoerter(i)
 Next i
End Sub 'test

Man kann sich das Löschen des letzten Trennzeichens wie gesagt auch sparen, wenn die Anzahl der Elemente immer gleich ist - hier 7. Dann ändert sich die obere Grenze in der For-Schleife von der fexiblen Arraygröße (Ubound) zur festen 6 (die Zählung beginnt bei 0):

Sub test2()
Const s\_Sep As String = "," 'verwendetes Trennzeichen (Separator)
Const xOffs As Byte = 2 'Start in Spalte 2
Const y As Byte = 1 'Zeile 2

Dim sZeile As String
Dim arrWoerter() As String 'Array für die Einzelstrings
Dim i As Byte

 sZeile = InputBox("Testzeile:", "Test", """wort1,wort2,wort3,wort4,wort5,wort6,wort7,""")

 'löschen der Anführungszeichen:
 sZeile = Replace(sZeile, """", "")

 'letztes Trennzeichen wird nicht gelöscht - man kennt die Anzahl der Elemente (hier 7)

 'Zeile in seine Bestandzeile zerlegen:
 arrWoerter = Split(sZeile, s\_Sep)

 'Array auslesen und Inhalt ins Blatt schreiben:
 For i = 0 To 6
 ActiveSheet.Cells(y, i + xOffs).Value = arrWoerter(i)
 Next i
End Sub 'test2

Wenn man dann noch eventuelle Leerzeichen vor/hinter den Wörtern löschen will, macht man einfach noch ein „Trim()“ um das „arrWoerter(i)“ drumrum.

Die beiden Test-Prozeduren können direkt so ausgeführt werden. Aber aufpassen, sie schreiben ins Blatt rein. Und zum besseren Verständnis alle unbekannten Bezeichner (Split, Replace, For, Ubound, Trim, Cells, Right, Left) anklicken und mittels F1 in die jeweilige Hilfe springen.

Kristian