MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access - Code Archiv
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 13.10.2009, 15:26   #1
ebs17
MOF Guru
MOF Guru
Standard Codebeispiel - "Intelligente" Textanalyse

Es gibt eine Reihe von Aufgaben, da stößt die Anwendung und Kombination von VBA-Standardfunktionen (Left, Right, Mid, Instr, InstrRev, Split) an Grenzen, insbesondere wenn die zu analysierenden Textstellen variabel sind und sich nur schwer bis gar nicht in (herkömmliche) Regeln fassen lassen. An der Stelle oder schon deutlich vorher könnte man sich "regulärer Ausdrücke" bedienen.

Reguläre Ausdrücke (Regular Expressions) haben ihren Urspung in Perl (Webprogrammierung), sind aber auch auf einem normalen Officerechner und somit in Access einsetzbar. Die notwendige Bibliothek Microsoft VBScript Regular Expressions 5.5 (vbscript.dll) sollte i.d.R. vorhanden sein.
Mit regulären Ausdrücken kann man komplexe bis unmögliche Codekonstruktionen durch ein (teilweise anspruchsvolles) Suchmuster und einen sonst einfachen Ablauf ersetzen.

Beispiele:
Einfache Ersetzung/Filterung
Code:

Public Function fChangeText(sText As String) As String
    Dim Regex As Object
    Set Regex = CreateObject("Vbscript.Regexp")
    With Regex

        .Pattern = "\D"			' löscht alles außer Ziffern

        '.Pattern = "[^0-9,]"		' löscht alles außer Ziffern und Komma
        '.Pattern = "[^a-zA-ZäöüßÄÖÜ]" 	' löscht alles außer Buchstaben

        .Global = True			' Jedes Auftreten wird berücksichtigt
        fChangeText = .Replace(sText, "")
    End With
    Set Regex = Nothing
End Function

Debug.Print fChangeText("Ich möchte nur die Ziffern aus 12-4.56/444.5 haben.")
-> "124564445"

Erkennen (und Ersetzen) von kombinierten Ausdrücken
Code:

Public Function fEntferneZeitangabe(sText As String, sFehltext As String) As String
    Dim RegEx
    Set RegEx = CreateObject("Vbscript.regexp")
    With RegEx
        .Pattern = " [0-9]+ " & sFehltext
        .Global = False 'Nur das Erste Auftreten wird berücksichtigt
        fEntferneZeitangabe = .Replace(sText, "")
    End With
End Function

Debug.Print fEntferneZeitangabe("Neues aus der Anstalt vom 27.1.2009 - Kabarett 145 min.avi", "min")
-> "Neues aus der Anstalt vom 27.1.2009 - Kabarett.avi"
Bei der oftmaligen Wiederholung der Funktionen (Verwendung in Abfragen und Schleifen) wie oben gezeigt sollte man das Initialisieren der Objektvariable Regex aus der Funktion herausnehmen und einmalig vor Aufruf der Funktion vornehmen (sonst spürbare Performancebremse).


Finden von Mailadressen in einem Text. Einige zusätzliche Informationen können nebenbei ausgewertet werden.
Code:

Public cMatches As Object
Public m As Object
Public oRegEx As Object

Sub aufruf()
   Set oRegEx = CreateObject("Vbscript.regexp")
   Call fFindMailAdresses("webmäster@aßpheute.de = Email Adresse! " & _
      "a@b.c = Keine Email Adresse! " & _
      "master@the.universe = Email Adresse!, " & _
      "Max Mustermann M.M.treffer@heute.de, Susi Seelig Susi-S-Treff@hopp.com")
   
   Debug.Print "Treffer: " & cMatches.Count
   For Each m In cMatches
      Debug.Print m.Value & ";" & m.FirstIndex & ";" & m.Length
      Debug.Print m.SubMatches.Count & "--" & m.SubMatches(0) & "--" & _
         m.SubMatches(1) & "--" & m.SubMatches(2)
   Next
   Set m = Nothing
   Set cMatches = Nothing
   Set oRegEx = Nothing
End Sub

Public Sub fFindMailAdresses(sText As String)
'// Die erzeugte MatchCollection enthält identifizierte Mailadressen,
'// deren (0-basierte) Startposition im Text sowie deren Länge aus einem
'// vorgegebenen Text. Durch die Wiederholung eines gleichen (geklammerten)
'// Teilsuchmusters kann eine gefundene Mailadresse gleich zerlegt werden
'// (Alias, Domainname, Topleveldomain).

   With oRegEx
      ' Suchmuster
      .Pattern = "(\w[\wÄÖÜäöüß\.-]+)@(\w[\wÄÖÜäöüß\.-]+)\.(\w[\wÄÖÜäöüß\.-]+)"
      ' Alle oder nur erste Textstelle berücksichtigen
      .Global = True
      ' Treffer in MatchCollection eintragen
      Set cMatches = .Execute(sText)
   End With

End Sub
Viel Spaß beim Ausprobieren.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende

Geändert von ebs17 (13.10.2009 um 16:06 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 13.10.2009, 19:21   #2
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Nachtrag: Wer eigene Suchmuster zusammenstellen will und sonstige Informationen benötigt, findet hier weitere Hinweise:
http://www.aspheute.com/artikel/20000829.htm
http://de.selfhtml.org/perl/sprache/regexpr.htm

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 23.10.2009, 14:26   #3
Sascha Trowitzsch
MS-Office-Forum Team MS-Office-Forum Team
Standard

Bei den Links sollte vielleicht noch der zur Referenz zum MS-RegExpr-Objekts nicht fehlen:

http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Mehr dazu:
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Ciao, Sascha

__________________

Microsoft Access MVP
O2k bis O2010, VB6, VS2008, Delphi7, ...
Bitte keine ungefragten E-Mails. Probleme werden hier gelöst.
Bitte beachten: Grundlegendes zum Access-Forum

Knowhow auf Access-im-Unternehmen | Das Access 2007 Praxisbuch für Entwickler | www.mossTOOLs.de

Geändert von Sascha Trowitzsch (23.10.2009 um 14:29 Uhr).
Sascha Trowitzsch ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.03.2010, 16:19   #4
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Eine zusätzliche Anwendungsvariante:
- Mittels Barodescanner werden Einlieferungsnummern erfasst.
- Dabei haben diese Nummern je Dienstleister eine unterschiedliche Struktur, z.B. Dienstleister1 zwei Großbuchstaben und dann neun Ziffern, Dienstleister2 13 Ziffern
- An Hand der Einlieferungsnummer soll der Dienstleister ermittelt werden.
Code:

Public Function fTest_Dienstleister(ByVal sText As String) As String
   Dim RegEx As Object
   Dim vArr As Variant
   Dim i As Long
   fTest_Dienstleister = ""
   vArr = Array("Dienstleister1", "[A-Z]{2}[0-9]{9}", _
      "Dienstleister2", "[0-9]{13}")
   Set RegEx = CreateObject("Vbscript.Regexp")
   With RegEx
      For i = 0 To UBound(vArr) Step 2
         .Pattern = vArr(i + 1)
         .Global = False
         If .test(sText) Then
            fTest_Dienstleister = vArr(i)
            Exit For
         End If
      Next
   End With
   Set RegEx = Nothing
End Function

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 04.05.2010, 12:28   #5
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Kleine Anreicherung: Mit Trim, LTrim und RTrim kann man äußere Leerzeichen entfernen. Eine gleichartige Funktion, die auch andere Zeichen oder sogar Zeichenketten entfernt, könnte so aussehen:
Code:

Public Function fSpecialTrim(ByVal sText As String, ByVal sDelimiter As String, _
                     Optional ByVal bRight As Boolean = True) As String
   Dim RegEx As Object
   Set RegEx = CreateObject("Vbscript.Regexp")
   With RegEx
      If bRight Then
         .Pattern = "[" & sDelimiter & "]+$"
      Else
         .Pattern = "^[" & sDelimiter & "]+"
      End If
      .Global = True
      fSpecialTrim = .Replace(sText, "")
   End With
   Set RegEx = Nothing
End Function

' Aufruf links Glätten
?fSpecialTrim("%X%%X%%X%StringA%X%StringB%X%StringC%X%%X%%X%", "%X%", False)
-> StringA%X%StringB%X%StringC%X%%X%%X%

' Aufruf rechs Glätten
?fSpecialTrim("%X%%X%%X%StringA%X%StringB%X%StringC%X%%X%%X%", "%X%", True)
-> %X%%X%%X%StringA%X%StringB%X%StringC

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.01.2011, 00:55   #6
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

An dieser Stelle möchte ich einen Link ergänzen:
Acc2003 - Komma durch Komma mit Leerzeichen

Hier wird sehr schön gezeigt, wie man bei der Replace-Methode Teile des Suchmusters (Pattern) als Bestandteil des Ersetzungsmusters verwenden kann.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 21.05.2011, 17:18   #7
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Eine weitere Linkergänzung:
VBA - Codeoptimierung For Next Schleife

Hier zeigt ransi, wie man ermitteln kann, ob ein Wort, das Bestandteil einer vorgegebenen Liste ist, in einem zu durchsuchenden String enthalten ist (mit Rückgabe dieses Wortes).

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 02.06.2012, 18:35   #8
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Jürgen Auer hat auf seiner Seite Sql-und-Xml eine Vielzahl von Informationen inklusive theoretischem Unterbau bereitgestellt:
Reguläre Ausdrücke - einen Text nach komplexen Ausdrücken durchsuchen

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 20.10.2012, 01:08   #9
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Nachfolgend sind einige Hilfsfunktionen, die jeweils eine Methode eines RegEx-Objektes kapseln und so für verschiedenste Anwendungsformen wie z.B. Abfragen, Schleifen und natürlich auch Einzelaufrufe anbieten.
Die vorangestellte Property stellt ein RegEx-Objekt zur Verfügung, auf das dann ständig zugegriffen werden kann. Damit erzielt man u.a. Performancevorteile gegenüber der Variante, dass man dieses Objekt in einer Funktion erzeugt und diese Objekterzeugung pro Funktionsaufruf wiederholt würde.
Code:

Private pRegEx As Object

Public Property Get oRegEx() As Object
   If (pRegEx Is Nothing) Then Set pRegEx = CreateObject("Vbscript.Regexp")
   Set oRegEx = pRegEx
End Property

Public Function RegExTest(ByVal SourceText As String, _
      ByVal SearchPattern As String, _
      Optional ByVal bIgnoreCase As Boolean = True, _
      Optional ByVal bGlobal As Boolean = True, _
      Optional ByVal bMultiLine As Boolean = True) As Boolean
   
   With oRegEx
      .Pattern = SearchPattern
      .IgnoreCase = bIgnoreCase
      .Global = bGlobal
      .Multiline = bMultiLine
      RegExTest = .Test(SourceText)
   End With
End Function

Public Function RegExReplace(ByVal SourceText As String, _
      ByVal SearchPattern As String, _
      ByVal ReplaceText As String, _
      Optional ByVal bIgnoreCase As Boolean = True, _
      Optional ByVal bGlobal As Boolean = True, _
      Optional ByVal bMultiLine As Boolean = True) As String
   
   With oRegEx
      .Pattern = SearchPattern
      .IgnoreCase = bIgnoreCase
      .Global = bGlobal
      .Multiline = bMultiLine
      RegExReplace = .Replace(SourceText, ReplaceText)
   End With
End Function

Public Function RegExMatchCollection(ByVal SourceText As String, _
      ByVal SearchPattern As String, _
      Optional ByVal bIgnoreCase As Boolean = True, _
      Optional ByVal bGlobal As Boolean = True, _
      Optional ByVal bMultiLine As Boolean = True) As Object
   
   With oRegEx
      .Pattern = SearchPattern
      .IgnoreCase = bIgnoreCase
      .Global = bGlobal
      .Multiline = bMultiLine
      Set RegExMatchCollection = .Execute(SourceText)
   End With
End Function
RegExTest:
Hier wird einfach getestet, ob das Suchmuster (Pattern) im zu analysierenden Text vorkommt.
Beispiel: Es gibt einen zu testenden Artikel "Pullover Rot". Jetzt soll getestet werden, ob er einer der Wahlfarben rot, blau oder gelb entspricht.
Aufruf:
Code:

Sub aufruf_RegExTest()
   Dim Teststring As String
   Teststring = "Pullover Rot"
   
   If RegExTest(Teststring, " (rot|blau|gelb)$", False) Then
      Debug.Print "Treffer"
   Else
      Debug.Print "no"
   End If
End Sub
Mit dem dritten (farbig hervorgehobenen) Parameter kann man z.B. steuern, ob man das Ignorieren der Groß-/Kleinschreibung berücksichtigen will oder nicht.

RegExReplace:
Das Ersetzen erfolgt recht ähnlich zu der Replace-Methode von VBA, ist allerdings um einiges variabler und differenzierter.
Beispiel: In einem Text will man ein Wort ersetzen. Das VBA-Replace ersetzt alle gefundenen Zeichenfolgen ohne Rücksicht darauf, ob die Zeichenfolge ein eigenes Wort oder nur Teil eines Wortes ist. RegEx kann da unterscheiden.
Aufruf:
Code:

Sub aufruf_RegExReplace()
   Dim Textstring As String
   Textstring = "Es ist super, von einem Superhirn zu profitieren."

   Textstring = RegExReplace(Textstring, "\bsuper\b", "gigantisch")
   Debug.Print Textstring
End Sub
RegExMatchCollection:
Die Methode Execute erzeugt eine Matchcollection (Auflistung von Treffern). Dabei ist eine solche Matchcollection etwas anderes als eine VBA.Collection. Zur Auswertung einer Matchcollection muss man eine zusätzliche Funktion aufsetzen, die dann auswählt, welche der vielen Informationen der Matchcollection (Anzahl der Treffer, Trefferauflistung, einige Zusatzangaben zu Treffern wie Länge und Startposition im Text, Teiltreffer bei Subpattern) weiterverwendet werden sollen und wie die Ausgabe bzw. Nutzung der Ergebnisse erfolgen soll.
Beispiel: Ein zu analysierender Text enthält Teilinformationen. Für einen weiteren Text, der die Teilinformationen semikolongetrennt enthält, soll ermittelt werden, wieviele übereinstimmende Teilinformationen zum anderen Text bestehen, um z.B. eine Ähnlichkeit quantifizieren zu können.
Aufruf:
Code:

Sub AnzahlUebereinstimmungen()
   Dim sToFind As String
   Dim sFindIn As String
   sFindIn = "AX1;AX5 CX3,BX4;GH7-HZ4"
   sToFind = "AX1;AX5;CX3;DX8"

   Debug.Print CountOccur(sToFind, sFindIn)
End Sub

Public Function CountOccur(ByVal ToFind As String, FindIn As String) As Long
   Dim oMC As Object
   Dim sResPattern As String
   sResPattern = "(" & Join(Split(ToFind, ";"), "|") & ")"
   Set oMC = RegExMatchCollection(FindIn, sResPattern)
   CountOccur = oMC.Count
   Set oMC = Nothing
End Function

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 02.12.2013, 14:48   #10
habibi246
MOF User
MOF User
Standard

Danke Euch Allen! Hat Mir Sehr Geholfen!!!!
habibi246 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.08.2016, 14:53   #11
Forza SGD
MOF Profi
MOF Profi
Standard

Sehr hilfreich - Besten Dank!
Forza SGD ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.11.2016, 15:00   #12
halweg
MOF Koryphäe
MOF Koryphäe
Standard Position im Text finden

Ich wärme das Thema mal wieder auf in der Hoffnung, dass die Knowhow-Träger noch mitlesen.

Also inzwischen arbeite ich oft und erfolgreich mit den regulären Ausdrücken in VBA.
Eine Sache ist mir jedoch bisher nicht gelungen: Wenn ich mit einer regulären Suche eine bestimmte Textstelle im Dokument suche, z. B. über
Code:

Set folgen = RegExMatch_Collection(ActiveDocument.Content, "Anhang")
bekomme ich diesen Text im Dokument nicht gefunden (also z. B. markiert). So was wie
Code:

selection.start = folgen(0).FirstIndex
selection.End = folgen(0).FirstIndex + 20
funktioniert also nicht, da im Dokument hinsichtlich der Markierung offensichtlich verborgende Texte mitgezählt werden, die an RegExMatch_Collection nicht übergeben werden.

Konkret will ich eine Auflistung der Seitennummern erstellen, wo ein bestimmter regulärer Ausdruck gefunden wurde.
Geht das überhaupt?
Vielen Dank im Voraus!
halweg ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.11.2016, 15:33   #13
ebs17
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Detail- und andere Probleme bespricht man besser nicht in diesem Archiv-Thema, sondern in einem eigenem Thema in einem geeigneten Forum, dann gerne auch mit einem Beispieldokument.

Nur kurz: In der Matchcollection werden nur Treffer auf das Suchmuster gesammelt. Also müsste man an der Stelle prüfen, ob da auch wirklich von Dir erwartete Treffer erscheinen. Gibt es Treffer, kann man auch FirstIndex (0-basiert Position des ersten Zeichens im nachgefragten Text) und Length (Länge des Treffers) ableiten.
Textmarkierungen dürften dann ein Wordproblem sein.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.11.2016, 12:46   #14
halweg
MOF Koryphäe
MOF Koryphäe
Standard

Danke für die Rückmeldung, Eberhard
Bin deinem Rat gefolgt, bitte schau mal unter http://www.ms-office-forum.net/forum....php?p=1772364
halweg ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.