Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1656to1660
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

per VBA mit Excel in Accesdatenbank schreiben

per VBA mit Excel in Accesdatenbank schreiben
16.11.2018 12:34:57
Werner
Hallo liebe Experten,
da ich neu auf dem Gebiet bin, benötige ich euer Wissen.
ich habe eine Exceltabelle mit ca. 30 Spalten und unterschiedlich vielen Zeilen.
In jeder Zeile ein Datensatz.
Nun möchte ich diese Datensätze in eine AccessDatenbank schreiben, aber nur wenn dieser Datensatz noch nicht vorhanden ist, wenn vorhanden dann soll die Zeie übersprungen werden.
Für eure Hilfe bin ich sehr dankbar

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

Betreff
Datum
Anwender
Anzeige
AW: per VBA mit Excel in Accesdatenbank schreiben
16.11.2018 15:05:34
JoWE
Hallo Werner,
welche Access-Version?
Gibt es einen Primärschlüssel oder was macht Deine Datensätze eindeutig?
Kannst Du die Datenbank und Deine Excel-Arbeitsmappe hochladen?
Denk-Ansatz - Prüfung ob Datensatz vorhanden:
https://www.herber.de/forum/archiv/1616to1620/1616348_Vba_Excel_Check_ob_Datensatz_in_Access_vorhanden.html
Denk-Ansatz - Daten in Access-Tabelle anfügen
https://www.herber.de/forum/archiv/488to492/489472_Daten_aus_Excel_in_Access_einfuegen.html
Gruß
Jochen
Anzeige
AW: per VBA mit Excel in Accesdatenbank schreiben
16.11.2018 19:36:13
Werner
Hallo,
es gibt nur in der Datenbank einen Primärschlüssel,
es sollten die ersten 5 Spalten geprüft werden und nur wenn alle 5 gleich sind dann überspringen
Die Exceldatei und Datenbank hänge ich als zip an.
https://www.herber.de/bbs/user/125445.zip
AW: per VBA mit Excel in Accesdatenbank schreiben
18.11.2018 09:54:21
JoWE
Moin Werner,
schwierig!
Man müsste aus den 5 Zellen der Excelzeile per Verkettung einen String (z.B. strXL) bilden.
Dann einen Recordset von der Access-Tabelle erstellen und komplett durchlaufen. Wobei auch hier von jedem Datensatz durch Verkettung der entsprechenden 5 Datenfelder einen String str(DB) zu bilden wäre, der mit dem strXL zu vergleichen wäre. Sind die Strings identisch, kann das Gleiche für die nächste Excelzeile passieren. Findet der Durchlauf des Recordsets keinen identischen String kann der Datensatz angefügt werden und dann geht's auch hier mit der nächsten Excelzeile weiter.
Das ist extrem aufwändig! Daher ist zu überlegen ob sinnvoll wäre, die Datensätze zunächst einmal anzufügen und dann mit einer Duplikatsabfrage und anschließender Löschabfrage die Duplikate aus der Accesstabelle zu entfernen.
Siehe:
https://support.office.com/de-de/article/löschen-von-doppelten-datensätzen-mithilfe-einer-abfrage-4e6c3183-689c-439d-9062-326c85d80a83
Gruß
Jochen
Anzeige
AW: per VBA mit Excel in Accesdatenbank schreiben
19.11.2018 07:08:01
Werner
Guten Morgen Jochen,
die Option mit Duplikate löschen kommt wohl eher nicht in Frage, da es sein kann dass ein Datensatz in einem Feld geändert wird.
Die Option mit den Vergleichen der Datensätze gefällt mir eigentlich ganz gut.
Nur reichen meine Kenntnisse leider nicht aus :-(
Ist es dir möglich evtl. ein paar Zeilen zu schreiben, welche ich mir dann anpassen würde?
Gruß aus der Oberpfalz
Werner
AW: per VBA mit Excel in Accesdatenbank schreiben
19.11.2018 16:18:58
JoWE
Hallo Werner,
ich hab's mal probiert:
Public jn As Boolean
Sub Aufruf()
' Beispielaufruf - Argumente
' 1) Pfad Excel-Arbeitsmappe
' 2) Pfad Access-Datenbank
' 3) Quell-Arbeitsblatt 1
' 4) Ziel-Tabelle 1
' bei Bedarf beliebige Paare ergänzen
' 5) Quell-Arbeitsblatt 2
' 6) Ziel-Tabelle 2
Call ExportToAccess1( _
ActiveWorkbook.Path & "\Erfassung mit Datenbank.xlsm", _
ActiveWorkbook.Path & "\Daten.mdb", _
"Schichten", "Schichten")
End Sub
Sub ExportToAccess1(strXLS As String, strMDB As String, ParamArray strTabellen() As Variant)
' Das erste Argument ist hier verzichtbar, könnte aber verwendet werden, die Arbeitsblätter
' einer zusätzlichen Arbeitsmappe zu exportieren (Eröffnung einer zusätzlichen Instanz -
' hier nicht enthalten)
' Verweis auf Microsoft DAO 3.6 Object Library
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sh As Worksheet
Dim i As Long
Dim j As Long
Dim k As Long
Dim strXL As String
Set db = OpenDatabase(strMDB)
For i = 0 To UBound(strTabellen) - 1 Step 2
Set rs = db.OpenRecordset(strTabellen(i + 1))
Set sh = ActiveWorkbook.Worksheets(strTabellen(i))
' Accesstabelle leeren
'Do While Not rs.EOF
'   rs.Delete
'   rs.MoveNext
'Loop
' Datensätze anfügen
For j = 2 To sh.Cells(Cells.Rows.Count, 1).End(xlUp).Row
strXL = "|" & Cells(j, 2).Value & "|" & Format(Cells(j, 3), "DD.MM.YYYY") & "|" & _
Format(Cells(j, 4), "hh:mm:ss") & "|" & Format(Cells(j, 5), "DD.MM.YYYY") & "|" & _
Format(Cells(j, 6), "hh:mm:ss")
Call checkDS(strXL)
rs.AddNew
' Feld rs(0) enthält ID (Autowert) und wird in der Schleife ausgelassen
For k = 1 To rs.Fields.Count - 1
rs(k) = sh.Cells(j, k)
Next k
rs.Update
Next j
rs.Close
Next i
db.Close
Set rs = Nothing
Set sh = Nothing
Set db = Nothing
'   Sheets("Schichten").Unprotect
'   Sheets("Schichten").UsedRange.ClearContents
End Sub
'Const strFileName As String = "C:\Users\Jochen\Downloads\herber\Daten.mdb"
Sub checkDS(strXL As String)
Dim rcsEntry As Object
Dim objConn As Object
On Error GoTo Fin
Set objConn = CreateObject("ADODB.Connection")
Set rcsEntry = CreateObject("ADODB.Recordset")
With objConn
.CursorLocation = 3 ' = adUseClient
' "Microsoft.Jet.OLEDB.4.0"
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Data Source") = "C:\Users\Jochen\Downloads\herber\Daten.mdb"
.Open
End With
With rcsEntry
.ActiveConnection = objConn
.CursorLocation = 3 ' = adUseClient
.LockType = 3 ' = adLockOptimistic
.CursorType = 1 ' = adOpenKeyset
' Name ist die Bezeichnung der Tabelle
.Source = "SELECT * FROM Schichten"
.Open
If .RecordCount  0 Then
.MoveFirst
End If
ze = 7
Do Until .EOF
For f = 2 To 6
'Cells(ze, 2).Value = Cells(ze, 2).Value & "|" & .Fields(f).Value
strDB = strDB & "|" & .Fields(f).Value
Next
If strDB = strXL Then
jn = True
Exit Sub
Else
jn = False
End If
ze = ze + 1
.MoveNext
Loop
End With
Fin:
If Err.Number  0 Then MsgBox "Fehler: " & _
Err.Number & " (" & Err.Description & ")"
If Not objConn Is Nothing And objConn.State = 1 Then objConn.Close
Set rcsEntry = Nothing
Set objConn = Nothing
End Sub
Gruß
Jochen
Anzeige
AW: per VBA mit Excel in Accesdatenbank schreiben
19.11.2018 17:44:46
JoWE
…noch was vergessen; hier:
Call checkDS(strXL)
if jn = false then
rs.AddNew
' Feld rs(0) enthält ID (Autowert) und wird in der Schleife ausgelassen
For k = 1 To rs.Fields.Count - 1
rs(k) = sh.Cells(j, k)
Next k
rs.Update
end if
Gruß
Jochen
AW: per VBA mit Excel in Accesdatenbank schreiben
20.11.2018 11:11:06
Werner
Hallo Jochen,
verstehe ich das richtig?
Dein Nachtrag soll nach "Call checkDS(strXL)" eingefügt werden?
Dann werden aber alle einträge doppelt in der Datenbank.
Sorry für meine "dummen" Fragen, aber bin auf diesem Gebiet absoluter Neuling.
Gruß Werner
AW: per VBA mit Excel in Accesdatenbank schreiben
20.11.2018 12:13:39
JoWE
ja, der Nachtrag kommt dahin!
Und nein, "jn" ist ja nur false wenn der Datensatz nicht in der Datenbank vorhanden ist.
Anzeige
AW: per VBA mit Excel in Accesdatenbank schreiben
20.11.2018 16:42:43
Werner
Hallo Jochen,
erst mal vielen Dank für deine Mühe!
Hab es noch mal getestet, funktioniert solange alle Einträge in Excel und DB gleich sind.
Wenn in Excel ein Eintrag mehr ist trägt er alte nochmals ein.
Gruß Werner
AW: per VBA mit Excel in Accesdatenbank schreiben
20.11.2018 19:06:26
JoWE
schade, leider krieg ich die DAO360.dll unter meiner Office-Version nicht ans laufen.
Kann den Fehler also nicht nachvollziehen.
Du solltest Dein Prob vllt. in einem Access-Forum zur Diskussion stellen.
Gruß
Jochen

308 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige