Das ist schon mal super, aber....
18.10.2007 11:19:52
Kasimir
Hallo Luschi,
danke Dir für Deine Antwort. Deine Beispieldateien haben mir enorm weiter geholfen. Ich habe das nun mal versucht auf meine DB abzuändern. Das Importieren der Daten funktioniert. Nur beim Exportieren nach Access hakt es noch. Ich habe das Makro zum Exportieren insoweit abgeändert, das ich in der Zeile, in der es um das Suchen in der Accestabelle geht, etwas gelöscht habe, da mein Typ der Spalte nicht Text, sondern Zahl ist. Nachfolgend mal das Makro, wie es im Moment aussieht.
Sub ExportToAccess()
Dim xRows As Long
xRows = 434
'xRows: Anzahl der Zeilen in der Excel-Tabelle
'alle Datensätze in der Exceltabelle, die in der Spalte 'A' mit blauer _
Schrift formatiert sind, werden in die Access-DB zurückgeschrieben
'mit dem Save-Button wird diese Formatierung erzeugt _
'Nach dem Zurückschreiben in die Access-DB wird die schriftfarbe wieder auf schwarz gesetzt
Dim Cnn As ADODB.Connection, _
cmd As ADODB.Command, _
Rs As New ADODB.Recordset
Dim rg1 As Range, rg2 As Range, _
rs1 As ADODB.Recordset
Dim Master As Workbook, _
j As Integer, i As Integer, _
db_Path As String, db_MDB As String, db_View_dummy As String, _
sqlText As String, mdb_Table As String, xls_Table As String, _
s1 As Integer, s2 As Integer, s3 As String, s4 As String, s5 As String, _
_
ok As Boolean, vw As Object
Dim d1 As Date, d2 As Date
'bestimmte Applications-Eigenschaften abschalten, damit es schneller geht
GetMoreSpeed True
Set Master = ThisWorkbook
db_Path = Master.Path & "\"
db_MDB = "Lauf2006_Fichtelgebirgsmarathon.mdb"
'da Database in Access & ADODB ein schütztes Objekt-Wort ist, habe ich den Namen umbenannt
mdb_Table = "Teilnehmer"
xls_Table = "Data"
'Tabellenbereich in der Exceltabelle'
Set rg1 = Master.Worksheets(xls_Table).Range("A2:A" & xRows)
''Verbindung zur DB
Set Cnn = New ADODB.Connection
Cnn.Open "Provider =Microsoft.Jet.OLEDB.4.0; Data Source = " & db_Path & db_MDB & ";"
Rs.Open mdb_Table, Cnn, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
For Each rg2 In rg1
'Erkennungszeichen für 1 gespeicherten DS in der Exceltabelle
If rg2.Font.ColorIndex = 5 Then 'blaue Schrift
MsgBox "OK"
s1 = rg2.Value
'Suchstring erstellen
s2 = s1
'Suchen in de Accesstabelle
Rs.Find s2
If (Rs.BOF Or Rs.EOF) Then
'DS nicht gefunden
Rs.AddNew
ok = True
Else
''Rs.Edit
''nur in DAO erforderlich, nicht mit ADODB
ok = False
End If
Call writeIntoAccess(Rs, rg2, ok)
Rs.Update
End If
Next rg2
''alle Objekte-Variablen schließen bzw. Zeiger entfernen
Rs.Close
Set Rs = Nothing
Set cmd = Nothing
Cnn.Close
Set Cnn = Nothing
'Farbe Spalte "A" in Exceltabelle auf 'schwarz setzen
rg1.Font.ColorIndex = 0
Set Master = Nothing
Set rg1 = Nothing
GetMoreSpeed False
End Sub
Wie Du sehen kannst, habe ich die Typen für die Variablen s1 und s2 als Integer, da ja bei mir Zahl, deklariert. Leider bleibt das Makro in der Zeile
Rs.Find s2
hängen. Es kommt der Laufzeitfehler 3001: Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereichs oder sind miteinander unvereinbar.
Nur kurz ein paar Angaben zur momentanen Tabelle. Es befinden sich in 433 Zeilen Datensätze mit unterschiedlichen Nummern in Spalte A. Die letzte Nummer in Spalte A ist die Zahl 493. Ich habe nun darunter einen neuen Datensatz angelegt mit der Nummer 494 in Spalte A und habe bei dieser Nummer die Schriftfarbe in blau geändert.
In der Datenbank steht in der letzten Zeile, also in der, in der dieser Datensatz eingefügt werden soll, die Zahl 0. Bei Deiner Beispieldatenbank steht dort ja nichts. Hat das eventuell damit zu tun?
Hoffe, Du kannst mit meinem geschriebenen etwas anfangen. Wenn nicht, einfach nochmal nachfragen und ich versuche den nicht verständlichen Part etwas besser zu beschreiben.
Übrigens verknüpfte Tabellen kommen nicht mit ins Spiel, wenn ich es nach Deinem Beispiel erledigen kann. Das hatte ich nur mal versucht, aber es scheiterte ja daran, dass ich dann in der Datenbank keine Datensätze mehr neu anlegen oder ändern kann, was aber zusätzlich funktionieren (es gibt dafür diverse Formulare in der DB) soll.
Danke nochmal für die Hilfe und Gruß,
Kasimir