Access Formular neuer Datensatz nicht möglich

Du m�chtest in einem Endlosformular bestimmte Datens�tze (bzw. Felder) durch spezielle Formatierungen kennzeichnen. Wenn du eine solche Zuweisung (z.B. per Code oder Ausdruck mit irgendeiner Bedingung) versuchst, wird die Formatierung in allen Datens�tzen ge�ndert.

Ursache

Format-Einstellungen f�r Formulare werden in Access gemeinsam gespeichert und gelten daher f�r alle Datens�tze.

L�sung

Ab A00 l�sst sich das mit der Bedingten Formatierung einstellen. Dazu in der Entwurfsansicht des Formulares ein Steuerelement markieren und Men� Format/Bedingte Formatierung w�hlen. Die Einstellungen sind auch per VBA m�glich, s.zur FormatConditions-Eigenschaft.

M�glichkeiten in �lteren Access-Versionen:
Bei der Textfarbe k�nnen mit der Format-Einstellung 4 Zust�nde unterschieden und entsprechend eingef�rbt werden. s. Online-Hilfe unter "Format-Eigenschaft - Datentypen Zahl und W�hrung"

F�r die Hintergrundfarbe gibt es versch. Trixereien (hinterlegte Steuerelemente, formatf�llende Textzeichen, BMPs etc.) Ein kleines Beispiel k�nnt ihr hier downloaden colorend.zip (11 KB)

Bei Stephen Lebans gibt's L�sungen unter Verwendung von APIs:
http://www.lebans.com/formatbycriteria.htm

Bei Dev Ashish gibt's ein Beispiel f�r den aktuellen Datensatz: http://www.mvps.org/access/forms/frm0047.htm

nach oben

https://www.donkarl.com?FAQ4.2aktualisiert 2012-12-14

Problem

Der Bezug auf ein Feld oder eine Eigenschaft im Unterformular/-bericht funktioniert nicht.

L�sung

Die Syntax f�r den Bezug auf ein Steuerelement im Ufo lautet:

Forms![Hauptformular]![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]

"UFoSteuerelement_im_Hauptformular" ist dabei der Name des Steuerelementes, in dem sich das Unterformular befindet. Diese Bezeichnung steht in der Eigenschaft Name des Steuerelementes und muss nicht ident sein mit dem Namen des Formulares, das als Unterformular dient, also der Eigenschaft Herkunftsobjekt. Diese Verwechslung ist die h�ufigste Fehlerquelle bei Bez�gen.

Vom Hauptformular aus reicht:
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]

Um den Fokus auf ein Element im Ufo setzen zu k�nnen, oder z.B. die Methode GoToRecord im Ufo anwenden zu k�nnen, ist es notwendig, vorher den Fokus auf das Ufo-Steuerelement im Hauptformular zu setzen:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus

bzw.

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext

Analog funktioniert es mit Berichten. Lediglich "Forms" ist durch "Reports" zu ersetzen und "Form" durch "Report".

Syntaxbeispiele f�r alle m�gl. Varianten bei Dev Ashish:
http://www.mvps.org/access/forms/frm0031.htm

nach oben

https://www.donkarl.com?FAQ4.3aktualisiert 2021-10-25

Problem

Du m�chtest, wenn ein Datensatz in einem Formular ausgew�hlt wird, dass in einem anderen Formular der selbe Datensatz angezeigt wird.

L�sung

Angenommen, das eindeutige und zu vergleichende Feld in beiden Formularen hei�t "Id". Dann bei einem passenden Ereignis z. B. Beim Anzeigen des 1. Formulares:

Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id

Die Verwendung des Formular-Recordsets ist ab Access 2000 m�glich. In �lteren Versionen kann man mit dem RecordsetClone arbeiten. Ein Beispiel daf�r zeige ich hier: mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.4aktualisiert 2021-10-25

Problem

Du hast ein ungebundenes Text- oder Kombifeld z.B. "txtSuch". Nach Eingabe oder Auswahl eines Wertes z.B. einer RechnungsNr, m�chtest du, dass der Datensatz mit dieser RechnungsNr gefunden und angezeigt wird.

L�sung

Wenn dein Feld "RechnungsNr" im Formular sichtbar ist und den Fokus haben kann, dann kannst du beim Ereignis Nach Aktualisierung von "txtSuch" die FindRecord-Methode verwenden:

Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch

Ansonsten kannst du ebenfalls bei Nach Aktualisierung von "txtSuch" folgendes veranstalten:

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"

Die Verwendung des Formular-Recordsets ist ab Access 2000 m�glich. In �lteren Versionen kann man mit dem RecordsetClone arbeiten. Ein Beispiel daf�r zeige ich hier:
mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.5aktualisiert 2012-12-14

Problem

Du musst zur Aktualisierung der Daten ein Requery durchf�hren. Der Fokus geht dabei auf den 1. Datensatz des Formulares zur�ck. Du m�chtest aber beim vorher aktuellen Datensatz bleiben.

L�sung

Speichere die Id (ein eindeutiges Feld) des aktuellen Datensatzes. Dann kannst du nach dem Requery zur�ckkehren.

Dim lngStore As Long

lngStore = Me!Id

'Bildschirmflackern reduzieren
Me.Painting = False

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]0

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]1

nach oben

https://www.donkarl.com?FAQ4.6aktualisiert 2021-10-25

Problem

Du m�chtest ein Formular mehrfach aufrufen d.h mehrmals am Bildschirm haben um z.B. mehrere Datens�tze neben- und �bereinander darstellen zu k�nnen.

L�sung

Du kannst (ab A95) mehrere Instanzen eines Formulares �ffnen. Bissel Info dazu gibt's in der Online-Hilfe unter "Instanzen von Formularen".
z.B. schreibst du im Deklarationsbereich des Formularmoduls:

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]2

Bei einem passenden Ereignis machst du dann die 2. Instanz sichtbar und setzt sie an eine andere Stelle am Bildschirm, sonst liegt sie genau �ber der 1. Instanz:

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]3

s.a. KB-Artikel im Webarchiv

mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.7aktualisiert 2021-10-25

Problem

Du m�chtest die Sortierreihenfolge im Formular �ndern, ohne die Men�- oder Symbolleistenpunkte Aufsteigend/Absteigend Sortieren zu verwenden, sondern z.B. beim Klicken einer selbst erstellten Schaltfl�che.

L�sung

Entweder du bastelst dir einen SQL-String mit einer entsprechenden Order By-Klausel als Datenherkunft des Formulares oder du setzt die Formular-Eigenschaften OrderBy und OrderByOn mit VBA:

Beispiel mit SQL-String:

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]4

Wenn man nicht besonders SQL-erfahren ist oder bei komplizierteren Statements, ist es am einfachsten, eine Abfrage im Abfrageeditor von Access zu erzeugen und sich den SQL-Text dann aus der SQL-Ansicht des Abfrageentwurfs zu kopieren.

Das Sortieren durch �nderung der Datenherkunft ist i.d.R. die bessere Variante. Nicht nur, weil's professioneller wirkt, sondern auch weil Access bei Sortierung �ber die Formular-Eigenschaften (egal ob �ber die Benutzeroberfl�che oder per Code) die letzte Sortierung in der Sortiert nach-Eigenschaft fix speichert. Dennoch auch daf�r Beispiele:

'aufsteigend nach dem Feld Vorname sortieren
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]5

'absteigend
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]6

Access speichert die letzte Sortierung. Um sie beim n�chsten �ffnen des Formulares nicht anzuwenden, kann man im Ereigniscode beim �ffnen schreiben:
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]7

s.a. KB-Artikel im Webarchiv

mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.8aktualisiert 2021-10-25

Problem

Du m�chtest w�hrend der Laufzeit in einem Formular verschiedene Unterformulare im selben Unterformular-Steuerelement verwenden.

L�sung

Du kannst mit VBA die Eigenschaft Herkunftsobjekt des Ufo-Steuerelementes im Hauptformular (hier: "UFoElement") �ndern:

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]8

Wenn dadurch auch die Felder f�r die Verkn�pfung zwischen Haupt- und Unterformular anders hei�en, musst du die Eigenschaften Verkn�pfen von und Verkn�pfen nach des UFoElements �ndern:

Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo]9

Access verkn�pft automatisch �ber das Prim�rschl�sselfeld, sofern vorhanden. Wenn du bei einem Ufo-Wechsel nicht �ber ein vorhandenes Prim�rschl�sselfeld verkn�pfen willst, musst du vor dem Neuzuweisen der Verkn�pfungsfelder die Eigenschaften auf einen Leerstring setzen:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
0

mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.9

Problem

Du verwendest in A97 in einem PopUp-Formular Code, den der Assistent erstellt hat. Im Code befinden sich Befehle, die DoMenuItem verwenden z.B. Speichern, L�schen. Diese Befehle funktionieren nicht.

Ursache

In A97 funktioniert DoMenuItem nicht im PopUp, weil die Men�befehle auch per VBA in einem PopUp-Formular nicht zug�nglich sind. (in anderen Versionen sollte es funktionieren)

L�sung

Ersetze die DoMenuItem-Befehle durch RunCommands z.B.

Speichern des aktuellen Datensatzes: Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
1
L�schen des aktuellen Datensatzes: Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
2

Das Ersetzen der veralteten DoMenuItem-Befehle ist in jedem Fall ratsam. Sie werden nur noch aus Kompatibilit�tsgr�nden mitgeschleppt bzw. weil MS die Assistenten nie aktualisiert hat, und die RunCommand-Befehle sind wesentlich aussagekr�ftiger.

nach oben

https://www.donkarl.com?FAQ4.10aktualisiert 2021-10-25

Problem

Du m�chtest in der Formularansicht mit den Tasten PfeilAuf und PfeilAb den Datensatz wechseln, �hnlich wie das in der Datenblattansicht oder in Tabellen und Abfragen m�glich ist.

L�sung

Stelle die Eigenschaft Tastenvorschau des Formulares auf Ja ein. In das Ereignis Bei Taste Ab des Formulares kopierst du folgendes:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
3

mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.11

Problem

Du m�chtest den Wert aus einem berechneten Steuerelement in der Tabelle speichern, auf der das Formular basiert.

L�sung

Prinzipiell ist es keine gute Angewohnheit, einen berechneten Wert zu speichern. Zuerst solltest du dir also �berlegen, ob es wirklich n�tig ist, weil der Wert i.d.R. jederzeit wieder berechnet werden kann. Sinnvoll ist eine Speicherung evtl., wenn sich einzelne Faktoren im Lauf der Zeit �ndern k�nnen und du keine separate History-Tabelle f�hren willst, oder wenn die Formeln komplex sind und sich mit dem Speichern Performance gewinnen l�sst.

Du brauchst nat�rlich in der Tabelle ein Feld, das den Wert aufnimmt.
Dann kannst du entweder Nach Aktualisierung jedes der Felder, die zur Berechnung beitragen, oder Vor Aktualisierung des Formulares folgenden Code verwenden:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
4

nach oben

https://www.donkarl.com?FAQ4.12

Problem

Du m�chtest eine bestimmte Zeile in einem Kombinations- oder Listenfeld ausw�hlen oder z.B. die erste Zeile als Standardwert definieren, damit sie beim �ffnen eines Formulares ausgew�hlt ist.

L�sung

Schreib in die Ereignisprozedur Beim �ffnen des Formulares:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
5
oder
schreibe bei der Eigenschaft "Standardwert" des Kombis:
Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
6

Der Index von ItemData beginnt mit 0 = 1. Zeile, 1 = 2. Zeile etc.

nach oben

https://www.donkarl.com?FAQ4.13aktualisiert 2021-10-25

Problem

Du m�chtest zu den Eintr�gen in einem Kombinationsfeld einen neuen hinzuf�gen.

L�sung

Variante 1

Wenn du ohne Nachfrage den eingegebenen Wert in die Datenherkunft des Kombis �bernehmen willst, dann
- sortiere das Kombi nach dem Feld, dessen Wert eingegeben wird,
- setze die Eigenschaft Nur Listeneintr�ge auf Ja und
- verwende im Ereignis Bei nicht in Liste des Kombis Code wie diesen:

'************** CODE START **************
Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
7

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
8

Me![UFoSteuerelement_im_Hauptformular].SetFocus
Me![UFoSteuerelement_im_Hauptformular].Form![Steuerelement_im_Ufo].SetFocus
9
'************** CODE ENDE **************

Variante 2

Du m�chtest z.B. im Formular "frm_Rechnung" bei neuem Eintrag im Kombi "cbo_SuchKunde" (gebundene Spalte ist "KundenID") zuerst nachfragen, dann das Eingabeformular ("frm_NeuKunde") �ffnen, den im Kombi eingegebenen Kundennamen in das Eingabeformular �bernehmen, dort weitere Details eingeben, und danach im Kombi den neuen Wert anzeigen. Im Ereignis Bei nicht in Liste des Kombis:

'************** CODE START **************
Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
0
'************** CODE ENDE **************

Beim Schlie�en des Eingabeformulars:
Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
1

nach oben

https://www.donkarl.com?FAQ4.14

Problem

Du m�chtest die Auswahlliste eines Kombis �ffnen, ohne, dass der User auf den Button des Kombis dr�cken muss.

L�sung

Daf�r gibt es ab A95 eine eigene Methode namens Dropdown:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
2

In A2 musst du das noch mit Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
3 oder Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
4 machen, was nicht zu empfehlen ist, weil Sendkeys buggy ist.

nach oben

https://www.donkarl.com?FAQ4.15

Problem

Du m�chtest aus einem Listen- oder Kombinationsfeld den Wert einer Spalte �bernehmen, die nicht die gebundene Spalte ist.

L�sung

Verwende die Eigenschaft Column(Spalte).
Das Argument "Spalte" beginnt dabei mit 0 f�r die 1. Spalte zu z�hlen. Du kannst also z.B. den Wert aus der 2. Spalte eines Kombis in einem anderen Textfeld anzeigen, indem du als dessen Steuerelementinhalt schreibst:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
5

Soll der Wert der Spalte in einem anderen Feld gespeichert werden, dann kann per VBA z.B. im Ereignis Nach Aktualisierung des Kombis die Zuweisung erfolgen:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
6

nach oben

https://www.donkarl.com?FAQ4.16

Problem

Du m�chtest eine Spalte (i.d.R. Zahlen) in einem Listenfeld rechtsb�ndig ausrichten.

L�sung

Es gibt keine eingebaute Eigenschaft oder dergl. mit der sich das einstellen l�sst. Spalten in Listenfeldern werden immer linksb�ndig als Text ausgerichtet.
Ein altbekannter Workaround sieht so aus:
- Stelle f�r das Listenfeld eine nichtproportionale Schrift ein (z.B. eine der Courier-Schriften)
- Verwende eine Abfrage als Datensatzherkunft
- In der Abfrage schreibst du z.B. f�r ein Feld [Preis] folgenden Ausdruck

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
7

Dadurch wird ein Text mit 12 Zeichen erzeugt und vorne mit Leerzeichen aufgef�llt. Das Beispiel hier reicht f�r eine Zahl bis zu einfachen Millionenbetr�gen.

Eine weitere M�glichkeit ist die Verwendung von APIs. Die Sache funktioniert IMO ein bissel wackelig, aber du kannst dir den interessanten Versuch von Stephen Lebans dazu ansehen:
http://www.lebans.com/justicombo.htm

nach oben

https://www.donkarl.com?FAQ4.17

Problem

Du m�chtest auf das Wechseln der Registerseite reagieren und findest kein passendes Ereignis.

L�sung

Beim Wechseln der Seite z.B. mit Klick auf die Registerzunge, wird das Ereignis Bei �nderung des Registersteuerelementes ausgel�st. Dabei l�sst sich die Eigenschaft Seitenindex des Registers auslesen. Ist eh ident mit der Standardeigenschaft Value. Also einfach:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
8

nach oben

https://www.donkarl.com?FAQ4.18aktualisiert 2021-10-25

Problem

Du m�chtest vom letzten Feld der 1. Registerseite durch Dr�cken der TAB-, RETURN- oder DOWN-Taste in das erste Feld der 2. Seite gelangen.

L�sung

Schreib im Code Bei Taste Ab deines letzten Feldes auf der 1. Seite:

Me![UFoSteuerelement_im_Hauptformular].SetFocus
DoCmd.GoToRecord , , acNext
9

mein deutscher KB-Artikel dazu im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.19

Problem

Du m�chtest f�r eine Bedingung in Code oder in einem Ausdruck wissen, ob ein bestimmtes Formular ge�ffnet ist.

L�sung

Ab A00 gibt es f�r Access-Objekte die Eigenschaft IsLoaded:

Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id0

gibt True oder False zur�ck.

Alternativ und v.a. schon in A95 und A97 kann man SysCmd verwenden. Kopier dir dazu folgendes in ein Standardmodul:

Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id1

In VBA kannst du dann abfragen, ob das Formular ge�ffnet ist z.B.:
Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id2

In Ausdr�cken an der Access-Oberfl�che z.B. in der Bedingungsspalte eines Makros kannst du schreiben:
Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id3

nach oben

https://www.donkarl.com?FAQ4.20

Problem

Du m�chtest die aktuelle Aufl�sung des Bildschirmes ermitteln.

L�sung

Kopiere dir folgendes in den Deklarationsbereich eines Standardmoduls:

Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id4

Aufruf dann z.B. �ber eine Funktion wie:

Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id5

nach oben

https://www.donkarl.com?FAQ4.21aktualisiert 2021-06-29

Problem

Du m�chtest die Gr��e der Formulare, Position und Gr��e der Steuerelemente usw. an die aktuelle Bildschirmaufl�sung anpassen.

L�sung

Eine technisch einfache, aber mit erh�htem Pflegeaufwand verbundene Methode ist, mehrere Versionen eines Formulares zu erzeugen und je nach Aufl�sung das passende zu �ffnen.

F�r die dynamische Anpassung von Steuerelement-Gr��en gibt es ab Access 2007 die Anker-Eigenschaften.

F�r weitergehende Anpassungen hingegen ist viel Code notwendig. Dabei kommt es oft zu Problemen im Detail mit Proportionen, Schriftgr��en etc. Das gilt manchmal auch f�r die diversen Beschreibungen und Tools im Internet wie z.B.

- Colin Riddingtons Tutorial http://www.mendipdatasystems.co.uk/automatic-form-resizing-1/4594554784
- Total Access Components http://www.fmsinc.com/microsoftaccess/controls.html
- ShrinkerStretcher http://www.peterssoftware.com/ss.htm

nach oben

https://www.donkarl.com?FAQ4.22aktualisiert 2021-10-25

Problem

Du m�chtest einen gerade eingegebenen Wert in einem neuen Datensatz als Standardwert vorgeben, um ihn nur bei Bedarf �ndern zu m�ssen.

L�sung

Schreibe in der Ereignisprozedur Nach Aktualisierung des jeweiligen Steuerelementes oder des Formulares:

bei Textfeldern
Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id6

bei Datumsfeldern
Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id7

bei anderen Felddatentypen (Zahl, Ja/Nein etc.)
Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id8

nach oben

https://www.donkarl.com?FAQ4.23aktualisiert 2005-08-24

Problem

Mit den Tastenundkann standardm��ig der Datensatz gewechselt werden. Genau das m�chtest du unterbinden.

L�sung

Setze die Eigenschaft Tastenvorschau des Formulares auf Ja.

Im Ereignis Bei Taste ab des Formulares:
Forms!frmFormular2.Recordset.FindFirst "Id = " & Me!Id9

Analog sind s�mtliche Tasten auf Formularebene in VBA programmierbar.

Wenn du nur die normalen Access-Funktionstasten sperren willst, kannst du das auch im Men�punkt Extras/Start machen. Ansonsten schau in die Online-Hilfe unter "Tastatur, Tastaturbelegung-Makrogruppen".

nach oben

https://www.donkarl.com?FAQ4.24aktualisiert 2021-10-25

Problem

Du m�chtest den Cursor in einem Textfeld "automatisch" an die erste oder letzte Stelle setzen oder den ganzen Inhalt des Feldes markieren.

L�sung

Das Cursorverhalten bei Eintritt in ein Feld l�sst sich (f�r die ganze Datenbank geltend) im Men� Extras/Optionen/Tastatur einstellen.

F�r einzelne Steuerelemente l�sst es sich programmieren. Entweder man verwendet die folgenden VBA-Anweisungen bei Ereignissen wie Beim Hingehen oder Beim Klicken des Steuerelementes oder man setzt zuvor den Cursor in das Steuerelement z.B. mit:
Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
0

Cursor an den Anfang des Textes
Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
1

Cursor an das Ende des Textes
Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
2

ganzen Text markieren
Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
3

Das Voransetzen des Leer-Strings verhindert eine Fehlermeldung der Len-Funktion bei leeren Feldern. Das gleiche erreicht man auch mit: Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
4

nach oben

https://www.donkarl.com?FAQ4.25aktualisiert 2005-12-07

Problem

Du m�chtest vermeiden, dass in ein Feld ein Wert eingegeben wird, der schon einmal in der zugrunde liegenden Tabelle drin ist. Wenn das versucht wird, soll eine verst�ndliche Fehlermeldung erscheinen.

L�sung

Variante 1

Setze in der Tabelle bei diesem Feld die Eigenschaft Indiziert auf Ja (Ohne Duplikate).
Im Ereigniscode Bei Fehler (On Error) des Formulares schreibst du:

Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
5

Variante 2

Bei obigem Vorgehen erfolgt die Pr�fung erst beim Versuch, den Datensatz zu speichern, also i.d.R. beim Wechseln des Datensatzes. Wenn die Pr�fung gleich nach dem Eingeben des Wertes in ein Feld stattfinden soll, kannst du das Ereignis Vor Aktualisierung des Steuerelementes nutzen und Code wie diesen:

Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
6

Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
7

Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
8

In der 2. Zeile des Codes wird der Feldtyp Text vorausgesetzt. Wenn es sich hingegen um eine Zahl handelt, sollte die 2. Zeile lauten:

Me!RechnungsNr.SetFocus
DoCmd.FindRecord Me!txtSuch
9

nach oben

https://www.donkarl.com?FAQ4.26

Problem

Du hast bei einem Steuerelement kein zugeordnetes Bezeichnungsfeld und m�chtest ein solches nachtr�glich erstellen, z.B. damit man durch Klick darauf das �bergeordnete Steuerelement aktivieren kann, die beiden im Entwurf gemeinsam verschoben werden etc.

L�sung

Erzeuge zun�chst mithilfe der Toolbox ein ungebundenes Bezeichnungsfeld.
Schneide das Feld in die Zwischenablage aus.
Markiere das Steuerelement, dem es zugeordnet werden soll.
F�ge das Bezeichnungsfeld aus der Zwischenablage wieder ein.
Es ist nun an das zuvor markierte Steuerelement gebunden.

nach oben

https://www.donkarl.com?FAQ4.27

Problem

Du hast im Formular ein Textfeld mit einer Emailadresse und m�chtest das Standard-Emailprogramm mit einer neuen Email und der Adresse aus dem Feld �ffnen.

L�sung

Schreib (ab A97) beim gew�nschten Ereignis in der Ereignisprozedur:
Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
0

Wenn du den Text im Steuerelement gerade ge�ndert hast und sich der Fokus beim Aufruf der Mail noch im Textfeld befindet, dann musst du die Eigenschaft Text des Steuerelementes verwenden:
Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
1

Du kannst mit SendObject auch den Betreff und den Text der Email vorgeben. (s.)

Wenn du statt des Textfeldes unbedingt ein Hyperlink-Feld verwenden m�chtest, besteht das Problem, dass der Anwender i.d.R. nicht wei�, dass er vor der Email-Adresse "mailto:" eingeben m�sste. Tut er das nicht, geht Access auch bei einer Mail-Adresse von einer Webseite aus, setzt "http://" davor und �ffnet den Webbrowser. Eine M�glichkeit, das zu verhindern, ist, die Eingabe im Ereignis Nach Aktualisierung des Feldes zu korrigieren:

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
2

nach oben

https://www.donkarl.com?FAQ4.28

Problem

Du hast bei einem Steuerelement in der Eigenschaft Steuerelement Tip-Text einen Text eingegeben. Wenn du mit der Maus drauf gehst, erscheint der Tiptext aber nicht.

L�sung

Meistens liegt es daran, dass ein transparentes Rechteck oder dergl. �ber dem Steuerelement liegt und es daher nicht im Vordergrund ist. Auch wenn nichts dar�ber liegen sollte, markiere das betreffende Steuerelement und w�hle den Men�punkt Format/In den Vordergrund.

nach oben

https://www.donkarl.com?FAQ4.29aktualisiert 2009-10-19

Problem

Bei manchen M�usen mit Rad (v.a. MS-Intellimouse) kann der Anwender durch Drehen des Rades den Datensatz wechseln, was du eigentlich verhindern m�chtest. Es kann auch vorkommen, dass schon leichtes Drehen am Mausrad wildes Scrollen zwischen den Datens�tzen zur Folge hat.

L�sung

Ab A07 besteht das Problem nicht mehr, da der Datensatzwechsel per Mausrad deaktiviert wurde.
F�r Versionen bis inkl. A03 gibt es Code zum Abfangen der Mausbefehle von Wayne Phillips, der keine externe DLL oder dergl. braucht:
http://www.everythingaccess.com/tutorials.asp?ID=A-new-method-for-disabling-the-Mouse-Scroll-Wheel-in-Access-forms

Die klassischen L�sungen funktionieren mit DLLs:
http://www.lebans.com/mousewheelonoff.htm
http://support.microsoft.com/?kbid=278379
http://www.mvps.org/access/api/api0036.htm

Das wilde DS-Springen mit der Intellimouse wird lt. MS vom SR2 zu O97 bzw. durch neue Maustreiber gefixt:
http://support.microsoft.com/?kbid=192008

nach oben

https://www.donkarl.com?FAQ4.30aktualisiert 2007-01-03

Problem

Du �ffnest ein Formular in der Datenblattansicht und m�chtest die Spalten�berschriften �ndern, findest aber keine entsprechende Eigenschaft oder Einstellung.

L�sung

Es gibt zwei M�glichkeiten, woher die Spalten ihre Beschriftung beziehen.

1. Wenn zu einem Steuerelement kein Bezeichnungsfeld zugeordnet ist, dann wird die Eigenschaft Name des Steuerelementes als �berschrift verwendet, d.h. du kannst diese Eigenschaft �ndern, um auch die Spalten�berschrift zu �ndern.

2. Existiert ein zugeordnetes Bezeichnungsfeld, dann wird dessen Eigenschaft Beschriftung (in VBA: Caption) als Spalten�berschrift verwendet, auch wenn in der Datenblattansicht solche Bezeichnungsfelder gar nicht angezeigt werden. Du kannst also in der Entwurfsansicht oder per VBA diese Eigenschaft einstellen und damit die Spalten�berschrift �ndern. Wie man nachtr�glich Bezeichnungsfelder zuordnet steht in FAQ 4.26.

nach oben

https://www.donkarl.com?FAQ4.31aktualisiert 2008-11-22

Problem

Du m�chtest in einem Formular animierte GIFs darstellen.

L�sung

ohne ActiveX:
von Stephen Lebans http://www.lebans.com/animatedgifplayer.htm

ActiveX-Steuerelemente:
von MS gibt es das Microsoft Animation Control (kommt mit irgendwelchen MSComCtl-Klassen bzw. mit ODE/MOD)
s.a. http://support.microsoft.com/?kbid=209919
Shareware: Animation Gif Control http://www.jcomsoft.com/anigif.htm

Eine weitere M�glichkeit ist die Verwendung des Webbrowser- oder DHTML Edit-Steuerelements des MS Internet Explorers.

nach oben

https://www.donkarl.com?FAQ4.32

Problem

Wenn ein Datensatz ge�ndert wurde, soll er nicht automatisch gespeichert werden, sondern eine Sicherheitsabfrage erscheinen.

L�sung

Verwende in der Ereignisprozedur Vor Aktualisierung des Formulares Code wie diesen:

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
3

nach oben

https://www.donkarl.com?FAQ4.33

Problem

Du m�chtest (programmatorisch) herausfinden, ob der aktuelle DS der erste oder letzte im Formular ist oder ein neuer.

L�sung

Verwende (ab A95) Code wie den folgenden bei einem passenden Ereignis z.B. Beim Anzeigen:

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
4

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
5

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
6

Erl�uterungen gibt's unter den Stichworten "CurrentRecord" und "NewRecord" in der Online-Hilfe.

nach oben

https://www.donkarl.com?FAQ4.34aktualisiert 2022-09-12

Problem

Ein Formular, das in Formularansicht ge�ffnet wird, ist v�llig leer, d.h. enth�lt keine Steuerelemente mehr (weder Textfelder noch Befehlsschaltfl�chen etc.). In der Entwurfsansicht sind die Steuerelemente noch vorhanden.

Ursache

Fast immer ist dieses Verhalten "by Design". Die Ursache ist i.d.R., dass die zugrundeliegende Abfrage (eingetragen in der Eigenschaft Datensatzherkunft) keine Datens�tze zur�ckliefert und in der Abfrage oder im Formular keine neuen Datens�tze angelegt werden k�nnen (z.B. Formulareigenschaft Anf�gen zulassen steht auf Nein).

L�sung

Entweder daf�r sorgen, dass die Abfrage immer Datens�tze liefert oder dass neue Datens�tze angelegt werden k�nnen, also die Abfrage umbauen bzw. im Formular neue Datens�tze zulassen.

Falls du blo� m�chtest, dass zumindest deine Schaltfl�chen (z.B. zum Schlie�en des Formulares) sichtbar sind, reicht es, die Schaltfl�chen oder sonst. Steuerelemente in den Kopf- oder Fu�bereich des Formulares zu verschieben. Komplett leer ist n�mlich nur der Detailbereich.

Weitere Info: KB-Artikel im Webarchiv

nach oben

https://www.donkarl.com?FAQ4.35

Problem

Du m�chtest, dass ein Access-Formular keine eigene Schlie�en-Schaltfl�che in seiner Titelleiste hat. Die entsprechende Eigenschaft f�r Formulare deaktiviert das Schlie�en-Symbol, wenn das Formular nicht maximiert ist. A97 hat aber den Bug, dass die Schlie�en-Schaltfl�che des Formulars bei maximiertem Formularfenster wieder aktiviert ist. (in neueren Versionen ist das behoben)

L�sung

Wenn du nur das Schlie�en des Formulares verhindern m�chtest, kannst du das Ereignis "Beim Entladen" des Formulares zum Abfangen verwenden (s. FAQ 1.12). Das hat den Vorteil, dass auch Windows-Tastenkombinationen wie+und der Men�befehl zum Schlie�en des Fensters nicht mehr funktionieren.

Das Fehlverhalten von A97 ist hingegen nur per Windows-API zu verhindern. Das Code-Beispiel von Terry Kreft zeigt, wie man das Formular an die Gr��e des Access-MDI-Fensters anpassen kann, statt es maximiert zu �ffnen:
http://www.mvps.org/access/api/api0022.htm

nach oben

https://www.donkarl.com?FAQ4.36

Problem

Du hast in einem Formular 2 (oder mehr) Kombinations- oder Listenfelder und m�chtest, dass der Inhalt des zweiten Kombis vom ersten abh�ngig ist, also nur mehr jene Datens�tze anzeigt, f�r die im ersten die �bergeordnete Kategorie gew�hlt wurde.

L�sung

Vorbemerkungen: Kombinationsfelder und Listenfelder sind diesbez. ident zu behandeln. Ich gehe auch nicht n�her auf die Tabellenstruktur ein. Im Normalfall sollte es zwischen den involvierten Tabellen eine 1:n-Beziehung geben.

Angenommen du hast ein Formular "frm_Artikel" mit 2 Kombis. Eines "cbo_Gruppen" mit den Artikelgruppen, eines "cbo_Artikel" mit Artikeln. Nun m�chtest du die Artikelgruppe ausw�hlen und das zweite (abh�ngige) Kombi soll nur mehr jene Artikel zeigen, die dieser Gruppe angeh�ren.

Enscheidend ist die Datensatzherkunft von cbo_Artikel.
Das kann eine gespeicherte Abfrage sein, in der beim GruppenID-Feld als Kriterium ein Bezug auf das �bergeordnete Kombi steht:
Forms!frm_Artikel!cbo_Gruppen

Es kann aber auch ein SQL-Ausdruck sein, der in der Eigenschaft Datensatzherkunft des abh�ngigen Kombis steht oder der im Ereignis-Code Nach Aktualisierung des �bergeordneten Kombis zugewiesen wird:

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
7

Wenn die Datensatzherkunft des abh�ngigen Kombis nicht - wie im letzten Beispiel - dynamisch zugewiesen wird sondern z.B. eine gespeicherte Abfrage ist, dann muss noch die Anzeige aktualisiert werden. Dazu kannst du im Ereigniscode Nach Aktualisierung des �bergeordneten Kombis die Requery-Methode verwenden:
Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
8

Bei http://www.pc-creativ.de/ (unter "Tools) gibt es eine Beispiel-mdb "CreaKombi" von Anette Ratjen mit verschiedenen Varianten.

nach oben

https://www.donkarl.com?FAQ4.37aktualisiert 2007-01-03

Problem

Du m�chtest in einem Textfeld eine Rechenformel eingeben, deren Ergebnis in einem anderen Textfeld erscheinen soll.

L�sung

Daf�r l�sst sich die Funktion Eval() verwenden. Angenommen das Textfeld hei�t "txt_Formel" und das Ergebnisfeld "txt_Ergebnis". Im Steuerelementinhalt von txt_Ergebnis k�nnte dann stehen:

Me.Recordset.FindFirst "RechnungsNr = " & Me!txtSuch
'oder falls RechnungsNr kein Zahlenfeld ist sondern vom Typ Text:
'Me.Recordset.FindFirst "RechnungsNr = '" & Me!txtSuch & "'"
9

St�rend ist dabei oft, dass man f�r Eval den Punkt als Dezimaltrennzeichen verwenden muss. Wenn im Textfeld mit dem Komma gearbeitet werden soll, kann man es mit Stringfunktionen oder ab A00 mit Replace (wesentlich einfacher) f�r Eval austauschen. Der Ausdruck im Ergebnisfeld k�nnte dann z.B. lauten:

Dim lngStore As Long0

Das Ergebnis wird so nur im Steuerelement angezeigt. Falls es gespeichert werden soll s. Berechnetes Feld speichern.

nach oben

https://www.donkarl.com?FAQ4.38aktualisiert 2007-01-03

Problem

Du m�chtest verhindern, dass beim Dr�cken der Tabulator-, Enter- oder Pfeiltaste im ersten/letzten Steuerelement eines Datensatzes zum vorigen/n�chsten Datensatz gewechselt wird.

L�sung

Stelle die Eigenschaft Zyklus des Formulares auf Aktueller Datensatz ein.

s.a. Tasten BildAuf/BildAb deaktivieren

nach oben

https://www.donkarl.com?FAQ4.39aktualisiert 2016-09-06

Problem

Du m�chtest in einem Formular ein Textfeld mit einer fortlaufenden Nummer oder fortlaufenden Summe haben.

L�sung

Laufende Nummer

Du kannst daf�r eine vorbereitende Abfrage verwenden, die bereits die laufende Nummer erzeugt.
Eine andere Variante ist die Verwendung der AbsolutePosition-Eigenschaft des DAO-Recordsets. Kopiere dir dazu den folgenden Code in das Formularmodul:

'************* CODE START ************
Dim lngStore As Long1

Dim lngStore As Long2

Dim lngStore As Long3

Dim lngStore As Long4

Dim lngStore As Long5

Dim lngStore As Long6
'************* CODE ENDE ************

Laufende Summe

Daf�r gibt's ebenfalls mehrere Varianten, z.B. per DAO-Programmierung
Laufende Summe im Formular
Laufende Summe im Formular mit etwas mehr Code

oder mithilfe der DSum-Funktion:
Laufende Summe im Formular mit DSum

nach oben

https://www.donkarl.com?FAQ4.40aktualisiert 2021-10-25

Problem

Du m�chtest in einem Formular mehrere Datens�tze markieren und dann per VBA ermitteln, welche markiert sind.

L�sung

Der Datensatzmarkierer von Access erlaubt nur eine zusammenh�ngende Markierung von Datens�tzen. Die-Taste hat hier nicht die sonst in Windows geltende Funktion einer getrennten Markierung. Wenn also mit dem Datensatzmarkierer mehrere DS markiert wurden, so kann man mithilfe der Seltop- und Selheight-Eigenschaften des Formulares eruieren, welche DS markiert sind. Ausf�hrliche Beispiele dazu bieten folgende KB-Artikel:

KB-Artikel im Webarchiv

Wenn es um die Markierung von Datens�tzen geht, die sich nicht unmittelbar untereinander befinden, ist der �bliche Workaround die Verwendung eines gebundenen Kontrollk�stchens, das dann in jedem DS gesetzt werden muss und z.B. mit einer Aktualisierungsabfrage wieder in einem Rutsch zur�ckgesetzt wird. Eine andere Variante ist die Verwendung eines Listenfeldes, bei dem die Eigenschaft Mehrfachauswahl auf Erweitert eingestellt ist.

nach oben

https://www.donkarl.com?FAQ4.41aktualisiert 2011-04-28

Problem

Du m�chtest ein Textfeld f�r eine Passwort-Eingabe verwenden, d.h. man soll beim Tippen nur die �blichen Sternchen sehen.

L�sung

Setze die Eigenschaft Eingabeformat des Textfeldes auf: Kennwort

Zwei Anmerkungen zu diesem Themenbereich:

- Eine h�ufige Frage ist, ob das auch mit VBA-Inputboxen geht.
Antwort: Nein, man braucht ein Textfeld in einem Formular.

- Wenn sich der Cursor in dem Kennwort-Textfeld befindet und mitoder per Men�punkt/Ribbon die Rechtschreibpr�fung aktiviert wird, erscheint der eingegebene Text im Rechtschreibdialog in Klarschrift. Falls das ein Problem darstellt, sollte man die Funktionstaste deaktivieren (in den Starteigenschaften oder per Tastaturmakro) und den Men�- bzw. Ribboneintrag ausblenden.

Wie funktioniert eine Aktualisierungsabfrage in Access?

Klicken Sie auf der Registerkarte Entwurf in der Gruppe Abfragetyp auf Aktualisieren. In diesem Verfahren wird gezeigt, wie Sie eine Auswahlabfrage in eine Aktualisierungsabfrage ändern. Wenn Sie dies tun, fügt Access die Zeile Aktualisieren der Zeile im Abfrageentwurfsraster hinzu.

Was ist ein ungebundenes Formular?

Alternativ können Sie ein "ungebundenes" Formular erstellen, das nicht direkt mit einer Datenquelle verknüpft ist, aber dennoch Befehlsschaltflächen, Beschriftungen oder andere Steuerelemente enthält, die Sie zum Bedienen der Anwendung benötigen.

Was ist ein Datensatz Access?

Ein Datensatz besteht aus einer Sammlung von miteinander verknüpften, aber eigenständigen Daten, die entweder einzeln oder auch gemeinsam aufgerufen und weiterverarbeitet werden können. Jeder Datensatz ist in einer bestimmten Datenstruktur organisiert.

Was ist der Primärschlüssel bei Access?

Ein Primärschlüssel ist ein Feld oder eine Gruppe von Feldern mit Werten, die in einer Tabelle eindeutig sind. Da jeder Datensatz einen anderen Wert für den Schlüssel hat, können Werte für den Schlüssel zum Verweisen auf ganze Datensätze verwendet werden. Jede Tabelle kann nur einen Primärschlüssel haben.