Ich habe eine (Beispiel-)Datenbank mit den Feldern F1, F2, F3, … Fn und die Datensätze D1, D2, D3, … Die Tabelle ist momentan so mit Werten gefüllt, daß in den Spalten Fx unterschiedlich viele Werte eingetragen sind, z. B. so:
F1 F2 F3
D1 x x x
D2 x x x
D3 x x
D4 x x
D5 x
D6 x
Ich möchte nun aus einer bestimmten Spalte den jeweils letzten(!) Wert auslesen. (Ist natürlich abhängig von der aktuellen Sortierreihenfolge, aber das ist schon so sichergestellt). Einer meiner Codeschnipsel sieht so aus:
Sub test ()
set db = CurrentDb()
set tb = db.OpenRecordSet("Tabelle1")
' "Tabelle1" ist der Name einer existierenden Tabelle in der aktuellen Datenbank
tb.MoveLast
fn = "Spalte1"
' fn beliebiger Variablenname
' "Spalte1" Name einer Spalte in der Tabelle tb
ergebnis = tb(fn)
End Sub
Das funktioniert leider nur, wenn alle Spalten gleichmäßig gefüllt sind. Um zum gewünschten Ergebnis zu kommen, wollte ich nun noch einen Recordset einer Spalte bilden mit set fb = tb.OpenRecordSet(„Spalte2“) um dann irgendwie den letzen Wert dieses Recordsets auszulesen, aber schon diese Zuweisung funktioniert nicht. Ich bin blutiger VBA-Anfänger und habe keinen Plan, wie es weitergehen könnte. Ihr sicherlich, ich bin guter Hoffnung …
Ergebnis = db.OpenRecordSet(„Select F1 from Tabelle1 where F1
is not Null order by F1 desc“, dbopenSnapshot)(0)
Ich hab’s mal so umgesetzt wie ich es verstanden habe:
Sub test()
Dim ergebnis As Variant
Dim db As DAO.Database
Dim fn As Variant
Set db = CurrentDb()
Set tb = db.openrecordset(„Tab1“)
’ „Tab1“ ist der Name einer existierenden Tabelle in der aktuellen Datenbank
fn = „S3“
’ fn beliebiger Variablenname
’ „S3“ ist Name einer Spalte in der Tabelle tb
’ hier wird der Variablen fn ein Spaltenname direkt zugewiesen, das soll später im Programm erfolgen
ergebnis = db.openrecordset(fn, dbopensnapshot)(0)
’ MsgBox ergebnis
’ in ergebnis soll der Wert der letzten belegten Zeile aus Spalte S3 stehen
Set db = Nothing
End Sub
funktioniert aber leider auch nicht. Fehler in Zeile „ergebnis = …“. Er „findet Eingangstabelle oder Abfrage ‚S3‘ nicht“. Kann ich sogar nachvolziehen, da ich vermute, daß das Argument in db.openrecordset eine Tabelle sein muß (?).
Was habe ich an Deinem freundlichen Hinweis (für den ich mich erst mal bedanken möchte) evtl. mißverstanden?
Du hast etwas gründlich missverstanden (und meinen Code nicht
benutzt)
OK, hab’s jetzt verstanden und funktioniert nun auch. Jetzt kommt allerdings das „aber“ (und nun ahne ich, was Du mit der Befürchtung hinsichtlich „zukünftiger massiver Probleme“ gemeint haben könntest):
die Werte in den Spalten sollen Zahlen sein, die vom Programm automatisch hochgezählt werden. Also: das Programm „guckt“ in Spalte sowieso, welches der letze Eintrag ist (z. B. steht da eine „6“) und soll nun einen neuen Eintrag „7“ hinzufügen. Dazu muß ich erst mal wissen, welcher Wert der letzte ist (also das aktuelle Problem), um dann einen neuen (+1) Eintrag hinzuzufügen. Die vorliegende Lösung kann aber nur bei Werten 0 bis 9 funktionieren, da die Einträge offensichtlich als String interpretiert werden, wodurch die „10“ beim sortieren natürlich nicht erst nach der „9“ erscheint …
Hast Du da auch noch eine Idee? (Eigentlich trau ich mich schon gar nicht mehr zu fragen, aber Du hast ja ausdrücklich „feedback erwünscht“ - wofür ich sehr dankbar bin)
da ich mein Datenbankkonzept neu überarbeitet habe, ist die eingangs gestellte Frage inzwischen hinfällig. Es würde hier auch zu weit führen, das Gesamtproblem zu beschreiben.
Vielen Dank noch mal an alle, die sich bemüht haben.