{"id":55001626,"date":"2026-12-01T00:00:00","date_gmt":"2026-11-09T18:57:02","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1626"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datensatznavigation_per_Ribbon_mit_Klasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/","title":{"rendered":"Datensatznavigation per Ribbon mit Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_005.png\" alt=\"Navigieren in Formularen per Ribbon\" width=\"649,559\" height=\"405,5049\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Navigieren in Formularen per Ribbon<\/span><\/b><\/p>\n<p><b>Im Beitrag &#8222;Datensatznavigation per Ribbon&#8220; (www.access-im-unternehmen.de\/1415) haben wir die Steuerelemente zur Navigation durch die Datens&auml;tze aus der Navigationsleiste eines Formulars in das Ribbon verlegt. Damit das Ribbon die Position des Datensatzzeigers anzeigt, enth&auml;lt das Formular eine Variable und drei Ereignisprozeduren. Diesen Code m&uuml;ssten wir in jedes weitere Formular kopieren, welches das Ribbon anzeigen soll. Wie wir es in eine Klasse auslagern, sodass jedes Formular nur noch eine Variable und eine Prozedur ben&ouml;tigt, zeigt der vorliegende Beitrag.<\/b><\/p>\n<p>Im oben genannten Beitrag haben wir eine praktische L&ouml;sung vorgestellt, welche die Elemente der Navigationsleiste eines Formulars direkt im Ribbon anzeigt. Dadurch k&ouml;nnen wir die eingebauten Elemente durch Setzen von <b>Navigationsschaltfl&auml;chen <\/b>auf <b>Nein <\/b>ausblenden und stellen dem Benutzer gut sichtbare Steuerelemente zur Verf&uuml;gung (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_005.png\" alt=\"Navigieren in Formularen per Ribbon\" width=\"649,559\" height=\"405,5049\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Navigieren in Formularen per Ribbon<\/span><\/b><\/p>\n<h2>Ereignisse des Formulars in einer Klasse behandeln<\/h2>\n<p>Das Formular <b>frmKunden<\/b> enth&auml;lt in der L&ouml;sung aus dem Vorg&auml;ngerbeitrag die Variable <b>lngPos<\/b> und die Ereignisprozeduren <b>Form_Current<\/b>, <b>Form_AfterUpdate<\/b> und <b>Form_Delete<\/b>.<\/p>\n<p><b>Form_Current<\/b> und <b>Form_AfterUpdate<\/b> rufen die Methode <b>Invalidate<\/b> auf, damit das Ribbon seine Elemente aktualisiert. <b>Form_Delete<\/b> speichert die Position des Datensatzzeigers vor dem L&ouml;schen eines Datensatzes.<\/p>\n<p><b>Form_Current<\/b> stellt die Position anschlie&szlig;end wieder her. Die Ribbondefinition und die Bilder &uuml;bernehmen wir aus dem Vorg&auml;ngerbeitrag. Die Callbackprozeduren im Modul <b>mdlRibbons<\/b> erweitern wir im Abschnitt <b>Das Formular mit dem Fokus ermitteln<\/b>.<\/p>\n<p>Dieser Code ist in allen Formularen, die das Ribbon verwenden, identisch. Deshalb lagern wir ihn in eine Klasse aus, die auf die Ereignisse des Formulars reagiert. Aus dem Formular <b>frmKunden<\/b> entfernen wir ihn danach.<\/p>\n<p>Dazu deklarieren wir in der Klasse eine Variable des Typs <b>Form<\/b> mit dem Schl&uuml;sselwort <b>WithEvents<\/b>. F&uuml;r diese Variable stellt Access die Ereignisse des Formulars bereit. Daf&uuml;r k&ouml;nnen wir Ereignisprozeduren in der Klasse anlegen.<\/p>\n<p>Au&szlig;erdem muss die jeweilige Ereigniseigenschaft des Formulars den Wert <b>[Event Procedure]<\/b> haben, damit das Formular seine Ereignisse an die Klasse meldet.<\/p>\n<p>Wenn ein Ereignis in einem Formular definiert wurde, wird dies weiterhin ausgef&uuml;hrt und nicht ersetzt. Es feuern dann beide Ereignisse (Klasse und Formular selbst). Das Einstellen erledigt die Klasse selbst, sobald sie das Formular erh&auml;lt.<\/p>\n<h2>Die Klasse clsNavigationWrapper anlegen<\/h2>\n<p>Im VBA-Editor legen wir ein neues Klassenmodul an und nennen es <b>clsNavigationWrapper<\/b>. Es beginnt mit zwei Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Variable <b>m_Form<\/b> verweist sp&auml;ter auf das Formular und stellt dessen Ereignisse bereit. In der Variablen <b>lngPos<\/b> speichern wir wie im Vorg&auml;ngerbeitrag die Position des Datensatzzeigers vor dem L&ouml;schen eines Datensatzes. Die Klasse erh&auml;lt das Formular &uuml;ber die <b>Property Set<\/b>-Prozedur <b>Form<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n    <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n    <span style=\"color:blue;\">With<\/span> m_Form\r\n        .OnCurrent = \"[Event Procedure]\"\r\n        .OnActivate = \"[Event Procedure]\"\r\n        .AfterUpdate = \"[Event Procedure]\"\r\n        .OnDelete = \"[Event Procedure]\"\r\n        .OnClose = \"[Event Procedure]\"\r\n    End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die Prozedur speichert den Verweis auf das Formular in der Variablen <b>m_Form<\/b>. Danach stellt sie die Eigenschaften <b>OnCurrent<\/b>, <b>OnActivate<\/b>, <b>AfterUpdate<\/b>, <b>OnDelete<\/b> und <b>OnClose<\/b> des Formulars auf den Wert <b>[Event Procedure]<\/b> ein.<\/p>\n<p>Mit diesen Werten ruft Access die Ereignisprozeduren der Klasse auf, auch wenn das Formular selbst keine enth&auml;lt. Das Formular ben&ouml;tigt allerdings ein Klassenmodul, das wir f&uuml;r das Erzeugen der Klasse im Formular anlegen.<\/p>\n<p>Die Ereignisse <b>OnCurrent<\/b>, <b>OnActivate<\/b> und <b>AfterUpdate<\/b> f&uuml;hren zum selben Ergebnis: Das Ribbon soll seine Elemente neu abrufen. Das erledigt die Prozedur <b>RibbonAktualisieren<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>RibbonAktualisieren()\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objRibbon_Navigation Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        objRibbon_Navigation.Invalidate\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur ruft die Methode <b>Invalidate<\/b> der Variablen <b>objRibbon_Navigation<\/b> auf. Diese Variable haben wir wie im Vorg&auml;ngerbeitrag im Modul <b>mdlRibbons<\/b> deklariert.<\/p>\n<p>Zuvor pr&uuml;ft die Prozedur, ob die Variable bereits einen Verweis auf das Ribbon enth&auml;lt. Beim ersten &Ouml;ffnen eines Formulars tritt das Ereignis <b>OnCurrent<\/b> n&auml;mlich ein, bevor die Prozedur <b>onLoad_Navigation<\/b> die Variable f&uuml;llt. Der Aufruf der Methode <b>Invalidate<\/b> w&uuml;rde dann einen Fehler ausl&ouml;sen. Wenn mehrere Formulare ge&ouml;ffnet sind, die dasselbe Ribbon verwenden, soll das Ribbon den Zustand des aktiven Formulars anzeigen.<\/p>\n<p>Die Callbackprozeduren im Modul <b>mdlRibbons<\/b> ermitteln das Formular dazu zun&auml;chst &uuml;ber die Eigenschaft <b>ActiveForm<\/b> des Objekts <b>Screen<\/b>. Beim Wechsel zu einem anderen Formular tritt das Ereignis <b>OnActivate<\/b> ein. Die Prozedur <b>m_Form_Activate<\/b> aktualisiert dann das Ribbon:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Activate()\r\n    RibbonAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ohne diese Prozedur zeigt das Ribbon nach dem Wechsel zwischen zwei ge&ouml;ffneten Formularen weiter die Position des zuvor aktiven Formulars an. Das zeigen wir im Abschnitt <b>Das Ribbon in den Formularen pr&uuml;fen<\/b>.<\/p>\n<p>Damit kommen wir zum Ereignis <b>Beim Anzeigen<\/b>, das wir mit <b>m_Form_Current <\/b>implementieren. Das Textfeld im Ribbon zeigt die Position des Datensatzzeigers und die Anzahl der Datens&auml;tze, getrennt durch einen Schr&auml;gstrich (<b>\/<\/b>).<\/p>\n<p>Nach dem L&ouml;schen eines Datensatzes liefert die Eigenschaft <b>AbsolutePosition<\/b> des Formular-Recordsets zun&auml;chst den Wert <b>-1<\/b> oder l&ouml;st den Fehler <b>3167<\/b> aus.<\/p>\n<p>Die Prozedur pr&uuml;ft deshalb, ob die Eigenschaft den Wert <b>-1<\/b> hat. Falls ja, stellt sie die Position aus der Variablen <b>lngPos<\/b> wieder her, die die Prozedur <b>m_Form_Delete<\/b> vor dem L&ouml;schen gespeichert hat:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Current()\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">If <\/span>m_Form.Recordset.AbsolutePosition = -1<span style=\"color:blue;\"> Then<\/span>\r\n        m_Form.Recordset.AbsolutePosition = lngPos\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    RibbonAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>L&ouml;st das Lesen der Eigenschaft <b>AbsolutePosition<\/b> den Fehler <b>3167<\/b> aus, setzt VBA die Ausf&uuml;hrung wegen <b>On Error Resume Next<\/b> mit der Anweisung im <b>Then<\/b>-Zweig fort.<\/p>\n<p>Die Prozedur stellt die Position damit sowohl bei dem Wert <b>-1<\/b> als auch bei dem Fehler <b>3167<\/b> wieder her. Die Anweisung <b>On Error Resume Next<\/b> unterdr&uuml;ckt bis zum Ende der Prozedur jeden weiteren Fehler. W&uuml;rden wir die Position nicht wiederherstellen, zeigte das Textfeld im Ribbon nach dem L&ouml;schen die Position <b>0<\/b> an.<\/p>\n<p>Das Ereignis <b>AfterUpdate<\/b> tritt ein, nachdem der Benutzer einen neuen oder ge&auml;nderten Datensatz gespeichert hat. Die Prozedur <b>m_Form_AfterUpdate<\/b> gleicht zun&auml;chst die Position des Recordsets mit der des Formulars ab und aktualisiert danach das Ribbon:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_AfterUpdate()\r\n    m_Form.Recordset.Bookmark = m_Form.Bookmark\r\n    RibbonAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In den Beispieldaten mit 100 Kunden steht der Datensatzzeiger des Recordsets nach dem Speichern eines neuen Datensatzes noch auf dem bisher letzten Datensatz.<\/p>\n<p>Ohne den Abgleich zeigt das Textfeld im Ribbon deshalb <b>100\/101<\/b> statt <b>101\/101<\/b> an.<\/p>\n<p>F&uuml;r den Abgleich weisen wir der Eigenschaft <b>Bookmark<\/b> des Recordsets das Lesezeichen aus der Eigenschaft <b>Bookmark<\/b> des Formulars zu.<\/p>\n<p>Die Prozedur <b>m_Form_Delete<\/b> speichert die Position des Datensatzzeigers in der Variablen <b>lngPos<\/b>, bevor Access den Datensatz l&ouml;scht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Delete(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n    lngPos = m_Form.Recordset.AbsolutePosition\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Formular speichert die Instanz der Klasse in einer Variablen, wie wir im Abschnitt <b>Die Klasse im Formular erzeugen <\/b>zeigen.<\/p>\n<p>Die Instanz verweist &uuml;ber die Variable <b>m_Form<\/b> wiederum auf das Formular.<\/p>\n<p>Damit dieser gegenseitige Verweis nach dem Schlie&szlig;en nicht bestehen bleibt, stellen wir die Variable <b>m_Form<\/b> beim Schlie&szlig;en des Formulars auf den Wert <b>Nothing<\/b> ein:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Close()\r\n    <span style=\"color:blue;\">Set<\/span> m_Form = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Den Verweis auf das Ribbon speichern<\/h2>\n<p>Die Prozedur <b>onLoad_Navigation<\/b> im Modul <b>mdlRibbons<\/b> weist der Variablen <b>objRibbon_Navigation<\/b> den Verweis auf das Ribbon zu.<\/p>\n<p>Access ruft die Prozedur beim Laden des Ribbons auf. Den Verweis &uuml;bergibt es im Parameter <b>ribbon<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onLoad_Navigation(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n    <span style=\"color:blue;\">Set<\/span> objRibbon_Navigation = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Die Klasse im Formular erzeugen<\/h2>\n<p>Wir m&uuml;ssen noch kl&auml;ren, wo wir die Klasse instanziieren. Daf&uuml;r k&auml;me die Prozedur <b>onLoad_Navigation<\/b> infrage, die Access beim Laden des Ribbons aufruft. Sie k&ouml;nnte das aktive Formular an eine neue Instanz der Klasse &uuml;bergeben.<\/p>\n<p>Ob Access die Prozedur f&uuml;r jedes Formular aufruft, pr&uuml;fen wir mit einer Ausgabe im Direktbereich:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onLoad_Navigation(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n    <span style=\"color:blue;\">Set<\/span> objRibbon_Navigation = ribbon\r\n    <span style=\"color:blue;\">Debug.Print<\/span> \"onLoad_Navigation fuer \" _\r\n        & Screen.ActiveForm.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir starten Access neu, &ouml;ffnen das Formular <b>frmKunden<\/b>, schlie&szlig;en es, rufen es erneut auf und starten danach das Formular <b>frmGanzLeer<\/b>. Der Direktbereich enth&auml;lt nur eine Zeile:<\/p>\n<pre>onLoad_Navigation fuer frmKunden<\/pre>\n<p>In der Beispieldatenbank ruft Access die Prozedur <b>onLoad_Navigation<\/b> nur beim ersten &Ouml;ffnen eines Formulars mit diesem Ribbon auf. Danach verwendet Access das geladene Ribbon weiter. Jedes Formular muss deshalb die Instanz der Klasse selbst erzeugen. Die Zeile mit <b>Debug.Print<\/b> entfernen wir wieder.<\/p>\n<p>Zum Erzeugen der Instanz deklarieren wir im Klassenmodul des Formulars die Variable <b>objNavigation<\/b> des Typs <b>clsNavigationWrapper<\/b>. Die Ereignisprozedur <b>Form_Load<\/b> erzeugt darin eine Instanz der Klasse und &uuml;bergibt ihr mit dem Schl&uuml;sselwort <b>Me<\/b> das Formular:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objNavigation<span style=\"color:blue;\"> As <\/span>clsNavigationWrapper\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n    <span style=\"color:blue;\">Set<\/span> objNavigation = <span style=\"color:blue;\">New<\/span> clsNavigationWrapper\r\n    <span style=\"color:blue;\">Set<\/span> objNavigation.Form = Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Klasse kann die Eigenschaft <b>OnLoad<\/b> nicht selbst einstellen, weil die Instanz der Klasse erst in <b>Form_Load<\/b> entsteht.<\/p>\n<p>Deshalb muss die Eigenschaft <b>OnLoad<\/b> des Formulars den Wert <b>[Event Procedure]<\/b> enthalten. Access tr&auml;gt ihn ein, wenn wir die Prozedur &uuml;ber das Eigenschaftenblatt des Formulars anlegen, wobei auch das Klassenmodul des Formulars entsteht.<\/p>\n<p>Au&szlig;er der Eigenschaft <b>RibbonName<\/b> ben&ouml;tigt ein Formular nur den Code aus obigem Listing.<\/p>\n<p>F&uuml;r jedes weitere Formular, welches das Ribbon anzeigen soll, stellen Sie die Eigenschaft <b>RibbonName<\/b> auf den Wert <b>Navigation<\/b> und die Eigenschaft <b>OnLoad<\/b> auf den Wert <b>[Event Procedure]<\/b> ein. Danach f&uuml;gen Sie den Code in das Klassenmodul des Formulars ein.<\/p>\n<h2>Das Ribbon in den Formularen pr&uuml;fen<\/h2>\n<p>&Ouml;ffnen wir das Formular <b>frmKunden<\/b> in der Datenblattansicht und markieren den dritten Datensatz, zeigt das Textfeld im Ribbon die Position <b>3\/100<\/b> an (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_006.png\" alt=\"Das Ribbon im Formular frmKunden mit dem dritten Datensatz\" width=\"649,559\" height=\"311,9351\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das Ribbon im Formular frmKunden mit dem dritten Datensatz<\/span><\/b><\/p>\n<p>Das Formular <b>frmGanzLeer<\/b> zeigt die leere Tabelle <b>Tabelle1<\/b> an, und die Eigenschaft <b>RecordsetType<\/b> hat den Wert <b>Snapshot<\/b>. Die Datensatzgruppe enth&auml;lt also keine Datens&auml;tze und l&auml;sst sich nicht aktualisieren.<\/p>\n<p>Das Ribbon deaktiviert deshalb seine Steuerelemente zur Navigation. Das Textfeld bleibt leer (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_007.png\" alt=\"Das Ribbon im Formular frmGanzLeer ohne Datens&auml;tze\" width=\"599,559\" height=\"365,2603\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Ribbon im Formular frmGanzLeer ohne Datens&auml;tze<\/span><\/b><\/p>\n<p>Zum Vergleich &ouml;ffnen wir das Formular <b>frmKunden2<\/b>, eine Kopie des Formulars <b>frmKunden<\/b> mit der Beschriftung <b>Kunden&uuml;bersicht 2<\/b>. Springen wir in <b>frmKunden<\/b> zum zweiten Datensatz und aktivieren danach <b>frmKunden2<\/b> mit dem ersten Datensatz, zeigt das Ribbon die Position <b>1\/100<\/b> des aktiven Formulars an (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_008.png\" alt=\"Das Ribbon zeigt die Position des aktiven Formulars frmKunden2 an\" width=\"700\" height=\"402,1963\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Ribbon zeigt die Position des aktiven Formulars frmKunden2 an<\/span><\/b><\/p>\n<p>Beim Wechsel zur&uuml;ck zu <b>frmKunden<\/b> zeigt das Ribbon die Position <b>2\/100<\/b> an. Dasselbe gilt, wenn wir <b>frmKunden2<\/b> schlie&szlig;en und damit <b>frmKunden<\/b> aktiv wird. In der L&ouml;sung aus dem Vorg&auml;ngerbeitrag zeigt das Ribbon in beiden F&auml;llen weiter die Position <b>1\/100<\/b> an. Die Klasse behandelt daf&uuml;r das Ereignis <b>OnActivate<\/b>.<\/p>\n<p>In den Beispieldaten stimmt die Anzeige im Textfeld auch nach dem Speichern und nach dem L&ouml;schen eines Datensatzes mit der Position im Formular &uuml;berein.<\/p>\n<h2>Das Ribbon in Unterformularen<\/h2>\n<p>Enth&auml;lt ein Formular ein Unterformular, muss das Ribbon wissen, f&uuml;r welches der beiden Formulare es die Position anzeigt und in welchem es navigiert.<\/p>\n<p>Wir legen fest, dass das Formular Vorrang hat, in dem sich der Cursor befindet.<\/p>\n<p>Steht er im Hauptformular, bezieht sich das Ribbon auf dessen Datens&auml;tze, nach dem Wechsel in das Unterformular auf die Datens&auml;tze des Unterformulars. Als Beispiel dient das Formular <b>frmKundenMitBestellungen<\/b>. Es zeigt die Daten eines Kunden aus der Tabelle <b>tblKunden<\/b> in der Einzelansicht und enth&auml;lt das Unterformular <b>sfrmBestellungen<\/b>.<\/p>\n<p>Dieses zeigt in der Datenblattansicht die Bestellungen des Kunden aus der Tabelle <b>tblBestellungen<\/b>. Die Verkn&uuml;pfung erfolgt &uuml;ber das Feld <b>KundeID<\/b>.<\/p>\n<p>Bei beiden Formularen k&ouml;nnen Sie die Eigenschaft <b>NavigationButtons<\/b> nun auf <b>Nein<\/b> einstellen.<\/p>\n<p>Beide Formulare erhalten f&uuml;r die Eigenschaft <b>RibbonName<\/b> den Wert <b>Navigation<\/b>. Das gilt auch f&uuml;r das Unterformular: Ohne diese Einstellung blendet Access beim Wechsel in das Unterformular das Standard-Ribbon ein.<\/p>\n<p>Au&szlig;erdem enthalten beide Klassenmodule ebenfalls den folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objNavigation<span style=\"color:blue;\"> As <\/span>clsNavigationWrapper\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n    <span style=\"color:blue;\">Set<\/span> objNavigation = <span style=\"color:blue;\">New<\/span> clsNavigationWrapper\r\n    <span style=\"color:blue;\">Set<\/span> objNavigation.Form = Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Jedes Formular erzeugt damit seine eigene Instanz der Klasse <b>clsNavigationWrapper<\/b>.<\/p>\n<h2>Das Formular mit dem Fokus ermitteln<\/h2>\n<p>Die Callbackprozeduren im Modul <b>mdlRibbons<\/b> ermitteln das Formular bisher mit <b>Screen.ActiveForm<\/b>. Das liefert das Formular im aktiven Fenster, bei einem Unterformular also das Hauptformular. Die neue Funktion <b>GetNavigationForm<\/b> geht von diesem Formular aus und pr&uuml;ft, ob das aktive Steuerelement ein Unterformular ist. Ist das der Fall, wechselt sie in dessen Formular und wiederholt die Pr&uuml;fung, damit sie auch verschachtelte Unterformulare erfasst:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetNavigationForm()<span style=\"color:blue;\"> As <\/span>Form\r\n    <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n    <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>control\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> frm = Screen.ActiveForm\r\n    <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n        Do\r\n            <span style=\"color:blue;\">Set<\/span> ctl = Nothing\r\n            On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n            <span style=\"color:blue;\">Set<\/span> ctl = frm.ActiveControl\r\n            <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n            <span style=\"color:blue;\">If <\/span>ctl Is Nothing<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Do<\/span>\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctl.ControlType = acSubform<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Do<\/span>\r\n            <span style=\"color:blue;\">Set<\/span> frm = ctl.Form\r\n        <span style=\"color:blue;\">Loop<\/span>\r\n        <span style=\"color:blue;\">Set<\/span> GetNavigationForm = frm\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Variable <b>ctl<\/b> setzen wir vor jedem Durchlauf zur&uuml;ck, weil <b>frm.ActiveControl<\/b> einen Fehler ausl&ouml;st, wenn kein Steuerelement aktiv ist. In diesem Fall bleibt <b>ctl<\/b> leer, und die Schleife endet. In den Prozeduren <b>getLabel<\/b>, <b>getEnabled<\/b>, <b>getText<\/b> und <b>onAction<\/b> ersetzen wir die Anweisung <b>Set frm = Screen.ActiveForm<\/b> durch <b>Set frm = GetNavigationForm<\/b>. In <b>onChange<\/b> lautet die Anweisung <b>Set rst = GetNavigationForm.Recordset<\/b>.<\/p>\n<p>Listing 1 zeigt die Prozedur <b>getText<\/b>. Alles Weitere bleibt unver&auml;ndert, weil die Prozeduren mit der Variablen <b>frm<\/b> arbeiten.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getText(control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef text)\r\n    <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n    <span style=\"color:blue;\">Set<\/span> frm = GetNavigationForm\r\n    <span style=\"color:blue;\">Set<\/span> rst = frm.Recordset\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst.Updatable And rst.RecordCount = 0<span style=\"color:blue;\"> Then<\/span>\r\n        text = \"\"\r\n    <span style=\"color:blue;\">Else<\/span>\r\n        <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> frm.NewRecord<span style=\"color:blue;\"> Then<\/span>\r\n            text = rst.AbsolutePosition + 1 & \"\/\" & rst.RecordCount\r\n        <span style=\"color:blue;\">Else<\/span>\r\n            text = rst.RecordCount + 1 & \"\/\" & rst.RecordCount + 1\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Prozedur getText verwendet das Formular mit dem Fokus<\/span><\/b><\/p>\n<p>Das Register zeigt au&szlig;erdem die Eigenschaft <b>Caption<\/b> des Formulars mit dem Fokus an. Damit das Register einen aussagekr&auml;ftigen Text zeigt, hat das Unterformular f&uuml;r die Eigenschaft <b>Caption<\/b> den Wert <b>Bestellungen<\/b>.<\/p>\n<h2>Die Klasse f&uuml;r Unterformulare erweitern<\/h2>\n<p>Das Ribbon muss sich auch aktualisieren, wenn der Cursor zwischen Hauptformular und Unterformular wechselt. Das Ereignis <b>Activate<\/b> des Formulars eignet sich daf&uuml;r nicht, denn es tritt nur ein, wenn ein Formularfenster aktiviert wird.<\/p>\n<p>Stattdessen gibt es die Ereignisse <b>Enter<\/b> und <b>Exit<\/b> des Unterformular-Steuerelements im Hauptformular. Die Klasse deklariert dazu eine weitere Variable des Typs SubForm mit dem Schl&uuml;sselwort <b>WithEvents<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_Form<span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_SubformControl<span style=\"color:blue;\"> As <\/span>SubForm\r\n<span style=\"color:blue;\">Private <\/span>lngPos<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Eigenschaftsprozedur <b>Form<\/b> ermittelt nach dem Einstellen der Formularereignisse mit der Funktion <b>GetSubformControl<\/b>, ob das Formular in einem Unterformular-Steuerelement steckt. Wenn ja, stellt sie dessen Ereigniseigenschaften <b>OnEnter<\/b> und <b>OnExit<\/b> auf <b>[Event Procedure]<\/b> ein:<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Form(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n    <span style=\"color:blue;\">Set<\/span> m_Form = frm\r\n    <span style=\"color:blue;\">With<\/span> m_Form\r\n        .OnCurrent = \"[Event Procedure]\"\r\n        .OnActivate = \"[Event Procedure]\"\r\n        .AfterUpdate = \"[Event Procedure]\"\r\n        .OnDelete = \"[Event Procedure]\"\r\n        .OnClose = \"[Event Procedure]\"\r\n    End <span style=\"color:blue;\">With<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> m_SubformControl = GetSubformControl\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> m_SubformControl Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        m_SubformControl.OnEnter = \"[Event Procedure]\"\r\n        m_SubformControl.OnExit = \"[Event Procedure]\"\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die Funktion <b>GetSubformControl<\/b> liest die Eigenschaft <b>Parent<\/b> des Formulars. Bei einem Hauptformular l&ouml;st <b>Parent<\/b> einen Fehler aus.<\/p>\n<p>Die Funktion bleibt dann leer, und die Variable <b>m_SubformControl<\/b> enth&auml;lt <b>Nothing<\/b>. Sonst durchl&auml;uft sie die Steuerelemente des Hauptformulars und gibt das Unterformular-Steuerelement zur&uuml;ck, dessen Eigenschaft <b>Form<\/b> auf unser Formular verweist.<\/p>\n<p>Damit eignet sich dieselbe Klasse f&uuml;r Haupt- und Unterformulare:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetSubformControl()<span style=\"color:blue;\"> As <\/span>SubForm\r\n    <span style=\"color:blue;\">Dim <\/span>frmParent<span style=\"color:blue;\"> As <\/span>Form\r\n    <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> frmParent = m_Form.Parent\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n    <span style=\"color:blue;\">If <\/span>frmParent Is Nothing<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n    For Each ctl In frmParent.Controls\r\n        <span style=\"color:blue;\">If <\/span>ctl.ControlType = acSubform<span style=\"color:blue;\"> Then<\/span>\r\n            <span style=\"color:blue;\">If <\/span>ctl.Form Is m_Form<span style=\"color:blue;\"> Then<\/span>\r\n                <span style=\"color:blue;\">Set<\/span> GetSubformControl = ctl\r\n                <span style=\"color:blue;\">Exit Function<\/span>\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die beiden Ereignisprozeduren aktualisieren das Ribbon, sobald der Cursor in das Unterformular wechselt oder es verl&auml;sst.<\/p>\n<p>Die Aktualisierung l&auml;uft erst ab, nachdem der Cursor das Unterformular verlassen hat. Das Ribbon zeigt dann bereits das Formular mit dem neuen Fokus an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_SubformControl_Enter()\r\n    RibbonAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>m_SubformControl_Exit(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n    RibbonAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Beim Schlie&szlig;en des Formulars gibt die Klasse neben <b>m_Form<\/b> auch die Variable <b>m_SubformControl<\/b> frei:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Close()\r\n    <span style=\"color:blue;\">Set<\/span> m_SubformControl = Nothing\r\n    <span style=\"color:blue;\">Set<\/span> m_Form = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In der Einzelansicht liest Access die Datens&auml;tze zun&auml;chst nur teilweise ein. Die Eigenschaft <b>RecordCount<\/b> liefert dann direkt nach dem &Ouml;ffnen den Wert <b>1<\/b>, und das Ribbon zeigt <b>1\/1<\/b> statt <b>1\/100<\/b> an.<\/p>\n<p>In der Prozedur <b>m_Form_Current<\/b> steht deshalb vor der Aktualisierung die Anweisung <b>m_Form.RecordsetClone.MoveLast<\/b>. Sie liest alle Datens&auml;tze ein, ohne den aktuellen Datensatz des Formulars zu &auml;ndern:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Form_Current()\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">If <\/span>m_Form.Recordset.AbsolutePosition = -1<span style=\"color:blue;\"> Then<\/span>\r\n        m_Form.Recordset.AbsolutePosition = lngPos\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    m_Form.RecordsetClone.MoveLast\r\n    RibbonAktualisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Das Ribbon im Formular mit Unterformular pr&uuml;fen<\/h2>\n<p>&Ouml;ffnen wir das Formular <b>frmKundenMitBestellungen<\/b>, steht der Cursor im ersten Feld des Hauptformulars. Das Ribbon zeigt die Position <b>1\/100<\/b> an, und das Register tr&auml;gt die Beschriftung <b>Kunde mit Bestellungen<\/b> (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_011.png\" alt=\"Das Ribbon zeigt die Position im Hauptformular frmKundenMitBestellungen an\" width=\"649,559\" height=\"706,0855\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Ribbon zeigt die Position im Hauptformular frmKundenMitBestellungen an<\/span><\/b><\/p>\n<p>Klicken wir in das Unterformular und springen zum dritten Datensatz, zeigt das Ribbon <b>3\/5<\/b> an, und das Register hei&szlig;t <b>Bestellungen<\/b> (siehe Bild 6). Die Schaltfl&auml;chen navigieren nun in den Bestellungen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1626_012.png\" alt=\"Das Ribbon zeigt die Position im Unterformular sfrmBestellungen an\" width=\"649,559\" height=\"700,736\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Das Ribbon zeigt die Position im Unterformular sfrmBestellungen an<\/span><\/b><\/p>\n<p><b>Neuer Datensatz<\/b> wechselt zum neuen Datensatz der Bestellungen, das Hauptformular bleibt beim ersten Kunden. Wechseln wir zur&uuml;ck in ein Feld des Hauptformulars, zeigt das Ribbon wieder <b>1\/100<\/b> an.<\/p>\n<p>Hat ein Kunde keine Bestellungen, wie der Kunde mit der <b>KundeID<\/b> <b>2<\/b>, zeigt das Unterformular den neuen Datensatz an.<\/p>\n<p>Das Ribbon zeigt dann <b>1\/1<\/b> an und deaktiviert die Schaltfl&auml;chen <b>Vorheriger Datensatz<\/b>, <b>N&auml;chster Datensatz<\/b> und <b>Neuer Datensatz<\/b>. Die Formulare <b>frmKunden<\/b>, <b>frmKunden2<\/b> und <b>frmGanzLeer<\/b> arbeiten mit den ge&auml;nderten Callbackprozeduren unver&auml;ndert weiter.<\/p>\n<h2>Einbau in eine eigene L&ouml;sung<\/h2>\n<p>Wenn Sie diese L&ouml;sung in einer eigenen Anwendung nutzen wollen, sind die folgenden Schritte notwendig:<\/p>\n<ul>\n<li>Einf&uuml;gen des Klassenmoduls <b>clsNavigationWrapper<\/b><\/li>\n<li>Einf&uuml;gen der Tabelle <b>USysRibbons <\/b>mit dem Ribbon <b>Navigation <\/b>oder Hinzuf&uuml;gen dieses Datensatzes zu einer bereits bestehenden Tabelle gleichen Namens<\/li>\n<li>Icons f&uuml;r das Ribbon: Entweder ersetzen der aktuellen Tabelle <b>MSysResources <\/b>durch die aus der Beispieldatenbank oder kopieren der enthaltenen Datens&auml;tze mit dem Wert <b>img <\/b>im Feld <b>Type <\/b>in die vorhandene Tabelle <b>MSysResources<\/b><\/li>\n<li>Importieren der Module <b>mdlRibbonImages<\/b> und <b>mdlRibbons<\/b><\/li>\n<\/ul>\n<p>Anschlie&szlig;end m&uuml;ssen die folgenden Anweisungen zum Klassenmodul des Formulars hinzugef&uuml;gt werden, f&uuml;r die das Ribbon angezeigt werden soll:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>objNavigation<span style=\"color:blue;\"> As <\/span>clsNavigationWrapper\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n    <span style=\"color:blue;\">Set<\/span> objNavigation = <span style=\"color:blue;\">New<\/span> clsNavigationWrapper\r\n    <span style=\"color:blue;\">Set<\/span> objNavigation.Form = Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die Klasse <b>clsNavigationWrapper<\/b> nimmt die Ereignisse eines Formulars entgegen und aktualisiert das Ribbon zur Datensatznavigation. Die Ereignisse <b>OnCurrent<\/b>, <b>OnActivate<\/b>, <b>AfterUpdate<\/b>, <b>OnDelete<\/b> und <b>OnClose<\/b> behandelt sie f&uuml;r alle Formulare an einer Stelle.<\/p>\n<p>Gegen&uuml;ber dem Vorg&auml;ngerbeitrag kommen die Ereignisse <b>OnActivate<\/b> und <b>OnClose<\/b> hinzu. Au&szlig;erdem gleicht die Klasse nach dem Speichern eines Datensatzes das Recordset mit dem Formular ab. Jedes Formular enth&auml;lt nur noch eine Variable und die Prozedur <b>Form_Load<\/b>. Die Callbackprozeduren im Modul <b>mdlRibbons<\/b> ermitteln das Formular mit der Funktion <b>GetNavigationForm<\/b>.<\/p>\n<p>Die Beispieldatenbank <b>NavigationImRibbonMitKlasse.accdb<\/b> enth&auml;lt die Klasse <b>clsNavigationWrapper<\/b>, die Formulare <b>frmKunden<\/b>, <b>frmKunden2<\/b>, <b>frmGanzLeer<\/b> und <b>frmKundenMitBestellungen<\/b>, das Unterformular <b>sfrmBestellungen<\/b>, die Tabelle <b>tblBestellungen<\/b> sowie die Tabelle <b>USysRibbons<\/b> mit der Ribbondefinition.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>NavigationImRibbonMitKlasse.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/8F140BCE-3E70-4D01-AF9A-EAD8068796F2\/aiu_1626.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Datensatznavigation per Ribbon&#8220; (www.access-im-unternehmen.de\/1415) haben wir die Steuerelemente zur Navigation durch die Datens&auml;tze aus der Navigationsleiste eines Formulars in das Ribbon verlegt. Damit das Ribbon die Position des Datensatzzeigers anzeigt, enth&auml;lt das Formular eine Variable und drei Ereignisprozeduren. Diesen Code m&uuml;ssten wir in jedes weitere Formular kopieren, welches das Ribbon anzeigen soll. Wie wir es in eine Klasse auslagern, sodass jedes Formular nur noch eine Variable und eine Prozedur ben&ouml;tigt, zeigt der vorliegende Beitrag.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[662026,66062026,44000050],"tags":[],"class_list":["post-55001626","post","type-post","status-publish","format-standard","hentry","category-662026","category-66062026","category-Ribbons_und_Menues_programmieren"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Datensatznavigation per Ribbon mit Klasse - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datensatznavigation per Ribbon mit Klasse - Access im Unternehmen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Datensatznavigation per Ribbon&quot; (www.access-im-unternehmen.de\/1415) haben wir die Steuerelemente zur Navigation durch die Datens&auml;tze aus der Navigationsleiste eines Formulars in das Ribbon verlegt. Damit das Ribbon die Position des Datensatzzeigers anzeigt, enth&auml;lt das Formular eine Variable und drei Ereignisprozeduren. Diesen Code m&uuml;ssten wir in jedes weitere Formular kopieren, welches das Ribbon anzeigen soll. Wie wir es in eine Klasse auslagern, sodass jedes Formular nur noch eine Variable und eine Prozedur ben&ouml;tigt, zeigt der vorliegende Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-09T18:57:02+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/5efd1af2265d5b82ecce8bdb2db6694d\"},\"headline\":\"Datensatznavigation per Ribbon mit Klasse\",\"datePublished\":\"2026-11-09T18:57:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/\"},\"wordCount\":2797,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/73db2bc81fc448af8c3b15560358f043\",\"articleSection\":[\"2026\",\"6\\\/2026\",\"Ribbons und Men\u00fcs programmieren\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/\",\"name\":\"Datensatznavigation per Ribbon mit Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/73db2bc81fc448af8c3b15560358f043\",\"datePublished\":\"2026-11-09T18:57:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/73db2bc81fc448af8c3b15560358f043\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/73db2bc81fc448af8c3b15560358f043\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datensatznavigation_per_Ribbon_mit_Klasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datensatznavigation per Ribbon mit Klasse\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/5efd1af2265d5b82ecce8bdb2db6694d\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Datensatznavigation per Ribbon mit Klasse - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/","og_locale":"de_DE","og_type":"article","og_title":"Datensatznavigation per Ribbon mit Klasse - Access im Unternehmen","og_description":"Im Beitrag \"Datensatznavigation per Ribbon\" (www.access-im-unternehmen.de\/1415) haben wir die Steuerelemente zur Navigation durch die Datens&auml;tze aus der Navigationsleiste eines Formulars in das Ribbon verlegt. Damit das Ribbon die Position des Datensatzzeigers anzeigt, enth&auml;lt das Formular eine Variable und drei Ereignisprozeduren. Diesen Code m&uuml;ssten wir in jedes weitere Formular kopieren, welches das Ribbon anzeigen soll. Wie wir es in eine Klasse auslagern, sodass jedes Formular nur noch eine Variable und eine Prozedur ben&ouml;tigt, zeigt der vorliegende Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-11-09T18:57:02+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/5efd1af2265d5b82ecce8bdb2db6694d"},"headline":"Datensatznavigation per Ribbon mit Klasse","datePublished":"2026-11-09T18:57:02+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/"},"wordCount":2797,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043","articleSection":["2026","6\/2026","Ribbons und Men\u00fcs programmieren"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/","url":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/","name":"Datensatznavigation per Ribbon mit Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043","datePublished":"2026-11-09T18:57:02+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/73db2bc81fc448af8c3b15560358f043"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datensatznavigation_per_Ribbon_mit_Klasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datensatznavigation per Ribbon mit Klasse"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/5efd1af2265d5b82ecce8bdb2db6694d","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001626"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001626\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}