• 18.09.2024, 14:45
  • Register
  • Login
  • You are not logged in.

 

Dear visitor, welcome to Aqua Computer Forum. If this is your first visit here, please read the Help. It explains how this page works. You must be registered before you can use all the page's features. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

ExcelSheets in Access laden (VBA - TransferSpreadsheet)

Friday, April 4th 2014, 2:47pm

Samma... hat einer von euch bissel plan von Access und VBA?
(ich nämlich nicht :D)

Möchte hier einfach gesagt einen ETL Prozess zwischen Excel-Files und einer Access-Tabelle implementieren... hab also drei Excel Dateien, die in eine Tabelle geladen werden sollen und unterschiedliche Daten(Spalten) für teilweise gleiche Datensätze(Zeilen) mitbringen... (Natürlich gibt's eine Spalte mit einem unified-identifier den ich in der Datenbank als Key nutze...) In Java wär das gerade kein Problem für mich ^^ aber in VBA steh ich wien Ochse vorm Berg.

Ich weiß das man mit dem Befehl DoCmd.TransferSpreadsheet ein ExcelSpreadsheet laden kann, aber ich seh keine Möglichkeit die Excel-Spalten auf meine Datenbank-spalten zu mappen... jemand eine idee?

Sören
A sinking ship is still a ship!

seaslug

Senior Member

Saturday, April 5th 2014, 11:17am

hi,

das thema ist eigentlich kein problem für mich, nur verstehe ich nicht, was du möchtest.
sollen die excel-dateien bearbeitet werden (verknüpfung), willst die die importieren (ggf. nur einmalig), oder auch noch einen excel-output erzeugen???

gruß,
seaslug

Sunday, April 6th 2014, 3:30pm

Hi,

hab einen passenden Ansatz gefunden, bei dem ich auf eine Instanz von Excel zugreife...

Aber Situation ist folgende, ich hab (regelmäßig) drei Excel Dateien mit Inhalten. Die könnten zB. so aussehen

Datei 1
ID Name Nachname Adresse

Datei 2
ID Name eMail

Datei 3
ID Arbeitgeber Gehalt


Ich möchte diese Dateien in eine Access Tabelle importieren die dann wiederum folgende Struktur haben könnte

ID Name Nachname Adresse eMail Arbeitgeber Gehalt


Der Key wäre in jeder Datei identisch, nicht zu jedem Datensatz ist aber jede Information vorhanden...
In Datei 1 könnten also die ID 1, 2, 3, 4, 5 sein in Datei 2 nur 2, 3, 4 und 8 und in Datei 3 wiederum 1, 5, 7
usw.

Der Algorithmus sieht also folgendermaßen aus
Lese Excel Datei
Schaue ob ID schon vorhanden, wenn neuen dann neuer Datensatz (INSERT), wenn ja ergänze Datensatz (UPDATE)

Die Exceltabellen Spalten müssen natürlich auf die Access Spalten gemappt werden. Zu allem Überfluss heißen sie je nach Datei auch noch unterschiedlich.
In Java wäre das ne Aufgabe von ner Stunde oder so... in VBA sind mir ein wenig die Hände gebunden weil ich mich nur schlecht auskenne.


Wie gesagt ich hab schon nen Ansatz gefunden der klappen müsste... dabei wird die Excel Datei dann aber wirklich manuell Zelle für Zelle durchgeackert...

Sören
A sinking ship is still a ship!

seaslug

Senior Member

Monday, April 7th 2014, 4:09pm

hi,

das geht einfacher.

- zieltabelle mit allen felder erstellen. dein ID wird primärschlüssel (ohne duplikate).
- die 3 excel-dateien in die datenbank verknüpfen
- entsprechend 3 anfügeabfragen erstellen, die die daten an die zieltabelle anfügen. damit ist auch das problem der zuordnung der anderen namen erschlagen.

dann per VBA-code:


on error resume next

docmd.setwarnings = false
docmd.openquery "Name der ersten anfügeabfrage"
docmd.openquery "Name der zweiten anfügeabfrage"
docmd.openquery "Name der dritten anfügeabfrage"
docmd.setwarnings = true


warum so? es werden dann nur alle neuen datensätze angefügt. vorhanden können nicht angefügt werden, da sonst primärschlüsselverletztung. der "fehler" wird einfach übergangen.

dann noch 3 aktualisierungsabfragen, bei denen du die schon vorhandenen IDs der zieltabelle mit den IDs in deinen verknüpften excel-tabellen verknüpfst.

code analog zu oben.


das alles dauert vielleicht 10 minuten. so als anregung.

gruß,
seaslug

Monday, April 7th 2014, 9:10pm

Hi,

die SQL Querys sind nicht das Problem... sondern der zugriff auf die Excel-Sheets ;)

Sören
A sinking ship is still a ship!

seaslug

Senior Member

Tuesday, April 8th 2014, 2:04am

die brauchst du doch nur zu verknüpfen, wie ich schrieb...

Wednesday, April 9th 2014, 4:02pm

und wie geht das in VBA? ;)
A sinking ship is still a ship!

seaslug

Senior Member

Wednesday, April 9th 2014, 4:56pm

hi,

kein vba nötig. access 2010 (z.b.). symbolleiste "externe daten" -> excel -> assistent durchlaufen.

gruß,
seaslug

Thursday, April 10th 2014, 7:39pm

...

ne... wir brauchen hier ne fertige Lösung... Die Dateien fallen einmal im Monat aus dem Reporting-Tool, sie sind von der Struktur ähnlich jedoch halt jeweils neue Dateien... die müssen das mit einen "Import" Button in nem Formular erledigen können... die Lösung muss auch selbstständig erkennen welche art dieser drei Quellen nun gerade importiert wird etc. ...

aber wie gesagt, mit der Lösung die ich gerade verfolge geht das...
Sprich eine Excel Instanz in VBA anfeixen und daraus direkt auf die Zellen zugreifen...

Sören
A sinking ship is still a ship!

seaslug

Senior Member

Friday, April 11th 2014, 4:22am

hi,

vielleicht hättest du dies auch am anfang, innerhalb einer halbwegs strukturierte frage erklären können. du wirfst mir hier lauter nasse schwämme zu, das macht keinen spaß.
natürlich kannst du eine excel instanz starten, und lesend / schreiben direkt auf die einzelnen zellen zugreifen, ist aber für deine zwecke wahrscheinlich gar nicht nötig.
per import/verknüpfung kannst du, wie gesagt direkt zugreifen. diese definitionen lassen sich speichern, per vba aufrufen und selbstverständlich auch paramater -z.b. dateinamen- übergeben. ggf. auch per open-save dialog (explorer-fenster) und so weiter.
dies setzt nur vorraus, das JEWEILS die 3 datenquellen von der struktur her gleich bleiben.
du erfindest jetzt gerade das rad neu, weil du die schon vorhandenen access funktionalitäten nicht nutzt.

gruß,
seaslug

This post has been edited 2 times, last edit by "seaslug" (Apr 11th 2014, 4:29am)

Similar threads