Vba: csv Datei in Access importieren

Hallo Wissende,

ich möchte eine csv-Datei per Vba in Access 2000 einlesen.
Aufruf des Codes ist nicht in Access.

Die Archivsuche nach
csv vba
brachte nichts, naja, einzig eine unbeantwortete Frage die meiner gleicht, bei den anderen Treffern ging es um Export in eine csv u.ä.
Beim Durchackern der Links in der FAQ komme ich nur mühsam vorwärts:frowning:

Wie kann man eigentlich Access nach diesem Aufruf:

Sub CsvImport()
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
With appAccess
 .Visible = True
 ' weiterer Code
End With
End Sub

daran hindern wieder zu verschwinden? In Excel/Word müßte ich da extra
appAccess.Quit schreiben um die Application zuschließen, jetzt bräuchte ich sowas wie appAccess.Stay o.ä.

Falls das wichtig ist, die csv ist eine echte csv, also mit Komma getrennt.
(gibt ja auch unechte csvs, da wird Semikolon anstatt Komma benutzt, heißen aber auch csv)

Danke ^ Gruß
Reinhard

Hallo,

sorry, aber ich habe den Sinn der Fragestellung nicht verstanden.

Wenn Du eine CSV-Datei importieren willst, dann benutz Transfertext mit einer evtl. vorher erstellten Importspezifikation oder lies die Datei per VBA-(File) Open und Line Input ein und benutz einen Recordset zum Speichern in eine Tabelle.

Wobei CSV „Comma Separated Values“ als auch „Character Separated Values“ bedeuten kann.

Was das Schließen von Access betrifft, wird die Sitzung nur unsichtbar, im Taskmanager sammeln sich die sich aber durchaus an.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Franz,

sorry, aber ich habe den Sinn der Fragestellung nicht
verstanden.

sorry2, kurz,knapp und präzise zu erklären ist leider nicht mein Ding:frowning: :smile:

Ich möchte eine csv, deren Anfang so aussieht:

„33996344“,„33996351“,„GB“,„GBR“,„UNITED KINGDOM“
„50331648“,„69956103“,„US“,„USA“,„UNITED STATES“
„69956104“,„69956111“,„BM“,„BMU“,„BERMUDA“
„69956112“,„83886079“,„US“,„USA“,„UNITED STATES“
„94585424“,„94585439“,„SE“,„SWE“,„SWEDEN“

mittels Vba-Aufruf der nicht in Access gestartet wird so in Access importieren, daß mich dann in Access dieses Bild anlächelt:

Tabellenblatt: C:\[CSVEinlesen.xls]!Teil1
 │ A │ B │ C │ D │ E │
──┼──────────┼──────────┼────┼─────┼────────────────┤
1 │ 33996344 │ 33996351 │ GB │ GBR │ UNITED KINGDOM │
──┼──────────┼──────────┼────┼─────┼────────────────┤
2 │ 50331648 │ 69956103 │ US │ USA │ UNITED STATES │
──┼──────────┼──────────┼────┼─────┼────────────────┤
3 │ 69956104 │ 69956111 │ BM │ BMU │ BERMUDA │
──┼──────────┼──────────┼────┼─────┼────────────────┤
4 │ 69956112 │ 83886079 │ US │ USA │ UNITED STATES │
──┼──────────┼──────────┼────┼─────┼────────────────┤
5 │ 94585424 │ 94585439 │ SE │ SWE │ SWEDEN │
──┴──────────┴──────────┴────┴─────┴────────────────┘

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Links die Zeilennummern 1-5 und oben die Spaltenbezeichnungen A-E sind unwichtig, so würde es in Excel aussehen.

Meine Versuche eine csv manuell in Access zu öffnen scheiterten, irgendwas ging immer bei der Umwandlung schief, egal was ich wählte.
(Hinweis, ich kenne mich in Access überhaupt nicht aus)

Wenn Du eine CSV-Datei importieren willst, dann benutz
Transfertext mit einer evtl. vorher erstellten
Importspezifikation

?

oder lies die Datei per VBA-(File) Open

und Line Input ein und benutz einen Recordset zum Speichern in
eine Tabelle.

Das verstehe ich schon eher.
Okay, der Code müßte ja auch in Access klappen:

FF = FreeFile
Application.StatusBar = „Lese csv-Datei ein“
Open Pfad & Dat For Binary As #FF
S = Input(FileLen(Pfad & Dat), #FF)
Close #FF
Satz = Split(S, Chr(10))

Nun hab ich im Array Satz die einzelnen Zeilen der csv-Datei, wie kriege ich die nun in eine Tabelle von Access?
Recordset sagt mir leider gar nix, schon mal gelesen aber k.A.

Wobei CSV „Comma Separated Values“ als auch „Character
Separated Values“ bedeuten kann.

Stimmt, hatte ich vergessen :smile:

Was das Schließen von Access betrifft, wird die Sitzung nur
unsichtbar, im Taskmanager sammeln sich die sich aber durchaus
an.

Aha, danke für die Info, hatte ich vergessen zu prüfen.
Aber trotzdem, gibt es einen „Dreh“ daß die Anwendung sichtbar bleibt?

Vielleicht wird alles verständlicher wenn ich den Hintergrund erkläre, im Excelbrett ist eine Anfrage wo jmd. eine csv in Excel einlesen will, das geht aber nicht weil sein Excel nur 65536 Datensätze kennt und die csv mehr Datensätze hat.
beim Versuch diese csv-datei in Excel kommt eine riesenlange Fehlermeldung (so lang hab ich noch keine gesehen *gg*) wo gesagt wird, man solle die csv in Access öffnen, dann durch die Export-Funktion von Access sie in kleinen Excel-dateien exportieren.

Ich habe daraufhin eine Excel-Vba-Lösung gebastelt die diese übergroße csv-datei einliest.
Nur die dauert 2-4 Minuten.

Deshalb dachte ich, ich setze das was die Fehlermeldung besagt in Vba um, also die csv in Access importieren, dann in kleinen Häppchen als xls speichern.
Das müßte ja theoretisch fix gehen.

Es geht um diese Anfrage:

**/t/fehlermeldung-csv-datei-wuerde-auch-xls-betreffen…

Danke für das Interesse
Gruß
Reinhard**

Hallo Franz,

sorry, aber ich habe den Sinn der Fragestellung nicht
verstanden.

sorry2, kurz,knapp und präzise zu erklären ist leider nicht
mein Ding:frowning: :smile:

Ich möchte eine csv, deren Anfang so aussieht:

„33996344“,„33996351“,„GB“,„GBR“,„UNITED KINGDOM“
„50331648“,„69956103“,„US“,„USA“,„UNITED STATES“
„69956104“,„69956111“,„BM“,„BMU“,„BERMUDA“
„69956112“,„83886079“,„US“,„USA“,„UNITED STATES“
„94585424“,„94585439“,„SE“,„SWE“,„SWEDEN“

mittels Vba-Aufruf der nicht in Access gestartet wird so in
Access importieren, daß mich dann in Access dieses Bild
anlächelt:

Tabellenblatt: C:[CSVEinlesen.xls]!Teil1
│ A │ B │ C │ D
│ E │
──┼──────────┼──────────┼────┼─────┼────────────────┤
1 │ 33996344 │ 33996351 │ GB │ GBR
│ UNITED KINGDOM │
──┼──────────┼──────────┼────┼─────┼────────────────┤
2 │ 50331648 │ 69956103 │ US │ USA
│ UNITED STATES │
──┼──────────┼──────────┼────┼─────┼────────────────┤
3 │ 69956104 │ 69956111 │ BM │ BMU
│ BERMUDA │
──┼──────────┼──────────┼────┼─────┼────────────────┤
4 │ 69956112 │ 83886079 │ US │ USA
│ UNITED STATES │
──┼──────────┼──────────┼────┼─────┼────────────────┤
5 │ 94585424 │ 94585439 │ SE │ SWE
│ SWEDEN │
──┴──────────┴──────────┴────┴─────┴────────────────┘

Tabellendarstellung erreicht mit dem Code in FAQ:2363

Links die Zeilennummern 1-5 und oben die Spaltenbezeichnungen
A-E sind unwichtig, so würde es in Excel aussehen.

Meine Versuche eine csv manuell in Access zu öffnen
scheiterten, irgendwas ging immer bei der Umwandlung schief,
egal was ich wählte.
(Hinweis, ich kenne mich in Access überhaupt nicht aus)

Wenn Du eine CSV-Datei importieren willst, dann benutz
Transfertext mit einer evtl. vorher erstellten
Importspezifikation

?

Option Explicit
Public appaccess As Object
Public Function csvimport()


Set appaccess = CreateObject("Access.Application")
With appaccess
.Opencurrentdatabase "c:\test.mdb"

 .Visible = True

.DoCmd.TransferText 0, "CSVImport", "tbl\_AccessTabelle", "c:\test.csv", True
.
.
'Mit SQL und Execute -----------------
.
.
.
Dim FF as long, S as String, Satz as Variant 
FF = FreeFile
Application.StatusBar = "Lese csv-Datei ein"
Open Pfad & Dat For Binary As #FF

Line Input(FF,S) ' falls erste Zeile Feldnamen besitzt
do until Eof(FF)
Line Input(FF,S)

Satz = Split(S, ",")

.Execute "insert into tbl\_AccessTabelle (Feld1,Feld2,Feld3) Values(" & \_
"'" & Satz(0) & "'" & \_
"'" & Satz(1) & "'" & \_
"'" & Satz(2) & "')"
Close FF


End With

End Function

vorher muß in Access für die CSV-Datei einmalig mit Hilfe des Importassistenten (Datenbankfenster/Tabellen , Rechtsklick, Importieren und dann im Verlauf des Ass. auf „weitere“ klicken) die Import-Spez „CSVImport“ definiert und gespeichert(!) werden.

ungetestet, nur prinzipiell und die Recordsetmethode lass ich mal außen vor.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

oder lies die Datei per VBA-(File) Open

und Line Input ein und benutz einen Recordset zum Speichern in
eine Tabelle.

Das verstehe ich schon eher.
Okay, der Code müßte ja auch in Access klappen:

FF = FreeFile
Application.StatusBar = „Lese csv-Datei ein“
Open Pfad & Dat For Binary As #FF
S = Input(FileLen(Pfad & Dat), #FF)
Close #FF
Satz = Split(S, Chr(10))

Nun hab ich im Array Satz die einzelnen Zeilen der csv-Datei,
wie kriege ich die nun in eine Tabelle von Access?
Recordset sagt mir leider gar nix, schon mal gelesen aber k.A.

Wobei CSV „Comma Separated Values“ als auch „Character
Separated Values“ bedeuten kann.

Stimmt, hatte ich vergessen :smile:

Was das Schließen von Access betrifft, wird die Sitzung nur
unsichtbar, im Taskmanager sammeln sich die sich aber durchaus
an.

Aha, danke für die Info, hatte ich vergessen zu prüfen.
Aber trotzdem, gibt es einen „Dreh“ daß die Anwendung sichtbar
bleibt?

Vielleicht wird alles verständlicher wenn ich den Hintergrund
erkläre, im Excelbrett ist eine Anfrage wo jmd. eine csv in
Excel einlesen will, das geht aber nicht weil sein Excel nur
65536 Datensätze kennt und die csv mehr Datensätze hat.
beim Versuch diese csv-datei in Excel kommt eine riesenlange
Fehlermeldung (so lang hab ich noch keine gesehen *gg*) wo
gesagt wird, man solle die csv in Access öffnen, dann durch
die Export-Funktion von Access sie in kleinen Excel-dateien
exportieren.

Ich habe daraufhin eine Excel-Vba-Lösung gebastelt die diese
übergroße csv-datei einliest.
Nur die dauert 2-4 Minuten.

Deshalb dachte ich, ich setze das was die Fehlermeldung besagt
in Vba um, also die csv in Access importieren, dann in kleinen
Häppchen als xls speichern.
Das müßte ja theoretisch fix gehen.

Es geht um diese Anfrage:

/t/fehlermeldung-csv-datei-wuerde-auch-xls-betreffen…

Danke für das Interesse
Gruß
Reinhard

Hallo Franz,

vorher muß in Access für die CSV-Datei einmalig mit Hilfe des
Importassistenten (Datenbankfenster/Tabellen , Rechtsklick,
Importieren und dann im Verlauf des Ass. auf „weitere“
klicken) die Import-Spez „CSVImport“ definiert und
gespeichert(!) werden.

danke für den Code.
Das was du beschreibst klingt ja, obwohl es anscheinend etwas anderes ist, wie einen Verweis zu setzen.

Kann man das nicht mit in den Code einbauen?

Gruß
Reinhard

Hallo,

Das was du beschreibst klingt ja, obwohl es anscheinend etwas
anderes ist, wie einen Verweis zu setzen.

ja, das ist was anderes…

Kann man das nicht mit in den Code einbauen?

Stichwort „schema.ini“-Datei

siehe mal hier:
http://support.microsoft.com/kb/210001/de

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

1 Like

Kann man das nicht mit in den Code einbauen?

Stichwort „schema.ini“-Datei
siehe mal hier:
http://support.microsoft.com/kb/210001/de

Hallo Franz,

ich kam noch nihct dazu deinen ersten Code zu testen.

in dem Link lese ich heraus, daß man diese schema.ini dazu benutzt um Textdateien mit Einträgen fester Länge auszulesen/zu öffnen.

Aber es muß ja wohl auch ohne gehen wenn ich das richtig deute:

„Zugriff kann eine Textdatei direkt lesen oder es kann eine Informationsdatei, die als Schema.ini bezeichnet wird, verwenden,“

Fragt sich nur was „Zugriff“ ist, Access und wie mit Access-Vba?
Es ist nur Zufall daß in meiner Beispiel-csv alle Einträge feste Längen haben.

Gruß
Reinhard

Zitat:

In Microsoft Access 2000 können Sie Textdateien mit Trennzeichen und fester Länge verknüpfen oder Textdateien mit Trennzeichen und fester Länge können geöffnet werden. Zugriff kann eine Textdatei direkt lesen oder es kann eine Informationsdatei, die als Schema.ini bezeichnet wird, verwenden, um die Merkmale der Textdatei wie Spalte-Namen, Feldlängen und Datentypen zu ermitteln.

Hallo,

es dreht sich hier um die Erstellung einer Import-Spez. per Code, wonach Du gefragt hast. Die Importspez-Angaben befinden sich in der genannten „schema.ini“-Datei, die eine gwisse Struktur hat (–> in den Links nachlesen)

Um also Transfertext mit einer Spez. zum Import zu benutzen, muß erst eine passenden schema.ini-Datei erstellt werden.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

es dreht sich hier um die Erstellung einer Import-Spez. per
Code, wonach Du gefragt hast. Die Importspez-Angaben befinden
sich in der genannten „schema.ini“-Datei, die eine gwisse
Struktur hat (–> in den Links nachlesen)

Um also Transfertext mit einer Spez. zum Import zu benutzen,
muß erst eine passenden schema.ini-Datei erstellt werden.

Hallo Franz,

irgendwie bin ich da überfordert.

Nach sehr langen Bemühungen (woher soll ich auch wissen daß man dazu das Dezimaltrennzeichen abändern muß) habe ich es jetzt geschafft diese csv manuell in Access einzulesen.

Diese 4-5 Klicks muß man doch in Access-Vba nachstellen können?
Auch ohne Schema.ini *sicher bin, leider k.A.*

Irgendwie mit Open oder OpenText oder Import o.ä. und Comma:=True und Decimalseperator:=";" o.ä. muß das doch gehen.

Ich habe schon beim Lesen deiner Links und Schmökern in den Links der hiesigen FAQ festgestellt daß Access wohl großen Wert auf Spalten bzw. Feldbezeichnungen legt.
Aber wenn es keine in der csv gibt muß es auch so gehen daraus eine Tabelle zu bilden.

Und, was mich auch interessiert/beschäftigt, Access ist doch für große Datenmengen durchdacht. Beim manuellen Einlesen meiner csv durch Datei—Externedaten—Importieren dauert das aber gewaltig lang.

Gruß
Reinhard

Hallo Reinhard,

Diese 4-5 Klicks muß man doch in Access-Vba nachstellen
können?

kann man - wie schon erwähnt - mit der Funktion TRANSFERTEXT

Auch ohne Schema.ini *sicher bin, leider k.A.*

klar dann nimmt Access den Standard an, in 90% der Fälle reicht der auch, es sei denn ein „Experte“ hat eine Datei nicht nach diesem Standard erstellt.
Ist so wie beim Übersetzer, der ein Blatt Papier bekommt mit einigen Sätzen drauf. Die Sprache, die er standardmäßig übersetzt ist es nicht. Nun benötigt er eine externe Hilfe um zu erkennen welche Sprache es ist, damit er es an den richtigen Übersetzer weitergeben kann.

Irgendwie mit Open oder OpenText oder Import o.ä. und
Comma:=True und Decimalseperator:=";" o.ä. muß das doch gehen.

sorry, aber Access ist kein Basic
und die Funktion TRANSFERTEXT beinhaltet alle diese Möglichkeiten, ich verstehe dein Problem nicht?

Ich habe schon beim Lesen deiner Links und Schmökern in den
Links der hiesigen FAQ festgestellt daß Access wohl großen
Wert auf Spalten bzw. Feldbezeichnungen legt.

nein, das hat mit Datenbanken zu tun und ist nicht nur bei Access so!

Aber wenn es keine in der csv gibt muß es auch so gehen daraus
eine Tabelle zu bilden.

klar, das funktioniert doch auch, nur das die Felder halt mit Feld1,Feld2 usw. benannt werden.

Und, was mich auch interessiert/beschäftigt, Access ist doch
für große Datenmengen durchdacht.

definiere: groß
und Frage: von wem hast du das Gerücht?

Beim manuellen Einlesen
meiner csv durch Datei—Externedaten—Importieren dauert das
aber gewaltig lang.

seit wann ist eine CSV-Datei eine Datenbank!

Diese Datei muss in ein Datenbankformat umgewandelt werden, das dauert auf einem normalen PC mit langsamer ATA-Festplattte und wenig RAM halt länger, als auf einem PC mit schneller SATA2 Platte und 3 GB RAM.

BTW daraus ergibt sich die Frage, in welcher Zeit Daten von einem Datenverwaltungsprogramm abgearbeitet werden müssen - im Verhältnis zur PC Ausstattung und dem Zeitgefühl des Anwenders - um als schnell zu gelten :smile:

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)