Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1468to1472
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
Inhaltsverzeichnis

Datei öffnen und einlesen mit VBA

Datei öffnen und einlesen mit VBA
25.01.2016 19:03:27
Lukas
Servus! Ich möchte gerne über eine Öffnen-Funktion eine Datei auswählen und in Tabelle1 _
einlesen. Dazu habe ich mir folgendes Makro zusammengeschrieben:

Sub Datenübernahme()
Dim Datei As Variant
Dim ReadFile As String
Datei = Application.GetOpenFilename()
If Datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Else
ReadFile = Right(ReadFile, Len(ReadFile) - InStrRev(ReadFile, "\"))
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" _
& ReadFile & "", Destination:=Range("$A$1"))
.Name = "ReadFile"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1,  _
_
_
_
1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   _
_
_
_
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
_
_
_
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
End With
End If
End Sub

Ich kann wie gewünscht Dateien öffnen, allerdings landet nichts von diesen Dateien in meiner Tabelle. Kann jemand helfen?

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
das wundert mich nicht
25.01.2016 19:18:17
Michael
Hi Lukas,
schau mal:
Sub Datenübernahme()
Dim Datei As Variant
Dim ReadFile As String
Datei = Application.GetOpenFilename()
If Datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Else
ReadFile = Right(ReadFile, Len(ReadFile) - InStrRev(ReadFile, "\"))
MsgBox ReadFile
ReadFile = Right(Datei, Len(Datei) - InStrRev(Datei, "\"))
MsgBox ReadFile
End If
End Sub
Schöne Grüße,
Michael

AW: das wundert mich nicht
25.01.2016 19:44:23
Luschi
Hallo Lucas,
Michael hat ja schon auf die Ursache hingewiesen, aber trotzdem wird das so nicht klappen.
Auch die Funktion 'QueryTables.Add(...)' muß wissen, wo sich die txt-Datei befindet.
Wieso kneifst Du dann den Pfad von der im Auswahlmenü bestätigten Datei ab.
Setze im Else-Zweig einfach
ReadFile = Datei
und schmeiße diese Vba-Zeile raus:
ReadFile = Right(ReadFile, Len(ReadFile) - InStrRev(ReadFile, "\"))
Gruß von Luschi
aus klein-Paris

Anzeige
stimmt, da war noch was, Gruß @Luschi owT
25.01.2016 20:20:35
Michael

AW: das wundert mich nicht
26.01.2016 00:17:53
Lukas
Schonmal danke für die schnellen Antworten. Das hat mein Verständnis verbessert. Allerdings läuft immer noch irgendetwas schief. Ich habe das Gefühl, dass die .csv, die über "Externe Daten abrufen/Aus Text" in Tabelle1 landen soll dies nicht macht. Mein aktueller Code lautet:
Sub Datenextraktion()
Dim Datei As Variant
Dim ReadFile As String
Datei = Application.GetOpenFilename()
If Datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Else
ReadFile = Datei
With ActiveSheet.QueryTables.Add(Connection:="TEXT;ReadFile", Destination:=Range("$A$1"))
.Name = Right(Datei, Len(Datei) - InStrRev(Datei, "\"))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True

Anzeige
AW: das wundert mich nicht
26.01.2016 06:18:35
Luschi
Hallo Lukas,
wenn man in Excel per 'Daten-Externe Daten abrufen' eine txt/csv Datei8 importiert und dabei
'Makro aufzeichnen' mitlaufen läßt, dann sieht der Beginn des Quellcodes so aus:

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Users\Für_Alle\Documents\test.txt", Destination:=Range("$A1$5"))
Dabei bildet "TEXT;C:\Users\Für_Alle\Documents\test.txt" eine in sich geschlossene Textkette.
ist der Dateiname samt Pfad aber in 1er Variable ausgelagert, dann muß das so aussehen:

ReadFile = "C:\Users\Für_Alle\Documents\test.txt"
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & ReadFile, Destination:=Range("$A$1"))

In Deinem Anfangsthread, stand das ja so schon, nur warum beseitigst Du 1 Fehler um dann ohne Grund einen anderen wieder einzubauen?
fragt sich Luschi
aus klein-Paris

Anzeige
AW: das wundert mich nicht
26.01.2016 10:12:26
Lukas
Das stimmt, da bin ich durcheinander gekommen. Mir fehlt da noch das tiefere Verständnis, da ich erst am Anfang der VBA-Programmierung stehe. Mein Code sieht jetzt so aus:
ReadFile = Datei
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & ReadFile, Destination:=Range("$A$ _
1"))
.Name = Right(Datei, Len(Datei) - InStrRev(Datei, "\"))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False

Es wird trotzdem nichts eingelesen. Ich sehe gerade nur Bäume, keinen Wald...

evtl. anderer Ansatz
26.01.2016 17:16:27
Michael
Hi zusammen,
da fällt mir gerade ne Frage ein, die ich eh mal stellen wollte: dieses ganze query-Zeug scheint bei jedem Aufruf eine Instanz anzulegen, die dann unter "vorhandene Verbindungen" zu sehen ist/sind.
Bei den Beispielcodes im Forum habe ich bisher immer nur gesehen, daß ne query gestartet wird, aber nicht, daß die dann wieder gelöscht/deaktiviert (oder wie auch immer) wird.
Im konkreten Fall liest Lukas ja nur Daten ein, die mit "1" wie Standard gespeichert werden.
Hier die Frage an Lukas: was sind das für Daten? Texte? Datümer? Zahlen mit und ohne Nachkommastellen?
Ist die Anzahl der Spalten immer gleich?
Die dreckige Variante geht so:
Option Explicit
'kommt in Modul 1
Sub CSV_Importieren()
Dim pfad As String
Dim datei As Variant
Dim a As Variant, a2 As Variant, az As Variant
Dim s As String
Dim i&, dNr%, z&, sp&, zl&, spZ&, zlZ&
Dim c As Range
datei = Application.GetOpenFilename()
If datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Exit Sub
End If
pfad = datei
' **************** Name der Tabelle1 wurde im
' Eigenschaften-Fenster auf Import geändert
Import.Cells.Clear
dNr = FreeFile
Open pfad For Binary As #dNr
s = Space(LOF(dNr))
Get #dNr, 1, s
Close #dNr
a = Split(s, vbCrLf)
zl = UBound(a)
' ************* hier ";" durch vbtab ersetzen
sp = UBound(Split(a(1), ";"))
a2 = Import.Range("A1", Import.Cells(zl + 1, sp + 1))
For zlZ = 0 To zl
' ************* hier ";" durch vbtab ersetzen
az = Split(a(zlZ), ";")
For spZ = 0 To UBound(az)
a2(zlZ + 1, spZ + 1) = az(spZ)
Next
Next
Import.Range("A1", Import.Cells(zl + 1, sp + 1)) = a2
End Sub
Na, mal sehen...
Schöne Grüße,
Michael
P.S.: falls das nicht hinhaut, wäre es nicht ungeschickt, wenn Lukas mal die komplette Beispieldatei, am besten zusätzlich mit anonymisierten Daten hochlädt (kann man ja zusammen zippen).
**********************
P.P.S.: Also, hier Datei anbei: https://www.herber.de/bbs/user/103057.zip
Im Blatt CSV_Import_Array habe ich einige Beispieldaten erzeugt und *dieses* Blatt mit speichern unter als Text(Tab getrennt) abgespeichert. Das liegt als zweite, .CSV-Datei im ZIP-Archiv.
Wenn ich das Import-Makro anwerfe, wird die csv ins Blatt "Import" eingelesen (der Name ist jetzt quasi doppelt vergeben, einmal als Objektname im VBA und einmal als Name des Blattes)

Anzeige
AW: evtl. anderer Ansatz
27.01.2016 14:59:10
Lukas
Michael, vielen Dank für deine Mühe. Leider funktioniert es mit deinem Code bei mir nicht.
Meine Datei ist eine .csv mit Daten von einem Datenlogger, an dem Temperatursensoren hängen. Da kommt bei einer Messung ganz schön was zusammen. Ich möchte eigentlich nur erreichen einen Code zu schreiben, der mir über eine Verzeichnisauswahl die .csv als Text importiert und in "Tabelle1" einfügt.
Hier nochmal mein aktueller Code:

Sub Datenextraktion()
Dim Datei As Variant
Dim ReadFile As String
Datei = Application.GetOpenFilename()
If Datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Else
ReadFile = Datei
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & ReadFile, Destination:=Range("$A$ _
1"))
.Name = Right(Datei, Len(Datei) - InStrRev(Datei, "\"))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  _
1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
End With
End If

Der Code scheint zu laufen, es gibt keine Fehlermeldung. Aber die .csv wird nicht importiert.

Anzeige
Beispieldatei?
28.01.2016 15:04:08
Michael
Hi Lukas,
dann lade doch bitte mal ne abgespeckte Beispieldatei hoch.
Der Punkt ist, daß ich keine Lust habe, diesen Rattenschwanz von 1en zu zählen, um mir selber ne Datei zum Testen zu basteln.
Schöne Grüße,
Michael

Jetzt aber
29.01.2016 00:19:20
Michael
Hi Lukas,
also, die Datei hatte so ihre Besonderheiten: wahrscheinlich wurde sie von einem Linux-System gespeichert, denn Zeilen werden nur mit LF (linefeed) anstatt wie hier üblich mit CRLF (cr=carriage return) getrennt.
Also: die Zeile mit split geändert in: a = Split(s, vbLf)
Die ersten 4 (0 bis 3) Zeilen werden einfach in einem Rutsch als Text eingelesen, die 5. enthält Überschriften, die wird aufgespalten, und alle weiteren Zeilen erfordern eine gewisse Sonderbehandlung für die Spalten mit den Werten: hier wird eine ZAHL aus dem Text erzeugt.
Sollte soweit passen.
Daß das mit dem query nicht recht funktioniert hat, könnte an den viel mehr Einsen liegen als überhaupt Spalten vorhanden sind, aber ich hab's nicht nachverfolgt.
Hier "bitgepfriemelt":
Option Explicit
'kommt in Modul 1
Sub CSV_Importieren()
Dim pfad As String
Dim datei As Variant
Dim a As Variant, a2 As Variant, az As Variant
Dim s As String
Dim i&, dNr%, z&, sp&, zl&, spZ&, zlZ&
Dim c As Range
datei = Application.GetOpenFilename()
If datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Exit Sub
End If
pfad = datei
' **************** Name der Tabelle1 wurde
' Eigenschaften-Fenster auf Import geändert
Import.Cells.Clear
dNr = FreeFile
Open pfad For Binary As #dNr
s = Space(LOF(dNr))
Get #dNr, 1, s
Close #dNr
'For i = 1 To 200
'Debug.Print i & ": " & Mid(s, i, 1) & ": " & Asc(Mid(s, i, 1))
'Next
'Stop
a = Split(s, vbLf)
zl = UBound(a)
'Stop
sp = 12
a2 = Import.Range("A1", Import.Cells(zl + 1, sp + 1))
For zlZ = 0 To 3
a2(zlZ + 1, 1) = a(zlZ)
Next
' jetzt hat zlZ den Wert 4!
az = Split(a(zlZ), vbTab)
For spZ = 0 To UBound(az)
a2(zlZ + 1, spZ + 1) = az(spZ)
Next
For zlZ = 5 To zl
az = Split(a(zlZ), vbTab)
For spZ = 0 To UBound(az)
If spZ > 2 Then   ' wegen Zählung ab 0 ab der 4. Spalte
a2(zlZ + 1, spZ + 1) = Val(Replace(az(spZ), ",", "."))
Else
a2(zlZ + 1, spZ + 1) = az(spZ)
End If
Next
Next
Import.Range("A1", Import.Cells(zl + 1, sp + 1)) = a2
End Sub
Die Datei: https://www.herber.de/bbs/user/103130.xls
Geht auch gut fix, alle 7500 in nicht spürbarer Zeit.
Schöne Grüße,
Michael

Anzeige
AW: Jetzt aber
29.01.2016 12:00:09
Lukas
Michael, das hätte ich nie alleine hingekriegt. Vielen Dank!
Kann man den Code noch anpassen, dass auch Importe mit höherer Spaltenanzahl verarbeitet werden können? Die Testdatei war in dieser Hinsicht sehr überschaubar, es sind normalerweiße über 100 Spalten (=Sensoren) in Gebrauch. Da funktioniert der Code noch nicht.

AW: Jetzt aber
29.01.2016 12:20:11
Michael
Hi Lukas,
dann wundert es mich nicht, daß da so viele 1-en drin waren...
Es wird in der Zeile sp = 12 auf 12 gesetzt.
Für unterschiedliche Spaltenanzahlen habe ich das so geändert, daß sie anhand der Überschriftenzeile ermittelt werden:
Option Explicit
'kommt in Modul 1
Sub CSV_Importieren()
Dim pfad As String
Dim datei As Variant
Dim a As Variant, a2 As Variant, az As Variant
Dim s As String
Dim i&, dNr%, z&, sp&, zl&, spZ&, zlZ&
Dim c As Range
datei = Application.GetOpenFilename()
If datei = False Then
MsgBox ("Datenextraktion abgebrochen.")
Exit Sub
End If
pfad = datei
' **************** Name der Tabelle1 wurde
' Eigenschaften-Fenster auf Import geändert
Import.Cells.Clear
dNr = FreeFile
Open pfad For Binary As #dNr
s = Space(LOF(dNr))
Get #dNr, 1, s
Close #dNr
'For i = 1 To 200
'Debug.Print i & ": " & Mid(s, i, 1) & ": " & Asc(Mid(s, i, 1))
'Next
'Stop
a = Split(s, vbLf)
zl = UBound(a)
'Stop
' hinter die erste For-Schleife versetzt ************
' sp = 12
' a2 = Import.Range("A1", Import.Cells(zl + 1, sp + 1))
For zlZ = 0 To 3
'  a2(zlZ + 1, 1) = a(zlZ) *****************************
'  die ersten vier Zeilen direkt in die Tabelle...
Import.Range("A" & zlZ + 1) = a(zlZ)
Next
az = Split(a(zlZ), vbTab)
sp = UBound(az)
a2 = Import.Range("A1", Import.Cells(zl + 1, sp + 1))
For spZ = 0 To UBound(az)
a2(zlZ - 3, spZ + 1) = az(spZ)
Next
For zlZ = 5 To zl
az = Split(a(zlZ), vbTab)
For spZ = 0 To UBound(az)
If spZ > 2 Then
a2(zlZ - 3, spZ + 1) = Val(Replace(az(spZ), ",", "."))
Else
a2(zlZ - 3, spZ + 1) = az(spZ)
End If
Next
Next
Import.Range("A5", Import.Cells(zl + 1, sp + 1)) = a2
End Sub
Schöne Grüße,
Michael
Anzeige

211 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige