Access und VBA

Access ist toll, kann alles & tut alles

aber mit VBA soll das noch toller sein
wie kann man per VBA auf bestimmte Tabellenelemente zugreifen
gibt es möglichkeiten variablen global zu behalten?
gibt es irgendwo ein „normaldeutsches tutorial für VBA und ACCESS?“

fragen die mich bewegen und ihr hoffentlich beantwortet

Hallo, Mathias!

Access ist toll, kann alles & tut alles

Na ja. Dazu sage ich mal nix…

aber mit VBA soll das noch toller sein

Hmmm…

wie kann man per VBA auf bestimmte Tabellenelemente zugreifen

Auf welche? Felder oder Datensätze? Wie zugreifen?
Relevante Kapitel/Stichworte wären:

  • TableDefs-Auflistung, Fields-Auflistung, die entsprechenden Objekte und deren Eigenschaften und Methoden.
  • Zum Auslesen/setzen: Recordset-Objekt, DLookup/DMax/D…-Funktionen, DoCmd.RunSql

gibt es möglichkeiten variablen global zu behalten?

Selbstverfreilich: Definition in einem globalen Modul als
Global variable As Typ

gibt es irgendwo ein „normaldeutsches tutorial für VBA und
ACCESS?“

Derer viele. Wie fit bist Du denn in „normalem“ VB? Die DB/Access-spezifischen Ergänzungen (DLookup) für VBA gehen dann relativ leicht. Der Datenbankzugriff über Recordsets etc. sollte auch in der Literatur zu VB beschrieben sein.
Empfehlen kann ich gerade keins. Hier sollten aber solche Links rumturnen (zur Not im Forum VB, wie gesagt: Adaption auf DB ist dann auch kein Problem).

fragen die mich bewegen und ihr hoffentlich beantwortet

Hoffe, es hilft ein wenig weiter.

Gruß, Manfred

Hallo, Manfred!

Frage 2 & 3 sind durch,Danke!

so sieht das Problem zu Frage 1 aus:

Ich habe eine Tabelle mit dem Namen „Global“
in dieser Tabelle gibt es eine Spalte Zählung
wie kann ich

a) den Wert von Zeile x in Variable y speichern

b) wenn ich den wert in der ersten Zeile mit folgender methode setzen will produziert Access Fehlermeldungen

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(„Global“, dbOpenTable)
rs![Zählung] = 1

Die Microsoft-Hilfe ist keine Hilfe!

Hallo, Mathias!

Ich habe eine Tabelle mit dem Namen „Global“
in dieser Tabelle gibt es eine Spalte Zählung
wie kann ich
a) den Wert von Zeile x in Variable y speichern

Was hast Du genau vor?

b) wenn ich den wert in der ersten Zeile mit folgender methode
setzen will produziert Access Fehlermeldungen

Dim rs As Recordset

Der Fehler ist beim dbOpenTable; Du musst das Recordset zum ändern als dbOpenDynaset öffnen, dann kannst Du auch was zuweisen:

Set rs = CurrentDb.OpenRecordset(„Global“, dbOpenDynaset)
rs![Zählung] = 1

Sollte dann funktionieren.

Öffnen mit dbOpenSnapshot lässt keine Änderungen zu, ist aber schneller, wenn Du nur was lesen willst.

Analog kannst Du mit

y = rs(„Zählung“) den Wert in eine (bitte typ-konforme) Variable y schreiben. rs(„Feld“) ist übrigens äquivalent zu Deiner Schreibweise.

Gruß, Manfred

Hallo, Manfred!

Was hast Du genau vor?

Ich will die Weltherrschaft an mich reißen

Aber erst mal reicht es wohl die Datenbank zu Programmieren
Mein finaler Code:

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(„Global“, dbOpenDynaset)
rs(„Zählung“) = 1
rs.Update
rs.Close

Meine finale Fehlermeldung:

Laufzeitfehler ‚91‘:
Objektvariable oder With-Blockvariable nicht festgelegt

Also in die Hilfe gucken

Weitere Informationen erhalten Sie, wenn Sie das fragliche Element ::auswählen und F1 (unter Windows) oder HILFE (beim Macintosh) drücken.

in die nächste Hilfe gucken

Worksheets(1).Range („A2“).value=3.14159

Was haben wir gelernt

  1. -> Mac-User brauch wohl echt Hilfe wenn die schon ne eigene Taste dafür haben

  2. -> Selbst eindeutige Konstanten wie Pi lassen sich in Tabellen speichern

aber wie setze ich die „1“ in meine Tabelle??

P.S.:Sorry wegen der Ironie aber dieses Forum besteht ja nur, weil Microsoft so @$#! Hilfen schreibt

Um mal auf die Ausgangsfrage zurückzukommen:

Schau mal in Raphael Heins „Yaccess“ rein: http://www.yaccess.de/
Und dort speziell: http://www.yaccess.de/lernen.shtm

Ansonsten ist die Hilfe gar nicht so schlecht, wie immer wieder behauptet wird - wie bei allem: man muss halt damit umgehen können. Z.B. die interaktiven Möglichkeiten ausschöpfen, sich auch mal die Beispiele ansehen, auch mal unter „Siehe auch“ nachsehen usw.

Darüber hinaus geht nichts über ein gutes Buch. (Siehe z.B. diese meine Buchtipps: http://spotlight.de/zforen/amsa/m/amsa-1082824787-21…)

Und natürlich: ins DBWiki und die FAQ (http://www.donkarl.com) schauen - damit erübrigen sich viele Fragen von selbst!

Gruß aus dem Norden
Reinhard Kraasch

(http://www.dbwiki.de - das Datenbank-Wiki)

Hallo, Mathias!

Was hast Du genau vor?

Ich will die Weltherrschaft an mich reißen

Das wird mit MS nicht funktionieren. MS hat die Weltherrschaft schon und gibt sie nicht mehr her.

Aber erst mal reicht es wohl die Datenbank zu Programmieren
Mein finaler Code:

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(„Global“, dbOpenDynaset)

Hier musst Du noch sagen, dass Du ändern willst:

rs.Edit

rs(„Zählung“) = 1
rs.Update
rs.Close

So sollte es eigentlich laufen. Außer, die Tabelle ist sonstwie gesperrt und Du hast keine Zugriffsberechtigungen.

Meine finale Fehlermeldung:

Laufzeitfehler ‚91‘:
Objektvariable oder With-Blockvariable nicht festgelegt

Die sieht mir komisch aus. Sollte bei obigem Sniplet eigentlich nicht auftreten. Hatte aber ähnliche Probleme gehabt, wenn ich mit CurrentDb. geschafft habe. Abhilfe war: Eigenes DB-Objekt in der Prozedur, dann

Set dbMyDb = CurrentDb
Set rs = dbMyDb.OpenRecordset(…)
usw.

Zur Hilfe kann ich Dir wir auch dem Kollegen Reinhard Kraasch zustimmen: Die Hilfe taugt nur was, wenn man sich halbwegs auskennt. Dann komme ich damit recht gut klar.

Als Newbie hat man schlechte Karten. Und die Hilfe ist eben eine Hilfe, kein Tutorial.

Gruß, Manfred

Danke Rainer

ich habe es gefunden:
ein Access Tutorial in normaldeutsch

rs.Edit oder rs.AddNew
Hallo Mathias

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset(„Global“, dbOpenDynaset)

dbOpenTable hätte es auch getan… der Fehler liegt an anderer Stelle:
Wenn du die Tabelle öffnest, dann steht der Pointer auf dem ersten Datensatz - wenn einer vorhanden ist!
Welches der erste Datensatz ist, ist nicht immer eindeutig bestimmt (hängt u.a. davon ab, ob die Tabelle einen Primärschlüssel hat). Im „Normalfall“ würdest du die Tabelle z.B. sortiert öffnen (also durch eine SQL-Anweisung mit „ORDER BY“), oder dich durch die „Find“-Methode auf einen bestimmten Datensatz positionieren.
Wenn Du also jetzt diesen aktuellen Datensatz ändern möchtest, dann musst du dies erst einmal durch die „Edit“-Methode einleiten, also:

rs.Edit

Ist kein Datensatz vorhanden, oder möchtest du sowieso einen Datensatz hinzufügen, dann musst du dies durch die „AddNew“-Methode einleiten, also:

rs.AddNew

Dann kannst du so fortfahren, wie in deinem Beispiel.

rs(„Zählung“) = 1
rs.Update
rs.Close

BTW: rs![Zählung] = rs!Zählung = rs(„Zählung“)
Alle diese Anweisungen sind äquivalent. Welche du benutzen möchtest, bleibt dir überlassen. Die eckigen Klammern musst du verwenden, wenn dein Feldname z.B. eine Leestelle enthält.

P.S.:Sorry wegen der Ironie aber dieses Forum besteht ja nur,
weil Microsoft so @$#! Hilfen schreibt

Das Problem ist - wie meistens - dass du nicht weisst, wonach du suchen sollst. Das liegt aber nicht an dir - mir geht es da genauso - das liegt am Prinzip. Wenn man weiss, wonach man suchen muss, dann bietet die Access-Hilfe ausreichend Erklärungen und Beispiele.

Gruss
Peter

Ich brauche immer so lange zum Tippen
Oops, leider haben sich die Antworten überschnitten, weil ich immer sooo lange brauche, um meinen Text einzugeben.
Nichts für Ungut!

Gruss
p.

rs(„Zählung“) = 1
rs.Update
rs.Close

BTW: rs![Zählung] = rs!Zählung =
rs(„Zählung“)

ich weiß nicht, ob ich auf dem aktuellen Stand bin. Aber früher mußte das heißen: rs.Fields(„Zählung“) = 1
rs!Zählung könnte eventuell auch nicht funktionieren (Umlaut)

Gruß
Kiwi

Hallo Kiwi

BTW: rs![Zählung] = rs!Zählung = rs(„Zählung“)

ich weiß nicht, ob ich auf dem aktuellen Stand bin.

Ich weiss es auch nicht… weder von dir noch von mir :wink:

Aber früher mußte das heißen: rs.Fields(„Zählung“) = 1

Stimmt, das wäre dann die vierte Variante.
Was heisst „früher“? Ab 97 geht das mit und ohne „Fields“. Auf ältere Versionen habe ich keinen Zugriff mehr.

rs!Zählung könnte eventuell auch nicht funktionieren (Umlaut)

Ich denke, das geht. Probleme gibt’s bei Leerzeichen, Sonderzeichen und reservierten Worten.

Gruss
Peter

Hallo Peter

BTW: rs![Zählung] = rs!Zählung = rs(„Zählung“)

Aber früher mußte das heißen: rs.Fields(„Zählung“) = 1

Stimmt, das wäre dann die vierte Variante.
Was heisst „früher“? Ab 97 geht das mit und ohne „Fields“. Auf
ältere Versionen habe ich keinen Zugriff mehr.

ah ja, doch noch etwas dazugelernt.

rs!Zählung könnte eventuell auch nicht funktionieren (Umlaut)

Ich denke, das geht. Probleme gibt’s bei Leerzeichen,
Sonderzeichen und reservierten Worten.

stimmt, da war ich etwas zu schnell.
Gruß
Kiwi