Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
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
Datenbankabfrage (Access) via VBA Excel
21.07.2021 09:17:46
Nep
Hallo Leute,
ich habe ein Problem, und zwar ich bearbeite in meiner Excel die Daten einer Datenbankabfrage für mich. Also ich habe nur die Lesende Berechtigung auf die Datenbank und importiere mir das ganze in Excel um es zu bearbeiten.
Ich führe immer eine Aktualisierung in der Woche durch und hänge die neuen Daten unten an meine Liste dran. Hat jemand für diesen Weg auch eine VBA Lösung?
Mein Dateipfad ist: C:\Users\j7192\Desktop\Master\Excel
Dateiname für Access: Excel_Abfrage.accdb
Dateiname Excel: CAT.xlsm
Liebe Grüße
Nep

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datenbankabfrage (Access) via VBA Excel
21.07.2021 11:06:35
Yal
Hallo Nep,
Vorstufe zum aufwändigem VBA wäre die Nutzung von Power Query:
Im Menü "Daten", "Aus Access". Access-Datei und Datentabelle auswählen. Fertig.
Aktualisierung geht mit Alt+F5 oder Rechtsklick "Aktualisieren".
VG
Yal
DAS ist vielleicht besser als VBA! owT
21.07.2021 11:19:02
Oberschlumpf
AW: Datenbankabfrage (Access) via VBA Excel
21.07.2021 11:18:11
Oberschlumpf
Hi,
ich nutze MS Access auch in Verbindung mit Excel.
Access = Datenbank mit über 60.000 Datensätzen
Excel = schönere Ansichten (Tabellen, Userforms, usw) als in Access
Vielleicht kann ich dir helfen.
Dazu müsstest du uns aber per Upload Beispiel-Dateien von der Accessdatei und von der Exceldatei zeigen.
Ja, ich weiß, auf die AccDB hast du nur Leserecht.
Macht ja nix.
Erstell selbst eine Accessdatei, die aber vom Aufbau (Datenfelder, Datentypen, etc) mit dem Original identisch ist.
Wieviele Datensätze enthält die Originaldatei?
Vom Prinzip her könnte das Ganze mit VBA so aussehen:

Sub test()
Dim ldbMDB As Database
Dim lrsMDB As Recordset
Dim lstrAbfrage As String
lstrAbfrage = "SELECT datenfeld1,datenfeld2,datenfeld3,... FROM tabellenname WHERE datenfeld1 IS NOT NULL"
Set ldbMDB = OpenDatabase("Pfad\Excel_Abfrage.accdb")
Set lrsMDB = ldbMP3.OpenRecordset(abfragetxt, dbOpenSnapshot)
lrsMDB.MoveFirst
Do While Not lrsMP3.EOF
'ab hier steht alles an Code, was mit den einzelnen Datensätzen (Datenfeldern) aus der MDB passieren soll
lrsMP3.MoveNext
Loop
End Sub
Anstelle von datenfeld1 usw müssen natürlich die verwendeten Namen der Datenfelder eingetragen werden.
Anstelle von tabellenname muss natürlich der Name der Tabelle eingetragen werden, auf die du in der MDB zugreifen willst.
Aber....
....wie gesagt, bevor es (vielleicht) richtig losgehen kann, benötigen wir von dir per Upload die Bsp-Dateien.
Ciao
Thorsten
Anzeige
AW: Datenbankabfrage (Access) via VBA Excel
21.07.2021 15:20:25
ChrisL
Hi Nep
Das Problem besteht nach meinem Verständnis darin zu ermitteln, welche Datensätze neu hinzugekommen sind. (Update von bestehenden Datensätze blende ich aus)
1.
Bevorzugt bringst du dich gar nicht erst in solch eine Situation d.h. die Bearbeitung erfolgt ausschliesslich in der Quelle.
2.
Wenn die Quellbearbeitung nicht geht (z.B. externe Quelle ohne Zugriff), dann sollten die Quelldaten unangetastet bleiben. Allfällige Daten-Ergänzungen erfolgen in einer separaten Tabelle und bei Bedarf werden die Ergänzung abschliessend mit den Quelldaten verbunden (z.B. über einen Primärschlüssel wie z.B. Kundennummer).
3.
Wenn obiges nicht geht und keine Bearbeitung von bestehenden Datensätzen stattfindet, dann kannst du ein Vorgehen wie von dir angedacht in Erwägung ziehen. Im Idealfall erfolgt der selektive Import dann über einen Timestamp (Datum-/Zeitangabe) des letzten Updates. D.h. du selektierst nur diejenigen Daten aus der Access-DB, welche neueren Datums sind.
4.
Wenn du keinen Zeitstempel zur Verfügung hast, dann benötigt es mindestens eine eindeutige Nummer für den Abgleich von neuen und bestehenden Datensätzen. Da Daten über 2 verschiedene DB's abgeglichen werden müssen, müssten die Daten entweder Zeilenweise abgeglichen werden oder alle Daten müssen zum Vergleich in eine gemeinsame DB kopiert werden.
Für grosse Datenmengen ist das Vorgehen somit ungeeignet.
Weil ich grad Zeit und Lust hatte, habe ich für Variante 4 einen Muster-Code erstellt. Aufbau:
Access-DB, Tabelle 1:
Spalte 1: ID (= eindeutige Nummer/Ganzzahl)
Spalte 2: MyName (= kurzer Text)
Excel:
Tabelle1 zur Bearbeitung (Zeile 1 hat Titel: ID;MyName)
Tabelle2 zur temporären Verwendung, kann ausgeblendet werden (Zeile 1 hat Titel: ID;MyName)
Vorgehen:
- Die ganze Tabelle1 aus Access wird nach Excel Tabelle2 kopiert
- Access wird geschlossen
- Anhand der Spalte ID erfolgt innerhalb Excel ein Vergleich von Tabelle1 (Arbeitstabelle) und Tabelle2 (Access-Kopie). neue Datensätze aus Tabelle2 werden unten an Tabelle1 angefügt
- Der Inhalt der temporären Excel-Tabelle2 wird wieder gelöscht

' Voraussetzung ist, dass in Tabelle1 und Tabelle2 jeweils in Zeile 1 die Titel (Datenfelder) bezeichnet sind
' Die beiden Tabellen müssen ein DB-Format aufweisen (keine verbundenen Zellen, Verzierungen, Schnickschnack etc.)
' Die Tabelle enthält 2 Datenfelder (Spalten): ID = eindeutige Nummmer, MyName = Text
' Es werden lediglich neu hinzukommende Datensätze (Zeilen) ergänzt, nicht aber bestehende Datensätze aktualisiert
Sub Abgleich()
Dim objCon As Object, objRS As Object, strSQL As String
' Verbindungsstring (je nach Excel-Version unterschiedlich)
Const strConnection As String = "Provider=Microsoft.ACE.OLEDB.16.0;Data Source="
' Pfad der aktuellen Excel-Datei inkl. Erweiterung
Dim strPfadXL As String: strPfadXL = ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
' auf Tabelle1 findet die Bearbeitung statt und neue Datensätze werden ergänzt
Const strTB1 As String = "Tabelle1"
' auf Tabelle2 erfolgt temporär ein Import der ganzen Access-DB
Const strTB2 As String = "Tabelle2"
' Pfad der Access-DB
Const strPfadDB As String = "C:\Users\j7192\Desktop\Master\Excel\Excel_Abfrage.accdb"
' Name der Tabelle innerhalb der Access-DB
Const strTB3 As String = "Tabelle1"
' ADODB-Verbindung erstellt
Set objCon = CreateObject("ADODB.Connection")
' Access-DB öffnen resp. Verbindung herstellen
objCon.Open strConnection & strPfadDB
' SQL-Statement definieren
strSQL = "SELECT * FROM " & strTB3
' sämtliche Datensätze holen
Set objRS = objCon.Execute(strSQL)
' alle Daten in Excel-TB 2 einfügen
Worksheets(strTB2).Range("A2").CopyFromRecordset objRS
' Datensatz und Verbindung schliessen
objRS.Close
objCon.Close
' aktuelle Exceldatei öffnen resp. Verbindung herstellen
objCon.Open strConnection & strPfadXL
' SQL Statement definieren
' Muster ANTI JOIN:
'strSQL = "SELECT Tabelle2.ID, Tabelle2.MyName FROM Tabelle2 LEFT JOIN Tabelle1 ON Tabelle1.ID = Tabelle2.ID WHERE Tabelle1.ID IS NULL;"
strSQL = "SELECT [" & strTB2 & "$].[ID],[" & strTB2 & "$].[MyName] FROM [" & strTB2 & "$] LEFT JOIN [" & strTB1 & "$] ON [" & _
strTB1 & "$].[ID] = [" & strTB2 & "$].[ID] WHERE [" & strTB1 & "$].[ID] IS NULL;"
' neue Datensätze holen
Set objRS = objCon.Execute(strSQL)
' neue Datensätze unten an Tabelle1 anfügen
Worksheets(strTB1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).CopyFromRecordset objRS
' temporäre Tabelle2 wieder löschen
Worksheets(strTB2).Rows("2:" & Rows.Count).Delete
' Verbindungen schliessen, Variablen zurücksetzen
objRS.Close
objCon.Close
Set objRS = Nothing
Set objCon = Nothing
End Sub
cu
Chris
Anzeige

173 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige