{"id":55001579,"date":"2025-12-01T00:00:00","date_gmt":"2025-12-02T21:34:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1579"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Daten_anonymisieren_per_AccessAddIn","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/","title":{"rendered":"Daten anonymisieren per Access-Add-In"},"content":{"rendered":"<p><b>Es gibt verschiedene Gr&uuml;nde zum Anonymisieren von Daten. Einer ist, dass man Daten aus Datenschutzgr&uuml;nden verfremden m&ouml;chte, deren Aufbewahrungsfrist abgelaufen ist, aber die man grunds&auml;tzlich noch behalten m&ouml;chte &#8211; zum Beispiel um eine Historie der Umsatzentwicklung zu erhalten und gleichzeitig die Kundendaten nicht unn&ouml;tig lange vorzuhalten. Ein anderer ist, dass man eine Datenbank zur Ansicht oder f&uuml;r die Weiterentwicklung an einen anderen Software-Entwickler weitergeben m&ouml;chte. Auch wenn es das Instrument der Vertraulichkeitsvereinbarung gibt, kann es doch nicht schaden, diese Daten erst gar nicht aus dem Haus zugeben. In diesem Beitrag stellen wir ein Add-In vor, dass Access eine Funktion zum Anonymisieren von Daten hinzuf&uuml;gt. Das Grundger&uuml;st dazu haben wir bereits im Beitrag &#8222;Daten anonymisieren&#8220; (www.access-im-unternehmen.de\/1112) vorgestellt. Im vorliegenden Beitrag erweitern und optimieren wir diese L&ouml;sung und bauen sie so um, dass sie auch als Add-In auf die Inhalte der aktuellen Datenbank angewendet werden kann.<\/b><\/p>\n<p>Im Beitrag <b>Daten anonymisieren <\/b>(<b>www.access-im-unternehmen.de\/1112<\/b>) haben wir erstmals ein Beispiel daf&uuml;r geliefert, wie man die Daten in Access-Tabellen anonymisieren kann. Hier haben wir nur zwei verschiedene Anonymisierungsarten genutzt. Die eine hat eine zuf&auml;llige Zeichenfolge generiert, die eine bestimmte Mindest- und H&ouml;chstanzahl zuf&auml;lliger Zeichen enth&auml;lt. Die zweite hat die Anzahl der Zeichen beibehalten und diese lediglich verfremdet.<\/p>\n<p>In der L&ouml;sung aus dem vorliegenden Beitrag gibt es verschiedene Neuerungen:<\/p>\n<ul>\n<li>Es gibt drei neue Anonymisiserungsarten, die bereits eingebaut sind, und zwei f&uuml;r zwei weitere beschreiben wir den Ablauf, um diese selbst hinzuzuf&uuml;gen.<\/li>\n<li>Die Datenbank kann nun als Access-Add-In direkt in der Anwendung ge&ouml;ffnet werden, deren Daten anonymisiert werden sollen.<\/li>\n<li>Daf&uuml;r werden direkt die Daten der aktuell ge&ouml;ffneten Datenbank anonymisiert.<\/li>\n<\/ul>\n<p>Dies bedeutet, dass Sie eine Kopie der Anwendung anlegen m&uuml;ssen, deren Daten Sie dann anonymisieren und beispielsweise f&uuml;r die Weitergabe an einen externen Entwickler nutzen k&ouml;nnen.<\/p>\n<h2>Achtung: SQL-Server-Datenbank<\/h2>\n<p>Besondere Vorsicht ist bei Verwendung des SQL Servers geboten. Hier reicht es nicht aus, einfach eine Kopie des Frontends zu machen, von dem aus wir das Access-Add-In zum Anonymisieren &ouml;ffnen. Eine Kopie des Frontends verweist n&auml;mlich ohne weitere &Auml;nderungen auf die gleiche SQL Server-Datenbank wie das Original &#8211; zumindest, wenn wir keine weiteren &Auml;nderungen vornehmen. In diesem Fall muss also eine Kopie der SQL Server-Datenbank erstellt werden und das Frontend, von dem aus die Daten anonymisiert werden sollen, muss die Tabellen der Kopie einbinden.<\/p>\n<h2>Neue Anonymisierungsarten<\/h2>\n<p>Wir haben drei neue Anonymisierungsarten hinzugef&uuml;gt:<\/p>\n<ul>\n<li>Die erste kann wie die bereits vorhandenen Methoden auf Textfelder angewendet werden. Sie tr&auml;gt einfach einen immer gleichen Ausdruck ein und kombiniert diesen mit dem Prim&auml;rschl&uuml;sselwert. Daraus entstehen Werte wie <b>Artikel1<\/b>, <b>Artikel2<\/b>, <b>Artikel3 <\/b>und so weiter, die gegebenenfalls eine bessere Grundlage zum Nachvollziehen von Zusammenh&auml;ngen liefern.<\/li>\n<li>Die zweite neue M&ouml;glichkeit ist das Anonymisieren von Zahlenwerten. Hier bieten wir die M&ouml;glichkeit, f&uuml;r die neuen Werte eines Zahlenfeldes einen kleinsten und einen gr&ouml;&szlig;ten Wert sowie die Anzahl der Dezimalstellen festzulegen.<\/li>\n<li>Die dritte Variante ist f&uuml;r Datumsfelder gedacht. Auch hier k&ouml;nnen wir einen Bereich f&uuml;r die einzuf&uuml;genden Datumsangaben festlegen.<\/li>\n<\/ul>\n<h2>amvDatenAnonymisieren installieren<\/h2>\n<p>Die L&ouml;sung finden Sie im Download unter dem Namen <b>amvDatenAnonymisieren.accda<\/b>. Die Dateiendung deutet bereits darauf hin, dass es sich um ein Access-Add-In handelt.<\/p>\n<p>Dieses installieren wir, indem wir eine beliebige Access-Datenbank &ouml;ffnen und den Ribbonbefehl <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager<\/b> aufrufen.<\/p>\n<p>Hier klicken wir auf <b>Neues hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen im folgenden Dateidialog die <b>.accda<\/b>-Datei aus. Danach schlie&szlig;en wir den Add-In-Manager. Beim erneuten Aufklappen des Add-In-Men&uuml;s sehen wir den neuen Eintrag <b>amvDatenAnonymisieren <\/b>und k&ouml;nnen das Add-In durch Anklicken &ouml;ffnen.<\/p>\n<h2>Daten anonymisieren in der Praxis<\/h2>\n<p>Danach erscheint die Benutzeroberfl&auml;che des Add-Ins (siehe Bild 1). Hier sehen wir zun&auml;chst das Auswahlfeld <b>Konfiguration<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_001.png\" alt=\"Der Daten-Anonymisierer nach dem ersten Start\" width=\"549,559\" height=\"434,5742\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der Daten-Anonymisierer nach dem ersten Start<\/span><\/b><\/p>\n<p>Klicken wir es an, sehen wir einen weiteren Eintrag namens <b>Neue Konfiguration<\/b> (siehe Bild 2). W&auml;hlen wir diesen aus, erscheint eine Inputbox, der wir den Namen der zu erstellenden Konfiguration &uuml;bergeben k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_002.png\" alt=\"Anlegen einer neuen Konfiguration\" width=\"549,559\" height=\"124,365\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anlegen einer neuen Konfiguration<\/span><\/b><\/p>\n<p>F&uuml;r unsere Beispieldatenbank <b>S&uuml;dsturm.accda <\/b>geben wir hier beispielsweise den Namen <b>S&uuml;dsturm <\/b>ein. So k&ouml;nnen wir sp&auml;ter leicht erkennen, welche Konfiguration wir f&uuml;r welche Datenbank angelegt haben.<\/p>\n<p>Nach dem Anlegen wird die neue Konfiguration automatisch selektiert und auch die Schaltfl&auml;che <b>Tabellen und Felder einlesen <\/b>ist nun aktiviert (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_016.png\" alt=\"Die neue Konfiguration wird nun aktiviert.\" width=\"549,559\" height=\"128,5665\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die neue Konfiguration wird nun aktiviert.<\/span><\/b><\/p>\n<p>Wenn wir diese bet&auml;tigen, liest das Add-In alle Tabellen der aktuellen Datenbank mit Ausnahme derer, die mit <b>MSys&#8230; <\/b>beginnen ein. Zuvor erscheint der Hinweis, dass alle bestehenden Daten f&uuml;r diese Konfiguration gel&ouml;scht und &uuml;berschrieben werden.<\/p>\n<p>Wir sehen nun alle Tabellen der aktuellen Datenbank. Klappen wir einen der Eintr&auml;ge auf, sehen wir die enthaltenen Felder (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_004.png\" alt=\"Die Tabellen und Felder der aktuellen Anwendung\" width=\"549,559\" height=\"498,8304\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabellen und Felder der aktuellen Anwendung<\/span><\/b><\/p>\n<p>Hier k&ouml;nnen wir nun festlegen, welche Feldinhalte auf welche Art anonymisiert werden sollen.<\/p>\n<p>Wenn wir das Feld <b>Artikelname <\/b>anonymisieren wollen, w&auml;hlen wir beispielsweise den Eintrag <b>Ausdruck plus PK-ID <\/b>aus (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_018.png\" alt=\"Auswahl einer der Anonymisierungsarten\" width=\"424,5589\" height=\"318,9222\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Auswahl einer der Anonymisierungsarten<\/span><\/b><\/p>\n<p>Danach wird f&uuml;r diesen Eintrag das Feld <b>Wert1 <\/b>mit dem Namen des Feldes vorbelegt. Au&szlig;erdem sehen wir im Infobereich unten im Formular Hinweise zu den Bedeutungen der Felder <b>Wert1<\/b>, <b>Wert2 <\/b>und <b>Wert3 <\/b>(siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_006.png\" alt=\"Informationen zur Anonymisierung\" width=\"549,559\" height=\"437,1106\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Informationen zur Anonymisierung<\/span><\/b><\/p>\n<p>Au&szlig;erdem &auml;ndert sich auf der Ebene der Tabelle die Zahl in Klammern in der ersten Spalte. Diese gibt an, wie viele Felder mit Anonymisierungen versehen wurden. Auf diese Weise k&ouml;nnen wir auch bei zugeklappten Tabellen-Eintr&auml;gen schnell erkennen, hinter welchem Eintrag sich Anonymisierungen befinden.<\/p>\n<h2>Anonymisierung durchf&uuml;hren<\/h2>\n<p>Nun wird auch die Schaltfl&auml;che <b>Anonymisieren <\/b>aktiviert. Wenn wir diese bet&auml;tigen, erscheint eine R&uuml;ckfrage, ob die Anonymisierung durchgef&uuml;hrt werden soll. Best&auml;tigen wir dies, f&uuml;hrt das Add-In den Auftrag aus und tr&auml;gt f&uuml;r alle Datens&auml;tze der Tabelle <b>tblArtikel <\/b>im Feld <b>Artikel <\/b>die entsprechenden Werte ein.<\/p>\n<p>Anschlie&szlig;end k&ouml;nnen wir die Tabelle mit den anonymisierten Daten &ouml;ffnen und sehen das Ergebnis aus Bild 7. Das Feld wurde mit den Werten <b>Artikelname1<\/b>, <b>Artikelname2 <\/b>und so weiter gef&uuml;llt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_007.png\" alt=\"Tabelle mit anonymisierten Daten im Feld Artikel\" width=\"424,5589\" height=\"238,8727\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Tabelle mit anonymisierten Daten im Feld Artikel<\/span><\/b><\/p>\n<h2>Anonymisieren von Zahlenfeldern<\/h2>\n<p>Als N&auml;chstes wollen wir die Werte eines Zahlenfeldes anonymisieren. Hier bietet sich das Feld <b>Einzelpreis <\/b>der Tabelle <b>tblArtikel <\/b>an (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_008.png\" alt=\"Anonymisieren eines Zahlenfeldes\" width=\"549,559\" height=\"368,6272\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Anonymisieren eines Zahlenfeldes<\/span><\/b><\/p>\n<p>Dazu w&auml;hlen wir f&uuml;r dieses Feld den Eintrag <b>Zufallszahl <\/b>aus. Die Werte sind wie folgt zu f&uuml;llen:<\/p>\n<p><b>Wert1<\/b>: Kleinster Wert<\/p>\n<p><b>Wert2<\/b>: Gr&ouml;&szlig;ter Wert<\/p>\n<p><b>Wert3<\/b>: Nachkommastellen<\/p>\n<p>Die entsprechenden Hinweise werden wieder im unteren Bereich des Formulars eingeblendet.<\/p>\n<p>Hier legen wir fest, dass wir Preise im Bereich von 5 bis 20 EUR mit einer Nachkommastelle eintragen wollen.<\/p>\n<p>Wenn wir nun auf die Schaltfl&auml;che <b>Anonymisieren <\/b>klicken, wird das Feld <b>Artikelname <\/b>nochmals anonymisiert, allerdings mit den gleichen Werten wie zuvor. Wenn wir das nicht wollen, weil die Tabelle beispielsweise sehr viele Datens&auml;tze enth&auml;lt und der Vorgang lange dauert, k&ouml;nnen wir den Haken vorn f&uuml;r die Zeile mit dem Feld <b>Artikelname <\/b>entfernen.<\/p>\n<p>Anschlie&szlig;end starten wir die Anonymisierung und finden das Ergebnis aus Bild 9 vor.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_009.png\" alt=\"Tabelle mit anonymisierten Preisen\" width=\"700\" height=\"172,8298\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Tabelle mit anonymisierten Preisen<\/span><\/b><\/p>\n<h2>Datum anonymisieren<\/h2>\n<p>Schlie&szlig;lich wollen wir noch ein Datumsfeld anonymisieren. Dazu bietet sich die Tabelle <b>tblBestellungen <\/b>an.<\/p>\n<p>Hier w&auml;hlen wir f&uuml;r das Feld Bestelldatum den Eintrag <b>Zufallsdatum<\/b> aus und legen f&uuml;r die beiden Felder <b>Wert1 <\/b>und <b>Wert2 <\/b>das kleinste und das gr&ouml;&szlig;te Datum fest (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_010.png\" alt=\"Anonymisieren von Datumsangaben\" width=\"599,559\" height=\"387,4761\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Anonymisieren von Datumsangaben<\/span><\/b><\/p>\n<p>Klicken wir nun auf <b>Anonymisieren<\/b>, wird das Feld <b>Bestelldatum <\/b>mit zuf&auml;lligen Datumsangaben gef&uuml;llt.<\/p>\n<h2>Beenden des Add-Ins<\/h2>\n<p>Wenn wir das Add-In nun schlie&szlig;en, bleibt die Konfiguration im Add-In gespeichert. Wir k&ouml;nnen es also sp&auml;ter wieder aufrufen und die gespeicherte Konfiguration im Auswahlfeld oben selektieren.<\/p>\n<p>Dies l&auml;dt die bereits angelegte Konfiguration mit allen Tabellen, Feldern und Anonymisierungsparametern wieder in die Liste (siehe Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_011.png\" alt=\"Wiederherstellen eines Konfiguration\" width=\"424,5589\" height=\"152,0656\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Wiederherstellen eines Konfiguration<\/span><\/b><\/p>\n<h2>Erweitern des Add-Ins um eigene Anonymisierungsfunktionen<\/h2>\n<p>Wir haben nur f&uuml;nf Basisfunktionen f&uuml;r die Anonymisierung hinterlegt. Es gibt sicher Anwendungsf&auml;lle, in denen andere Funktionen erforderlich sind. Wie die Regeln definiert sind und wie Sie neue Funktionen anlegen k&ouml;nnen, schauen wir uns in den folgenden Abschnitten an. Dabei f&uuml;gen wir auch gleich noch weitere Funktionen hinzu.<\/p>\n<p>Zum Hinzuf&uuml;gen einer Anonymisierungsfunktion sind folgende Schritte erforderlich:<\/p>\n<ul>\n<li>Der erste ist das Anlegen eines neuen Eintrags in der Tabelle <b>tblErsetzenMit<\/b>.<\/li>\n<li>Der zweite ist das Hinzuf&uuml;gen der Anonymisierungsfunktion im Modul <b>mdlAnonymisieren<\/b>.<\/li>\n<li>Der dritte ist das Hinzuf&uuml;gen des Aufrufs der Anonymisierungsfunktion in der Prozedur <b>cmdAnonymisieren_Click<\/b> im Modul <b>Form_frmDatenAnonymisieren<\/b>.<\/li>\n<\/ul>\n<h2>Wichtig: Immer direkt im Add-In programmieren<\/h2>\n<p>Wenn wir &Auml;nderungen an einem Add-In vornehmen wollen, m&uuml;ssen wir dazu immer direkt die <b>.accda<\/b>-Datenbank &ouml;ffnen. Was oft geschieht und verf&uuml;hrerisch ist, sind VBA-Fehler beim produktiven Einsatz des Add-Ins, die man direkt an Ort und Stelle repariert. Bei der n&auml;chsten Nutzung wundert man sich dann, dass der Fehler wieder auftaucht und die &Auml;nderungen zur Behebung des Fehlers nicht gespeichert wurden.<\/p>\n<p>Das Problem ist, dass wir zwar VBA-Fehler im Code des Add-Ins bei der Verwendung von einer anderen Datenbankanwendung aus feststellen k&ouml;nnen, aber der Code des VBA-Projekts des Add-Ins ist zu diesem Zeitpunkt nicht speicherbar.<\/p>\n<p>Ein Workaround ist, die Fehlerbehebung gleich an Ort und Stelle durchzuf&uuml;hren, da man dies so gleich testen kann, und dann das Modul mit dem ge&auml;nderten Code in die Zwischenablage zu kopieren, um es sp&auml;ter im eigentlichen Add-In wieder einzuf&uuml;gen.<\/p>\n<h2>Beispiel f&uuml;r eine neue Anonymisierungsfunktion<\/h2>\n<p>Wir wollen dem Add-In eine Funktion zum Anonymisieren von <b>Ja\/Nein<\/b>-Feldern hinzuf&uuml;gen. Hier stehen nur zwei Werte zur Verf&uuml;gung. Gibt es hier &uuml;berhaupt Spielraum f&uuml;r den Einsatz der Parameter f&uuml;r die Anonymisierungen? Ja, denn wir k&ouml;nnen festlegen, mit welcher Wahrscheinlichkeit die Werte <b>True <\/b>oder <b>False <\/b>eingetragen werden sollen.<\/p>\n<p>Wir legen zun&auml;chst einen neuen Datensatz mit den Einstellungen f&uuml;r die Anonymisierung f&uuml;r <b>Ja\/Nein<\/b>-Felder in der Tabelle <b>tblErsetzenMit <\/b>an (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_012.png\" alt=\"Einstellungen f&uuml;r den Anonymisierungstyp Ja\/Nein\" width=\"700\" height=\"168,1725\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Einstellungen f&uuml;r den Anonymisierungstyp Ja\/Nein<\/span><\/b><\/p>\n<p>Im Feld <b>ErsetzenMit <\/b>tragen wir die Bezeichnung ein, die sp&auml;ter im Auswahlfeld im Formular des Add-Ins erscheinen soll. Wir wollen zwei Parameter hinterlegen. Der erste gibt die Wahrscheinlichkeit f&uuml;r den Wert <b>True <\/b>an, der zweite die Wahrscheinlichkeit f&uuml;r den Wert <b>False<\/b>. Wir tragen auch gleich zwei Beispielwerte daf&uuml;r ein, n&auml;mlich <b>50 <\/b>f&uuml;r das Feld <b>Wert1 <\/b>und ebenfalls <b>50 <\/b>f&uuml;r das Feld <b>Wert2<\/b>.<\/p>\n<p>Die Werte sollen immer ins Verh&auml;ltnis gesetzt werden &#8211; wir k&ouml;nnen also auch 1 und 1 eintragen, wenn wir eine gleichm&auml;&szlig;ige Verteilung w&uuml;nschen. Oder wir tragen <b>2 <\/b>und <b>1 <\/b>ein, wenn in zwei von drei F&auml;llen <b>True <\/b>gesetzt werden soll.<\/p>\n<h2>Anonymisierungsfunktion programmieren<\/h2>\n<p>Im Modul <b>mdlAnonymisierung <\/b>finden wir bereits die f&uuml;nf Funktionen vor, mit denen die anderen Anonymisierungen durchgef&uuml;hrt werden. Hier legen wir eine neue Funktion namens <b>JaNein <\/b>an.<\/p>\n<p>Diese nimmt per Parameter die beiden Werte <b>lngJa <\/b>und <b>lngNein <\/b>entgegen. In der Funktion ermitteln wir mit <b>Rnd() <\/b>einen Zufallswert zwischen <b>0 <\/b>und <b>1<\/b>. F&uuml;r diesen pr&uuml;fen wir, ob er kleiner als der Wert von <b>lngJa <\/b>durch die Summe der Werte <b>lngJa <\/b>und <b>lngNein <\/b>ist. <\/p>\n<p>Im Falle der Werte <b>1 <\/b>f&uuml;r <b>lngJa <\/b>und <b>1 <\/b>f&uuml;r <b>lngNein <\/b>pr&uuml;fen wir also, ob <b>Rnd() <\/b>kleiner als <b>0,5 <\/b>ist:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>JaNein(lngJa<span style=\"color:blue;\"> As Long<\/span>, lngNein<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>bol<span style=\"color:blue;\"> As Boolean<\/span>\r\n     bol = Rnd() &lt; lngJa \/ (lngJa + lngNein)\r\n     JaNein = bol\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Mit der folgenden Prozedur k&ouml;nnen wir diese Funktion testen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Test_JaNein()\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnzahlJa<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAnzahlNein<span style=\"color:blue;\"> As Long<\/span>\r\n     For i = 1 To 10000\r\n         <span style=\"color:blue;\">If <\/span>JaNein(3, 1) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             lngAnzahlJa = lngAnzahlJa + 1\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             lngAnzahlNein = lngAnzahlNein + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Debug.Print<\/span> lngAnzahlJa, lngAnzahlNein\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Dabei rufen wir die Funktion 10.000 Mal auf und &uuml;bergeben zum Beispiel die Werte <b>3 <\/b>und <b>1 <\/b>f&uuml;r die Parameter <b>lngJa <\/b>und <b>lngNein<\/b>.<\/p>\n<p>Jedes Mal, wenn die Funktion <b>JaNein <\/b>den Wert <b>True<\/b> zur&uuml;ckliefert, erh&ouml;hen wir den Wert der Variablen <b>lngAnzahlJa <\/b>um eins, anderenfalls den Wert der Variablen <b>lngAnzahlNein<\/b>. Anschlie&szlig;end geben wir die beiden Werte aus. Dabei erhalten wir beispielsweise ein Ergebnis wie dieses hier:<\/p>\n<pre>7518          2482<\/pre>\n<h2>Einbau des Aufrufs in die Prozedur cmdAnonymisieren_Click<\/h2>\n<p>Damit kommen wir zur Erl&auml;uterung der Prozedur, die den Anonymisierungsvorgang steuert und in die wir auch die Aufrufe weiterer Anonymisierungsfunktionen einf&uuml;gen k&ouml;nnen (siehe Listing 1 ).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAnonymisieren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>dbc<span style=\"color:blue;\"> As <\/span>DAO.Database, dbAnonymisieren<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rstAnonymisieren<span style=\"color:blue;\"> As <\/span>DAO.Recordset, rstTabellen<span style=\"color:blue;\"> As <\/span>DAO.Recordset, rstFelder<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strPK<span style=\"color:blue;\"> As String<\/span>, strTabelle<span style=\"color:blue;\"> As String<\/span>    \r\n     If <span style=\"color:blue;\">MsgBox<\/span>(\"Sicher, dass die Daten in dieser Datenbank anonymisiert werden sollen?\", vbYesNo + <span style=\"color:blue;\">vbCr<\/span>itical, _\r\n             \"Daten anomysieren\") = vbYes Then\r\n         DoCmd.Hourglass <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> dbAnonymisieren = CurrentDb\r\n         <span style=\"color:blue;\">Set<\/span> dbc = CodeDb\r\n         <span style=\"color:blue;\">Set<\/span> rstTabellen = dbc.OpenRecordset(\"SELECT DISTINCT tblTabellen.TabelleID, tblTabellen.Tabellenname \" _\r\n             & \"FROM tblTabellen INNER JOIN tblFelder ON tblTabellen.TabelleID = tblFelder.TabelleID \" _\r\n             & \"WHERE tblFelder.Anonymisieren = True\", dbOpenDynaset)\r\n         <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstTabellen.EOF\r\n             <span style=\"color:blue;\">Set<\/span> rstFelder = dbc.OpenRecordset(\"SELECT * FROM tblFelder WHERE Anonymisieren = TRUE AND TabelleID = \" _\r\n                 & rstTabellen!TabelleID, dbOpenDynaset)\r\n             <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstFelder.EOF\r\n                 <span style=\"color:blue;\">Set<\/span> rstAnonymisieren = dbAnonymisieren.OpenRecordset(\"SELECT * FROM \" & rstTabellen!Tabellenname, _\r\n                     dbOpenDynaset, dbSeeChanges)\r\n                 <span style=\"color:blue;\">If <\/span>rstFelder!ErsetzenMitID = 3<span style=\"color:blue;\"> Then<\/span>\r\n                     strTabelle = rstTabellen!Tabellenname\r\n                     strPK = PKErmitteln(dbAnonymisieren, strTabelle)\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstAnonymisieren.EOF\r\n                     rstAnonymisieren.Edit\r\n                     Select Case rstFelder!ErsetzenMitID\r\n                         <span style=\"color:blue;\">Case <\/span>1\r\n                             rstAnonymisieren(rstFelder!Feldname) = Zufallszeichenkette(rstFelder!Wert1, _\r\n                                 rstFelder!Wert2, rstFelder!Wert3)\r\n                         <span style=\"color:blue;\">Case <\/span>2\r\n                             rstAnonymisieren(rstFelder!Feldname) = BuchstabenVerfremden(Nz(rstAnonymisieren( _\r\n                                 rstFelder!Feldname), \"\"))\r\n                         <span style=\"color:blue;\">Case <\/span>3\r\n                             rstAnonymisieren(rstFelder!Feldname) = AusdruckPlusID(rstAnonymisieren.Fields(strPK), _\r\n                                 rstFelder!Wert1)\r\n                         <span style=\"color:blue;\">Case <\/span>4\r\n                             rstAnonymisieren(rstFelder!Feldname) = Zufallszahl(rstFelder!Wert1, rstFelder!Wert2, _\r\n                                  rstFelder!Wert3)\r\n                         <span style=\"color:blue;\">Case <\/span>5\r\n                             rstAnonymisieren(rstFelder!Feldname) = Zufallsdatum(rstFelder!Wert1, rstFelder!Wert2)\r\n                         <span style=\"color:blue;\">Case <\/span>6\r\n                             rstAnonymisieren(rstFelder!Feldname) = JaNein(rstFelder!Wert1, rstFelder!Wert2)\r\n                         <span style=\"color:blue;\">Case Else<\/span>\r\n                             <span style=\"color:blue;\">Debug.Print<\/span> rstFelder!ErsetzenMitID\r\n                     <span style=\"color:blue;\">End Select<\/span>\r\n                     rstAnonymisieren.Update\r\n                     rstAnonymisieren.Move<span style=\"color:blue;\">Next<\/span>\r\n                 <span style=\"color:blue;\">Loop<\/span>\r\n                 rstFelder.Move<span style=\"color:blue;\">Next<\/span>\r\n             <span style=\"color:blue;\">Loop<\/span>\r\n             rstTabellen.Move<span style=\"color:blue;\">Next<\/span>\r\n         <span style=\"color:blue;\">Loop<\/span>\r\n         DoCmd.Hourglass <span style=\"color:blue;\">False<\/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: Prozedur zum Steuern der Anonymisierung<\/span><\/b><\/p>\n<p>Die Prozedur deklariert gleich zwei Variablen des Typs Database. Die erste namens <b>dbc <\/b>ben&ouml;tigen wir f&uuml;r den Zugriff auf die Elemente der Add-In-Datenbank. Wir f&uuml;llen sie mit der Funktion <b>CodeDb<\/b>. Die zweite hei&szlig;t <b>dbAnonymisieren <\/b>und wird mit <b>CurrentDb <\/b>gef&uuml;llt, damit sie die aktuell ge&ouml;ffneten Datenbank referenziert.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir verschiedene <b>Recordset<\/b>-Variablen. Die erste namens <b>rstAnonymisieren <\/b>soll die Datens&auml;tze der Tabelle mit den zu anonymisierenden Daten aufnehmen. Das Recordset <b>rstTabellen <\/b>nimmt die Datens&auml;tze der Tabelle <b>tblTabellen <\/b>f&uuml;r die aktuelle Konfiguration auf, das Recordset <b>rstFelder <\/b>f&uuml;llen wir jeweils mit den Feldern der aktuell verarbeiteten Tabelle.<\/p>\n<p>Nach dem Best&auml;tigen der Meldungsbox mit dem Hinweis, dass nun Daten in der Datenbank ge&auml;ndert werden, geht es mit dem Aktivieren der Sanduhr los. Dann weisen wir den beiden <b>Database<\/b>-Variablen die Verweise auf die jeweilige Datenbank zu.<\/p>\n<p>Anschlie&szlig;end f&uuml;llen wir das Recordset <b>rstTabellen <\/b>mit allen Datens&auml;tzen der Tabelle <b>tblTabellen<\/b>, die mindestens mit einem Datensatz der Tabelle <b>tblFelder <\/b>verkn&uuml;pft sind, dessen Feld <b>Anonymisieren <\/b>auf <b>True <\/b>eingestellt ist.<\/p>\n<p>Dieses Recordset durchlaufen wir in einer <b>Do While<\/b>-Schleife. Innerhalb der Schleife f&uuml;llen wir das Recordset <b>rstFelder <\/b>mit allen Eintr&auml;gen der Tabelle <b>tblFelder<\/b>, die zur aktuellen Tabelle geh&ouml;ren.<\/p>\n<p>Auch diese durchlaufen wir in einer <b>Do While<\/b>-Schleife.<\/p>\n<p>Nun holen wir uns ein Recordset auf Basis der zu anonymisierenden Tabelle, die wir aus <b>rstTabellen <\/b>ermitteln.<\/p>\n<p>Sollte die Ersetzungsmethode mit dem Wert <b>3 <\/b>im Feld <b>ErsetzenMitID <\/b>gew&auml;hlt worden sein, schreiben wir den Namen der Tabelle in die Variable <b>strTabelle <\/b>und ermitteln au&szlig;erdem mit der Funktion <b>PKErmitteln <\/b>den Namen des Prim&auml;rschl&uuml;sselfeldes der Tabelle, den wir in die Variable <b>strPK <\/b>eintragen.<\/p>\n<p>Danach durchlaufen wir alle Datens&auml;tze des Recordsets mit den zu anonymisierenden Daten und aktivieren mit der Edit-Methode den Bearbeitungsmodus.<\/p>\n<p>Nun ermitteln wir in einer <b>Select Case<\/b>-Bedingung die zu verwendende Anonymisierungsmethode und weisen dem betroffenen Feld den Wert der Funktion zu, welcher der gew&auml;hlten Methode entspricht &#8211; also beispielsweise <b>Zufallszeichenkette <\/b>oder <b>BuchstabenVerfremden<\/b>.<\/p>\n<p>An dieser Stelle f&uuml;gen wir auch den sechsten Fall mit der Funktion <b>JaNein <\/b>und den Parametern, die wir aus den Feldern <b>Wert1 <\/b>und <b>Wert2 <\/b>ermitteln.<\/p>\n<p>Danach aktualisieren wir den aktuellen Datensatz des Recordsets <b>rstAnonymisieren <\/b>und fahren mit dem folgenden Datensatz vor.<\/p>\n<p>Sind alle Datens&auml;tze f&uuml;r dieses Feld in dieser Tabelle angepasst, gehen wir die &uuml;brigen Felder dieser Tabelle durch, f&uuml;r die Anonymisierungen geplant sind, und bearbeiten schlie&szlig;lich die &uuml;brigen Tabellen.<\/p>\n<h2>Weitere Funktion zum Ermitteln zuf&auml;lliger abh&auml;ngiger Datumsangaben<\/h2>\n<p>Wenn wir beispielsweise Datumsangaben anonymisieren wollen und es sich dabei um mehrere Felder handelt, die voneinander abh&auml;ngig sind, kommen wir allein mit der Funktion <b>Zufallsdatum <\/b>nicht aus.<\/p>\n<p>Wenn wir beispielsweise Bestelldatum und Lieferdatum mit Werten f&uuml;llen wollen, sollte das Lieferdatum immer nach dem Bestelldatum liegen.<\/p>\n<p>Wir k&ouml;nnten nun zwar f&uuml;r das Bestelldatum als Unter- und Obergrenze beispielsweise <b>1.1.2025 <\/b>und <b>30.6.2025 <\/b>sowie <b>1.7.2025 <\/b>und <b>31.12.2025 <\/b>eintragen. Aber wenn die Lieferdaten beispielsweise immer zwischen zwei und f&uuml;nf Tagen hinter dem Bestelldatum liegen, schr&auml;nkt uns diese Funktion allen zu sehr ein.<\/p>\n<p>Also entwickeln wir eine neue Funktion namens <b>Abh&auml;ngiges Zufallsdatum<\/b>. Dieses soll den Wert eines anderen Datumsfeldes als Referenz nutzen und dann Tage hinzuaddieren, die sich in einem bestimmten Bereich befinden, der mit dem zweiten und dritten Parameter angegeben wird.<\/p>\n<p>Zun&auml;chst bauen wir wieder den Eintrag in die Tabelle <b>tblErsetzenMit <\/b>ein, der diesmal wie in Bild 13 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_013.png\" alt=\"Konfiguration f&uuml;r abh&auml;ngige Datumsangaben\" width=\"700\" height=\"180,4196\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Konfiguration f&uuml;r abh&auml;ngige Datumsangaben<\/span><\/b><\/p>\n<p>Danach f&uuml;gen wir die Funktion aus Listing 2 zum Modul <b>mdlAnonymisieren <\/b>hinzu. Die Funktion nimmt das Referenzdatum sowie den minimalen und den maximalen Abstand von diesem Datum entgegen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AbhaengigesZufallsdatum(datReferenz<span style=\"color:blue;\"> As Date<\/span>, lngMindestabstand<span style=\"color:blue;\"> As Long<\/span>, lngMaximalabstand<span style=\"color:blue;\"> As Long<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngAbstand<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>dat<span style=\"color:blue;\"> As Date<\/span>\r\n     lngAbstand = Fix(Rnd(Now) * (lngMaximalabstand + 1 - lngMindestabstand) + lngMindestabstand)\r\n     dat = datReferenz + lngAbstand\r\n     AbhaengigesZufallsdatum = dat\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion von Ermitteln von Datumswerten abh&auml;ngig von einem Referenzdatum<\/span><\/b><\/p>\n<p>Dann ermittelt sie einen zuf&auml;lligen Abstand. Dieser wird zum Referenzdatum addiert und das Ergebnis zur&uuml;ckgegeben.<\/p>\n<p>Schlie&szlig;lich f&uuml;gen wir der <b>Select Case<\/b>-Bedingung der Prozedur <b>cmdAnonymisieren_Click <\/b>noch einen <b>Case<\/b>-Zweig hinzu, der diese Funktion aufruft (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAnonymisieren_Click()\r\n     ...\r\n     Select Case rstFelder!ErsetzenMitID\r\n         ...         \r\n         <span style=\"color:blue;\">Case <\/span>7\r\n             rstAnonymisieren(rstFelder!Feldname) = AbhaengigesZufallsdatum(rstAnonymisieren.Fields(rstFelder!Wert1), _\r\n                 rstFelder!Wert2, rstFelder!Wert3)\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Anpassung der Prozedur cmdAnonymisieren_Click<\/span><\/b><\/p>\n<h2>Abh&auml;ngige Datumsangaben anonymisieren<\/h2>\n<p>Wenn wir nun in der Beispieldatenbank das Add-In &ouml;ffnen, k&ouml;nnen wir die Untereintr&auml;ge der Tabelle <b>tblBestellungen <\/b>erweitern. Hier sehen wir das Feld <b>Bestelldatum<\/b>, das wir bereits anonymisiert haben (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_019.png\" alt=\"Einstellungen zum Anonymisieren von Datumsfeldern\" width=\"574,559\" height=\"448,7114\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Einstellungen zum Anonymisieren von Datumsfeldern<\/span><\/b><\/p>\n<p>Darunter sehen wir die beiden Felder <b>Lieferdatum <\/b>und <b>Versanddatum<\/b>. Das Lieferdatum soll ein oder zwei Tage nach dem Bestelldatum liegen, das Versanddatum weitere ein oder zwei Tage dahinter.<\/p>\n<p>Also w&auml;hlen wir erst f&uuml;r das Feld <b>Lieferdatum <\/b>den Eintrag <b>Abh&auml;ngiges Zufallsdatum <\/b>aus und geben als ersten Wert den Namen des Datumsfeldes an, das als Referenz verwendet werden soll. F&uuml;r den zweiten und dritten Wert geben wir die minimale und die maximale Anzahl von Tagen nach diesem Datum an.<\/p>\n<p>F&uuml;r das Feld <b>Versanddatum <\/b>gehen wir genauso vor, nur dass wir nun das Feld <b>Lieferdatum <\/b>als Referenzdatum verwenden.<\/p>\n<p>Wenn im Beispiel das Versanddatum mit dem Lieferdatum &uuml;bereinstimmen soll, k&ouml;nnen wir auch einfach die Werte <b>0 <\/b>f&uuml;r <b>Wert1 <\/b>und <b>Wert2 <\/b>angeben.<\/p>\n<p>Wir k&ouml;nnen theoretisch auch festlegen, dass das Lieferdatum vor dem Versanddatum liegen soll. Dazu geben wir einfach negative Werte an, zum Beispiel <b>-2 <\/b>und <b>-1<\/b>. Wichtig ist nur, dass der zweite Wert gr&ouml;&szlig;er als der erste ist, was hier der Fall ist.<\/p>\n<p>Eine Einschr&auml;nkung an dieser Stelle ist, dass wir die Abh&auml;ngigkeit nur in der Reihenfolge der Felder im Tabellenentwurf gestalten k&ouml;nnen. Wenn das Bestelldatum im Tabellenentwurf beispielsweise unter Lieferdatum und Versanddatum angelegt ist, k&ouml;nnten wir in einem ersten Schritt das Bestelldatum anonymisieren und in einem zweiten Schritt die beiden Felder <b>Lieferdatum <\/b>und <b>Versanddatum <\/b>bearbeiten.<\/p>\n<p>Dazu m&uuml;ssen wir lediglich sicherstellen, dass im zweiten Schritt der Haken vor dem Feld <b>Bestelldatum <\/b>entfernt wird.<\/p>\n<p>Das Ergebnis sieht beispielsweise wie in Bild 15 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_06\/pic_1579_015.png\" alt=\"Anonymisierte abh&auml;ngige Datumsangaben\" width=\"649,559\" height=\"239,2058\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Anonymisierte abh&auml;ngige Datumsangaben<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Auf die gleiche Weise wie f&uuml;r die in den vorherigen Beispielen beschriebenen Erweiterungen k&ouml;nnen Sie weitere Anonymisierungen hinzuf&uuml;gen.<\/p>\n<p>Damit erhalten Sie mit diesem Beitrag ein praktisches Access-Add-In, mit dem Sie die Daten der Tabellen einer Datenbankanwendung anonymisieren k&ouml;nnen.<\/p>\n<p>Nochmal als Hinweis: Bitte arbeiten Sie nur mit Sicherungen der Datenbank, wenn es sich um eine reine Access-Datenbank handelt.<\/p>\n<p>Und beachten Sie, dass bei verkn&uuml;pften Tabellen aus einer Backenddatenbank oder einem SQL Server eine Kopie des jeweiligen Backends angelegt und verkn&uuml;pft wird, bevor Sie die Daten anonymisieren.<\/p>\n<p>Anderenfalls k&ouml;nnten versehentlich Originaldaten verfremdet werden.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvDatenAnonymisieren.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/B0551CF3-3053-4A11-9C7E-1ED9E0E947ED\/aiu_1579.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt verschiedene Gr&uuml;nde zum Anonymisieren von Daten. Einer ist, dass man Daten aus Datenschutzgr&uuml;nden verfremden m&ouml;chte, deren Aufbewahrungsfrist abgelaufen ist, aber die man grunds&auml;tzlich noch behalten m&ouml;chte &#8211; zum Beispiel um eine Historie der Umsatzentwicklung zu erhalten und gleichzeitig die Kundendaten nicht unn&ouml;tig lange vorzuhalten. Ein anderer ist, dass man eine Datenbank zur Ansicht oder f&uuml;r die Weiterentwicklung an einen anderen Software-Entwickler weitergeben m&ouml;chte. Auch wenn es das Instrument der Vertraulichkeitsvereinbarung gibt, kann es doch nicht schaden, diese Daten erst gar nicht aus dem Haus zu geben. In diesem Beitrag stellen wir ein Add-In vor, das Access eine Funktion zum Anonymisieren von Daten hinzuf&uuml;gt. Das Grundger&uuml;st dazu haben wir bereits im Beitrag &#8222;Daten anonymisieren&#8220; (www.access-im-unternehmen.de\/1112) vorgestellt. Im vorliegenden Beitrag erweitern und optimieren wir diese L&ouml;sung und bauen sie so um, dass sie auch als Add-In auf die Inhalte der aktuellen Datenbank angewendet werden kann.<\/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,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662025,66062025,44000027],"tags":[],"class_list":["post-55001579","post","type-post","status-publish","format-standard","hentry","category-662025","category-66062025","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Daten anonymisieren per Access-Add-In - 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\/Daten_anonymisieren_per_AccessAddIn\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Daten anonymisieren per Access-Add-In\" \/>\n<meta property=\"og:description\" content=\"Es gibt verschiedene Gr&uuml;nde zum Anonymisieren von Daten. Einer ist, dass man Daten aus Datenschutzgr&uuml;nden verfremden m&ouml;chte, deren Aufbewahrungsfrist abgelaufen ist, aber die man grunds&auml;tzlich noch behalten m&ouml;chte - zum Beispiel um eine Historie der Umsatzentwicklung zu erhalten und gleichzeitig die Kundendaten nicht unn&ouml;tig lange vorzuhalten. Ein anderer ist, dass man eine Datenbank zur Ansicht oder f&uuml;r die Weiterentwicklung an einen anderen Software-Entwickler weitergeben m&ouml;chte. Auch wenn es das Instrument der Vertraulichkeitsvereinbarung gibt, kann es doch nicht schaden, diese Daten erst gar nicht aus dem Haus zu geben. In diesem Beitrag stellen wir ein Add-In vor, das Access eine Funktion zum Anonymisieren von Daten hinzuf&uuml;gt. Das Grundger&uuml;st dazu haben wir bereits im Beitrag &quot;Daten anonymisieren&quot; (www.access-im-unternehmen.de\/1112) vorgestellt. Im vorliegenden Beitrag erweitern und optimieren wir diese L&ouml;sung und bauen sie so um, dass sie auch als Add-In auf die Inhalte der aktuellen Datenbank angewendet werden kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T21:34:31+00:00\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Daten anonymisieren per Access-Add-In\",\"datePublished\":\"2025-12-02T21:34:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/\"},\"wordCount\":3294,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2025\",\"6\\\/2025\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/\",\"name\":\"Daten anonymisieren per Access-Add-In - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2025-12-02T21:34:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Daten_anonymisieren_per_AccessAddIn\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Daten anonymisieren per Access-Add-In\"}]},{\"@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\\\/13395c4bcd7d7963efe33be9c584d93f\",\"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 Premium plugin. -->","yoast_head_json":{"title":"Daten anonymisieren per Access-Add-In - 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\/Daten_anonymisieren_per_AccessAddIn\/","og_locale":"de_DE","og_type":"article","og_title":"Daten anonymisieren per Access-Add-In","og_description":"Es gibt verschiedene Gr&uuml;nde zum Anonymisieren von Daten. Einer ist, dass man Daten aus Datenschutzgr&uuml;nden verfremden m&ouml;chte, deren Aufbewahrungsfrist abgelaufen ist, aber die man grunds&auml;tzlich noch behalten m&ouml;chte - zum Beispiel um eine Historie der Umsatzentwicklung zu erhalten und gleichzeitig die Kundendaten nicht unn&ouml;tig lange vorzuhalten. Ein anderer ist, dass man eine Datenbank zur Ansicht oder f&uuml;r die Weiterentwicklung an einen anderen Software-Entwickler weitergeben m&ouml;chte. Auch wenn es das Instrument der Vertraulichkeitsvereinbarung gibt, kann es doch nicht schaden, diese Daten erst gar nicht aus dem Haus zu geben. In diesem Beitrag stellen wir ein Add-In vor, das Access eine Funktion zum Anonymisieren von Daten hinzuf&uuml;gt. Das Grundger&uuml;st dazu haben wir bereits im Beitrag \"Daten anonymisieren\" (www.access-im-unternehmen.de\/1112) vorgestellt. Im vorliegenden Beitrag erweitern und optimieren wir diese L&ouml;sung und bauen sie so um, dass sie auch als Add-In auf die Inhalte der aktuellen Datenbank angewendet werden kann.","og_url":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-12-02T21:34:31+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Daten anonymisieren per Access-Add-In","datePublished":"2025-12-02T21:34:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/"},"wordCount":3294,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2025","6\/2025","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/","url":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/","name":"Daten anonymisieren per Access-Add-In - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2025-12-02T21:34:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Daten_anonymisieren_per_AccessAddIn\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Daten anonymisieren per Access-Add-In"}]},{"@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\/13395c4bcd7d7963efe33be9c584d93f","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\/55001579","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=55001579"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001579\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}