Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
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
schreiben / lesen in Access-Datenbank
21.11.2019 09:56:38
Klaus
Hallo Forum,
ich habe eine Datei, mit der etwa 20 User gleichzeitig arbeiten sollen. Im Kern geht es darum, in einer Userform einen Barcode zu scannen welcher dann in einer Liste gespeichert wird. Der Code dahinter ist banal:
    With ScanArchiv
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(lRow, 1).Value = UF_Scan.TB_Barcode.Value
.Cells(lRow, 2).Value = UF_Scan.ListBox_Station.Value
.Cells(lRow, 3).Value = Now
.Cells(lRow, 3).NumberFormat = "m/d/yyyy h:mm"
.Cells(lRow, 4).Value = UF_Scan.TextBox_Comment.Value
End With
Die gemeinsam gespeicherten Daten brauche ich an den Arbeitsplätzen möglichst in Echtzeit.
Mein erster Versuch war es, den Zugriff auf die Datei in "Arbeitsmappe freigeben" für mehrere Benutzer zu erlauben. Das ist aber ganz spekakulär gescheitert, es gab ständig Fehler wie "Datei ist gesperrt von ..." und "Datei konnte nicht gespeichert werden", dadurch gingen Daten verloren oder waren unvollständig.
Mein zweiter Versuch (der jetzt live ist und auch funktioniert) ist ein wenig rustikal. Ich habe 20 identische Dateien erstellt, jeder User scannt in seine eigene Datei hinein. Auf einen Button "aktualisieren" habe ich ein Script gelegt, dass alle 19 anderen Dateien (schreibgeschützt) öffnet, den gesamten Inhalt des Blattes "ScanArchiv" unten an das eigene Scanarchiv anhängt, die Dateien wieder schließt und dann im eigenen ScanArchiv die Dublikate entfernt (der Code dazu - mit Test ob Dateinamen existieren und so weiter - ist zu lang um ihn hier zu posten. Ist auch nicht nötig, der funktioniert ja)
Das funktioniert, ist aber irgendwie nicht sehr elegant. Wenn 1.000 Barcodes im Archiv und einer zusätzlich gescannt sind, liest die Datei 19.001 Barcodes ein und löscht danach 19.000 wieder. Von der explodierenden UsedRange mal abgesehen fühlt sich das wie eine Holzhammermethode an, außerdem dauert das aktualisieren jedes Mal ein paar Minuten.
Daher meine Frage:
Kann ich aus mehreren Dateien gleichzeitig Datensätze per Makro in eine Access-Datenbank speichern, und kann ich eine Access-Datenbank auf Knopfdruck zurück in eine Exceldatei kopieren?
Falls ja, kann ich auch Formeln oder Formelergebnisse übergeben?
Ich habe leider noch nie mit Access gearbeitet, daher benötige ich da Hilfestellung um das umzusetzen.
Vielen Dank!
LG,
Klaus M.

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: schreiben / lesen in Access-Datenbank
21.11.2019 21:31:27
Dieter
Hallo Klaus,
die Verwendung von Access ist schon die richtige Idee. Es gibt sehr gute Verbindungen zwischen Excel und Access.
Ich schicke dir mal zur Demonstration eine Arbeitsmappe mit ein paar VBA-Programmen, die eine Datenbank aktualisieren.
Die Arbeitsmappe ergänzt beim Öffnen das Menü um das neue Register "Datenbankzugriff".
In diesem Register befinden sich 2 Menüs, die 2 unterschiedliche Möglichkeiten der Datenbankaktualisierung beinhalten.
https://www.herber.de/bbs/user/133364.xlsm
Die beiden in den Programmen verwendeten Datenbanken Testdatenbank (Original und BackUp) sind hier (accdb-Dateien sind hier ungezippt nicht erlaubt):
https://www.herber.de/bbs/user/133363.zip
Du kannst die Arbeitsmappe mit den Aktualisierungsprogrammen auf verschiedenen Rechnern installieren und von allen Rechnern kann gleichzeitig aktualisiert werden. Access managt etwaige Kollisionen.
Ein Beispiel für die Übernahme einer Tabelle einer Access-Datenbank in ein Tabellenblatt findest du in der folgenden Arbeitsmappe.
https://www.herber.de/bbs/user/133365.xlsm
Es wird die gleiche Datenbank benutzt wie oben.
Viele Grüße
Dieter
Anzeige
AW: schreiben / lesen in Access-Datenbank
22.11.2019 06:30:37
Klaus
Vielen Dank für deine Antwort, Dieter! Ich muss während der Arbeit die Zeit finden mir das in Ruhe anzusehen - denn zuhause habe ich kein Access. Du bekommst auf jedem Fall eine Rückmeldung von mir, es kann aber bis Montag oder Dienstag dauern.
Bis dahin ein angenehmes Wochenende!
LG,
Klaus M.
Access: Primärschlüssel?
22.11.2019 08:48:03
Klaus
Hallo Dieter und alle anderen,
bitte verzeiht dass ich hier jetzt Access fragen stelle - aber ich spreche es aus Excel heraus an, also ist es im Thema :-)
Dieter hat mir ein Beispielmakro geschickt, das funktioniert. Ich schreibe es gerade auf meine Bedürfnisse um, komme aber an dieser Stelle nicht weiter:
Set rs = New ADODB.Recordset
rs.Index = "Primärschlüssel"
Was ist denn ein ADODB.Recordset.Index? Und was muss ich hier angeben statt "Primärschlüssel"? Ich habe eine "blanke" Access Datenbank erstellt, meine erste Überschrift heisst "CRM" und in der ersten Spalte steht "ID".
rs.Index = "ID" sowie rs.Index = "CRM" habe ich ausprobiert, hat beides nicht geklappt.
Wer kennt sich mit Access aus und kann helfen?
LG,
Klaus M.
gesamtes Makro (von Dieter):
Option Explicit
Sub Neue_Artikel_hinzufügen_SQL()
Const pfad As String = "H:\access test"
Const dbName As String = "\ScanArchiv.accdb"
Const WSName As String = "ScanBox"
' Die in der Tabelle "Scanbox"
' aufgeführten Scans werden zur
' Access-Tabelle "ScanBox" hinzugefügt
Dim betrSätze As Long
Dim cmd As ADODB.Command
Dim con As ADODB.Connection
Dim datei As String
Dim rs As ADODB.Recordset
Dim sql As String
Const titel As String = "ScanBox hochladen"
Dim ws As Worksheet
Dim ze As Integer
datei = pfad & dbName
If Dir(datei) = "" Then
MsgBox "Datei '" & datei & "' existiert nicht!"
Exit Sub
End If
Set con = New ADODB.Connection
con.Open ConnectionString:= _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & datei & ";" & _
"Mode=Share Exclusive"
Set cmd = New ADODB.Command
cmd.ActiveConnection = con
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open Source:="ScanArchiv", _
ActiveConnection:=con, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
Set ws = ThisWorkbook.Worksheets(WSName)
rs.Index = "Primärschlüssel"
'Neue Scans hinzufügen
ze = 2
Do Until IsEmpty(ws.Cells(ze, 1))
sql = "INSERT INTO Artikel" & "(CRM, Station, Uhr, Datum, Aktivität, Redo) " & _
"VALUES(" & ws.Cells(ze, 1) & ", " & "'" & ws.Cells(ze, 2) & "'," & "'" & ws.Cells(ze, _
3) & "'," & ws.Cells(ze, 4) & "," & ws.Cells(ze, 5) & "," & ws.Cells(ze, 6) & ");"
cmd.CommandText = sql
cmd.Execute RecordsAffected:=betrSätze, _
Options:=adCmdText + adExecuteNoRecords
If betrSätze  1 Then
MsgBox "Fehler beim Einfügen von Satz " & "" & _
vbNewLine & betrSätze
GoTo Ende
End If
ze = ze + 1
Loop
'Fertigmeldung
MsgBox Prompt:=ze - 2 & " neue Scans der Datenbank " & _
"hinzugefügt.", _
Title:=titel
Ende:
Set cmd = Nothing
con.Close
Set con = Nothing
End Sub

Anzeige
AW: Access: Primärschlüssel?
22.11.2019 13:43:31
Klaus
In der nicht-SQL Version klappt es, venn ich "rs.Index" einfach ausklammere:
Option Explicit
Sub NewScanAccess(myCRM As Long, myStation As String, myUhr, myDatum, myAktivität As String,  _
myRedo As Boolean, myKommentar As String, myMonatsindex As String)
Const pfad As String = "H:\access test"
Const dbName As String = "\ScanArchiv.accdb"
' Die in der Tabelle "Scanbox"
' aufgeführten Scans werden zur
' Access-Tabelle "ScanBox" hinzugefügt
Dim con2 As ADODB.Connection
Dim datei As String
Dim rs As ADODB.Recordset
datei = pfad & dbName
If Dir(datei) = "" Then
MsgBox "Datei '" & datei & "' existiert nicht!"
Exit Sub
End If
Set con2 = New ADODB.Connection
con2.Open ConnectionString:= _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & datei & ";" & _
"Mode=Share Exclusive"
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseServer
rs.Open Source:="ScanArchiv", _
ActiveConnection:=con2, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
'rs.Index = "Primärschlüssel"
rs.AddNew
rs!CRM = myCRM
rs!Station = myStation
rs!Uhr = myUhr
rs!Datum = myDatum
rs!Aktivität = myAktivität
rs!Redo = myRedo
rs!Kommentar = myKommentar
rs!Monatsindex = myMonatsindex
rs!Code = myCRM & "#" & myStation
rs.Update
Ende:
rs.Close
Set rs = Nothing
con2.Close
Set con2 = Nothing
End Sub

Anzeige
AW: Access: Primärschlüssel?
22.11.2019 13:47:47
mmat
Hallo,
das ist eine äußerst schwierige Frage. Der Klick auf F1 verrät:
"Gibt einen Long-Wert zurück, der die Indexnummer des Objekts in der Auflistung ähnlicher Objekte darstellt."
Der Recordset-Index kann also keinesfalls mit einem String belegt werden. Der Text deutet desweiteren darauf hin, dass das Attribut schreibgeschützt sein könnte.
mein Tip: versuch mal die Zeile wegzulassen.
vg, MM
Mein
AW: schreiben / lesen in Access-Datenbank
22.11.2019 13:10:24
Thomas
Hallo Dieter,
ich möchte mich einfach nur bei dir für diese Dateien bedanken.
Ich werde diese mal für mich durch testen. Genau das richtige bei verregneten WE.
das sind ein paar Sachen drin die ich auch schon eine weile suche.
besten dank
mfg thomas
Anzeige
Hallo Thomas!
22.11.2019 13:42:24
Klaus
Hallo Thomas,
ich finds auch saugeil, was Dieter da "mal eben" zeigt. Ich arbeite jetzt seit nicht mal 8 Stunden mit der Access Datenbank und es geht alles rasend schnell - Excel kommt mir plötzlich plump und langsam vor.
LG,
Klaus
AW: Hallo Thomas!
22.11.2019 15:51:07
Dieter
Hallo Klaus, hallo Thomas,
vielen Dank für eure freundlichen Rückmeldungen.
Ich habe die Dateien aus meinem schon etwas älteren Bestand reaktiviert und ich versuche, mich da wieder so einigermaßen zu orientieren.
@Klaus
Zum Primärschlüssel schlage ich vor, es einmal mit
rs.Index = "PrimaryKey"
zu versuchen. Ich glaube, dass die Schreibweise abhängig ist von der Access-Version, in der die Datenbank erstellt wurde.
In Access kannst du prüfen, ob die Tabelle "ScanArchiv" einen Primärschlüssel hat.
Du stellst die Tabelle in der Entwurfsansicht dar (links einen Rechtsklick auf den Tabellennamen, Auswahl von "Entwurfsansicht").
In dem grauen Kästchen links neben dem Feld, welches der Primärschlüssel ist, ist ein kleines Schlüsselsymbol zu sehen.
Falls kein Schlüsselsymbol zu sehen ist, wählst du das gewünschte Schlüsselfeld aus und klickst dann im Menüband auf "Primärschlüssel".
Ich füge noch ein Analyseprogramm bei, welches die Schlüssel der verschiedenen Tabellen einer Datenbank auflistet. Vielleicht hilft das auch noch weiter.
https://www.herber.de/bbs/user/133379.xlsm
Ohne Prüfung, ob ein Satz mit dem Primärschlüssel schon vorhanden ist, erhälst du ggf. bei der Hinzufügung einen Laufzeitfehler.
Ich wünsche dir viel Erfolg mit dem Projekt.
Mit freundlichen Grüßen
Dieter
Anzeige
Hallo Dieter!
22.11.2019 22:04:01
Klaus
Danke für deine Wertvollen Tipps! Ich kann am Wochenende leider nichts machen - privat habe ich kein Access. Man, ich wünsche mir fast es wäre schon wieder Montag :-)
Ich melde mich bestimmt nochmal. Ich habe jetzt dutzende von Ideen, was ich mit Access alles einfacher machen könnte als mit Excel.
LG,
Klaus
Dieter, was trinkst du gerne?
26.11.2019 06:13:15
Klaus
Guten Morgen Dieter,
ich war gestern 10h im Büro und habe nur programmiert und mein Projekt auf Access umgestellt. Vielen Dank für deine vollständigen Beispielscripte, ohne die mir das nicht möglich gewesen wäre! Du hast gar keine Idee, wie sehr du meine Arbeit damit beschleunigt und verbessert hast.
Ich würde dir zum Dank gerne eine Flasche Rotwein oder ähnliches spendieren, das ist das mindeste. Da ich aber vermute dass du ebenfalls über ein vernünftiges Einkommen verfügst und um den komplizierten Adressaustausch zu vermeiden, werde ich stattdessen 25€ an das Projekt "Plan International" spenden und hoffe dass ist auch in deinem Sinne.
Vielen Dank nochmal!
LG,
Klaus M.
Anzeige
Natürlich alles, was Alkohol enthält
26.11.2019 22:23:25
Dieter
Hallo Klaus,
herzlichen Dank für diese tolle Rückmeldung.
Es freut mich natürlich, dass du den Beispielcode gebrauchen konntest.
Natürlich sind die Antworten hier im Forum völlig freiwillig und kostenlos.
Aber über deine Spende an das Kinderhilfswerk (ich musste erst mal googeln, was "Plan International" ist) freue ich mich natürlich ganz besonders. Ich finde das eine großartige Idee.
Ich wünsche dir weiter viel Erfolg mit Excel, VBA und jetzt auch Access.
Herzliche Grüße
Dieter
Hinweis fürs Archiv
27.11.2019 13:41:26
Klaus
Hinweise für das Archiv, falls in Zukunft jemand nach Access sucht und diesen Beitrag findet
rs.Index = "Primärschlüssel" wird bei englischem Access zu rs.Index = "PrimaryKey"
Der Verweis "Microsoft ActiveX Data Objects 2.5 Libary" muss in VBA aktiviert werden - es reicht nicht, einfach nur die Makros zu kopieren.

rs.Open Source:="Artikel", _
ActiveConnection:=con, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
"Artikel" ist hier der Access-Tabellenname! Dieser kann auch variabel gestaltet werden, genau wie das Quelle.Tabellenblatt. So sieht das Makro bei mir aus:

Const myDB As String = "Repair"        'DB-Tabellenname im Access
Const myTable As String = "Tabelle1"   'in dieser Tabelle stehen die Daten für Access
Sub Neue_Artikel_hinzufügen()
Set ws = Sheets(myTable)
rs.Open Source:=myDB, _
ActiveConnection:=con, _
CursorType:=adOpenStatic, _
LockType:=adLockPessimistic, _
Options:=adCmdTableDirect
End Sub
Mit den Hinweisen und Dieters Beispieltabellen sollte es jeder hinbekommen, eine Access Datenbank fernzusteuern. Viel Erfolg an alle im Archiv suchenden!
LG,
Klaus M.
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige