Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1364to1368
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
Textdatei in Excel einlesen
22.06.2014 14:50:41
Anja
Liebes Forum,
nachdem ich jetzt 2 Tage rumgebastelt und verschiedene Codes aus dem Internet ausprobiert habe, hoffe ich auf jemanden, der mir hier weiterhelfen kann.
Ich möchte eine Textdatei in Excel einlesen, die mit Semikolons getrennt ist.
Diese soll auf die verschiedenen Spalten aufgeteilt werden.
Die Textdatei möchte ich im Explorer selber auswählen können.
Anbei zwei Codes die auf Ihre Art wunderbar funktionieren, aber ich bräuchte eine Kombination aus beiden. Es ist mir nicht gelungen selber etwas zu basteln, weil mir dazu das Wissen fehlt.
CODE 1
Dieser Code funktioniert in der Umsetzung super. Er trennt alles sauber. Leider kann ich die zu importierende Text-Datei nicht selber aussuchen. Sie muss in dem Ordner vorhanden sein, wo sich auch diese Arbeitsmappe befindet. In Zelle G1 müsste ich den Dateinamen eintragen, damit die .txt-Datei geöffnet und importiert werden kann.
Mit der Datei sollen auch „Excelferne“ Personen arbeiten können.
Private Sub CommandButton3_Click()
Dim Pfad As String, lfnNr As Integer, Zeile As String, Inhalt() As String
Dim Ziel As Range
Dim str_ordner As String 'verzeichnis
Dim str_file As String 'dateiname
Dim str_cache As String 'cache
Dim zaehler As Integer 'zaehler
Dim zaehlerende As Integer 'Zaehler ende
Sheets("Test2").Activate
str_cache = Range("G1") '.Text & str_file
'Freie Zelle in Spalte A suchen
Sheets("Test2").Activate
With ThisWorkbook.ActiveSheet
Set Ziel = .Range("A65536").End(xlUp).Offset(1, 0)
If IsEmpty(.Range("A3")) Then Set Ziel = .Range("A3")
End With
'Variablen füllen
Pfad = str_cache
lfnNr = FreeFile
'Prüfen, ob Pfad exisistiert
If Dir(Pfad) = "" Then
MsgBox "Datei nicht vorhanden" & Pfad, , "Meldung"
Exit Sub
End If
'Datei öffnen
Open Pfad For Input As #lfnNr
'Weitermachen bis alle Zeilen abgearbeitet
Do While Not EOF(lfnNr)
'Zeile einlesen
Line Input #lfnNr, Zeile
'Wenn Zeile Leer dann mache nichts
If Trim(Zeile)  "" Then
'Wenn Zeile ein ; enthält weitermachen
If InStr(Zeile, ";") > 0 Then
'Zeile in mehrere Felder auftrennen, Trennzeichen ;
Inhalt = Split(Zeile, ";")
'Übertragen der Felder in freie Zeile
Ziel.Resize(1, UBound(Inhalt)).Value = Inhalt
Else
'Einzelnes Feld übertragen
Ziel.Value = Zeile
End If
'Nächste Zeile auswählen
Set Ziel = Ziel.Offset(1, 0)
End If
Loop
'Datei schließen
Close #lfnNr
'Aufräumen
Set Ziel = Nothing
zaehler = zaehler + 1
End Sub

CODE 2
Mit diesem Code kann ich die Text-Datei selber auswählen. Leider wird die nur Zeilenweise importiert und nicht in die unterschiedlichen Spalten unterteilt.
Private Sub CommandButton1_Click()
Dim Quelle As Object, Ziel As Object
Dim Datei As String
On Error GoTo Fehler
'Dialog "Datei öffnen" anzeigen
'Datei = Application.GetOpenFilename("Excel-Dateien(*.xls),*xls")
Datei = Application.GetOpenFilename("Excel-Dateien(*.txt),*cvs")
'Abbrechen falls keine Datei ausgewählt
If Datei = "Falsch" Then
MsgBox "keine Datei ausgewählt", , "Abbruch"
Exit Sub
End If
'MsgBox "Ausgewählte Datei: " & Datei, , ""
'Ausgewählte Datei öffnen
Workbooks.Open Filename:=Datei
Set Quelle = ActiveWorkbook.Worksheets(1)
Set Ziel = ThisWorkbook.Worksheets(1)
'kopieren und einfügen
Quelle.UsedRange.Copy Ziel.Cells(3, 1)
ActiveWorkbook.Close
'Speicher freigeben
Set Quelle = Nothing
Set Ziel = Nothing
Exit Sub
Fehler:
Set Quelle = Nothing
Set Ziel = Nothing
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
End Sub

Wie gesagt, möchte ich eine Kombination aus beiden Codes. Von mir aus auch gekürzt. Also ohne Meldung, dass die Datei nicht gefunden wurde. Das fällt eh weg, wenn man sie selber aussuchen kann.
Vielen Dank im Voraus für Eure Denkarbeit.
Liebe Grüße
Anja

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 15:22:03
Daniel
Hi
nutze doch die Importfunktion von Excel:
Sub Makro2()
Dim Datei As String
ChDrive = Left(ThisWorkbook.Path, 1)
ChDir = ThisWorkbook.Path
Datei = Application.GetOpenFilename
If Not LCase(Datei) Like "fal*" Then
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & Datei, Destination:=Range("$A$1"))
.Name = "Einstieg"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
.Delete
End With
End If
End Sub
die Zielzelle, ab der eingefügt wird, gibst du bei "Destination" an.
Gruß Daniel

Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 18:00:04
Anja
Hallo Daniel,
danke erst einmal für Deine Hilfe. Leider funktioniert der Code nicht.
Ich bekomme eine Fehlermeldung: Argument nicht optional bei ChDrive gleich in der zweiten Code-Zeile.
Woran kann das liegen? Hat das was mit vielleicht etwas mit .Name = "Einstieg" zu tun?
Gruß
Anja

AW: Textdatei in Excel einlesen
22.06.2014 18:13:07
Daniel
Hi
lass mal die Gleichheitszeichen weg, ChDrive und ChDir werden ohne geschrieben.
ChDrive  Left(ThisWorkbook.Path, 1)
ChDir  ThisWorkbook.Path
Datei muss natürlich vorher gespeichert worden sein.
ansonsten kannst du auch die beiden Zeilen weglassen, sie sorgen nur dafür, das gleich das Verzeichnis, in welchem sich die Datei mit dem Makro befindet, geöffnet wird.
Gruß Daniel

Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 21:46:02
Anja
Hallo Daniel,
der Code funktioniert jetzt. Danke. Danke. Danke
Für alle die auch von Daniels Arbeit profitieren wollen, stelle ich hiermit den funktionierenden Code zur Verfügung:
Private Sub cmdDaniel_Click()
Dim Datei As String
ChDrive Left(ThisWorkbook.path, 1)
ChDir ThisWorkbook.path
Datei = Application.GetOpenFilename
If Not LCase(Datei) Like "fal*" Then
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & Datei, Destination:=Range("$A$1"))
.Name = "Einstieg"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
.Delete
End With
End If
Da ich aus Blödheit den Thread doppelt gepostet habe hier noch eine andere Lösung von Karin bzw. _
Beverly.
Ich habe mich für diesen Code entschieden weil er die zu importierende Textdatei etwas besser  _
darstellt. Wenn sich Zahlen in der Datei befinden, die mit einem Punkt getrennt sind,
gibt der obere Code diese Zahlen häufiger in einem Datumsformate aus. Das passiert im übrigen  _
auch wenn ich die Datei in Excel unter Externe Daten abrufen importiere.
Komischerweise entsteht das Problem nicht, wenn ich es über meinen CODE 1 einfüge.
Mit Karins Code sind wesentlich weniger Zahlen betroffen.

Private Sub cmdKarin_Click()
Dim strFile As String
Dim strInhalt As String, varErgebnis
Dim objTextFile As Object
strFile = Application.GetOpenFilename("Text-Dateien(*.txt),*csv")
Application.ScreenUpdating = False
Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFile, 1,  _
False) _
strInhalt = objTextFile.ReadAll
objTextFile.Close
'falls das Zeilenende der Textdatei aus CR+LF-Zeichen besteht:
varErgebnis = Split(strInhalt, vbCrLf)
Range("A4").Resize(UBound(varErgebnis) + 4, 1) = Application.Transpose(varErgebnis)
Columns(1).TextToColumns Destination:=Range("A4"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Space:=False, Comma:=False
Application.ScreenUpdating = True
End Sub

Vielen Dank an alle Mitdenkende.
Gruß
Anja

Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 22:00:27
Daniel
Hi
wenns mit dem Import von Zahlen probleme gibt, dann kannst du dem Import explizit mitteilen, ob die Zahlen in der Datei das Komma oder den Punkt als Dezimalzeichen haben, ebenso für das Tausenderzeichen:
        .TextFileColumnDataTypes = Array(1)
.TextFileDecimalSeparator = "."
.TextFileThousandsSeparator = ","
wenns beim Datum probleme gibt, kannst du im Array von .TextFileColumnDataTypes festlegen in welchem Format die Spalten und die Datumswerte in der Datei vorliegen.
Für die genaue Syntax solltest du aber mal den Import von Hand ausführen, dabei die verschiednen Einstellungen ausprobieren und das ganze mit dem Recorder aufzeichnen.
Mit Hilfe des aufgezeichneten Codes und der Hilfe lernst du dann schnell, wie du es Programmieren musst, damit die einzelnen Spalten richtig importiert werden.
Gruß Daniel

Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 17:51:27
Beverly
Hi Anja,
vielleicht wäre das eine Möglichkeit:
Sub TxT_Komplett()
Dim strFile As String
Dim strInhalt As String, varErgebnis
Dim objTextFile As Object
strFile = Application.GetOpenFilename("Text-Dateien(*.txt),*csv")
Application.ScreenUpdating = False
Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFile, 1, False) _
strInhalt = objTextFile.ReadAll
objTextFile.Close
'falls das Zeilenende der Textdatei aus CR+LF-Zeichen besteht:
varErgebnis = Split(strInhalt, vbCrLf)
Range("A1").Resize(UBound(varErgebnis) + 1, 1) = Application.Transpose(varErgebnis)
Application.ScreenUpdating = True
End Sub


Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 18:30:30
Anja
Hallo Karin,
vielen Dank für Deine Mühe. Bei der Ausführung des Codes gibt es keine Fehlermeldung. Ich kann die Datei öffnen und einfügen. Leider teilt er den Text aber nicht in die einzelnen Spalten auf.
In meinem eingefügten CODE 1 wird der Text nach dem Import in die einzelnen Spalten aufgeteilt. Immer nach Semikolon getrennt. Ich glaube dafür wird folgender Code verwendet :Inhalt = Split(Zeile, ";")
Ich habe das versucht in Deinen Code einzufügen, aber dann bekomme ich eine Fehlermeldung:
Dein Code
varErgebnis = Split(strInhalt, vbCrLf)
Mein Versuch
varErgebnis = Split(Zeile, ";")
Meldung:
Typenunverträglich
in Codezeile:
Range("A1").Resize(UBound(varErgebnis) + 1, 1) = Application.Transpose(varErgebnis)
Gibt es nicht die Möglichkeit Code 1 einfach so zu verändern, dass er mich eine Textdatei selber auswählen lässt, satt in Zeile G1 zu suchen was für ein Dateiname drinsteht. Dann sucht er im Ordner selber die Datei und öffnet diese. Das finde ich zu kompliziert.
Gruß
Anja

Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 18:47:37
Beverly
Hi Anja,
ergänze noch vor der Zeile Application.ScreenUpdating = True diese
    Columns(1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=True
dann sollte der Text auch noch in Spalten aufgeteilt werden.


AW: Textdatei in Excel einlesen
22.06.2014 21:56:45
Anja
Hallo Karin,
Jetzt hat das Ganze doch tatsächlich besser funktioniert. Vielen Vielen Dank.
Ich habe den Code noch etwas ergänzt, weil die Spalten etwas wirr importiert wurden. Und siehe da es hat sich gelohnt.
Ich habe noch space und comma = False hinzugefügt und jetzt sieht das Ganze richtig gut aus.
Anbei der Code im Gesamten, falls noch andere Fragende mit diesem Problem beschäftigt sind.
Was ich immer noch nicht verstehe ist, warum die Daten so verschieden aussehen. Je nachdem wie ich sie importiere. Wenn ich es manuell (über Excel Externe Daten abrufen) mache, werden viele Zahlen aus der Textdatei, die mit einem Punkt getrennt sind, beim Import als Datum dargestellt. Mit dem Code von Karin sind wesentlich weniger Zahlen betroffen. Bei dem von mir geposteten Code 1, werden alle Zahlen perfekt importiert. Weiß jemand woran das liegt?
Private Sub cmdKarin_Click()
Dim strFile As String
Dim strInhalt As String, varErgebnis
Dim objTextFile As Object
strFile = Application.GetOpenFilename("Text-Dateien(*.txt),*csv")
Application.ScreenUpdating = False
Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strFile, 1,  _
False) _
strInhalt = objTextFile.ReadAll
objTextFile.Close
'falls das Zeilenende der Textdatei aus CR+LF-Zeichen besteht:
varErgebnis = Split(strInhalt, vbCrLf)
Range("A4").Resize(UBound(varErgebnis) + 4, 1) = Application.Transpose(varErgebnis)
Columns(1).TextToColumns Destination:=Range("A4"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Space:=False, Comma:=False
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Textdatei in Excel einlesen
22.06.2014 22:06:12
Daniel
HI
wenn du den Code von Hand ausführst, wendet die Importfunktion beim Einlesen das Landestypische Format zum Erkennen von Zahlen (Dezimalzeichen) und Datumswerten an (Reihenfolge Tag/Monat)
führst du den selben Code jedoch per Makro aus, dann werden die Internationalen Zahlenformate angewendet.
dh wenn der Code in Deutschland laufen soll, dann musst du beim Import das Dezimal- und Tausendertrennzeichen explizit vorgeben, oder bei den Open-Funktionen mit dem Parameter Local:=True VBA anweisen, die Lokalen Formate zu verwenden.
da dein gefundener Code sich nicht auf die Excelautomatiken verlässt und explizit ausprogrammiert ist, wird er diesen Umstand berücksichtigen.
Gruß Daniel
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige