Selektives Ersetzen von Feldinhalten

Nicht immer soll der Feldinhalt genauso ausgegeben werden wie erfasst wurde. Manchmal sind kleinere Modifikationen erwünscht. Auch dafür stehen geeignete Funktionen zur Verfügung.

Manchmal kann es vorkommen, dass ein Feld Begriffe enthält, die man für die Druckausgabe durch andere Begriffe ersetzen möchte. Das könnte zum Beispiel der Fall sein, wenn im Feld Signatur die Position der Signatur eines Werkes stets mit u.l. abgekürzt wird, in der Druckausgabe jedoch unten links erscheinen soll. In diesem Beitrag beschreibe ich, welche Möglichkeiten der Listengenerator von MuseumPlus für solche Manipulationen bietet.

Der VBA-Befehl REPLACE

Der passende Befehl zum Ersetzen von Text im Wortschatz von VBA lautet REPLACE und hat die Syntax:

REPLACE (Text, Zeichenkette1, Zeichenkette2)

Die drei Parameter der Funktion haben dabei folgende Bedeutung:

  • Text: Text, der die zu ersetzende Zeichenkette enthält
  • Zeichenkette1: Zeichenkette, die ersetzt werden soll
  • Zeichenkette2: Zeichenkette, die stattdessen eingefügt werden soll

Im Listengenerator von MuseumPlus kann diese Funktion direkt verwendet werden, um Text innerhalb bestimmter Datenfelder bei der Ausgabe durch anderen Text zu ersetzen. Dabei wird wohlgemerkt der eigentliche Feldinhalt nicht verändert, vielmehr erfolgt der Ersetzungsvorgang direkt während der Druckausgabe.

Ein einfaches Beispiel für die Anwendung des Befehls ist die Ersetzung von Abkürzungen durch den entsprechenden ausgeschriebenen Text. Das Feld Signatur könnte die Abkürzung "u.l." enthalten, die bei der Druckausgabe durch "unten links" ersetzt werden soll. Der entsprechende Eintrag in der Listendefinition sähe dafür so aus:

=REPLACE([ObjDatierungS],"u.l.","unten links")

Übrigens: Wenn das Feld Datierung den zu ersetzenden Text nicht enthält, wird der Feldinhalt von der Funktion REPLACE unverändert als Ergebnis geliefert.

Einige Beispiele für praktische Ersetzungen

Ersetzung mehrerer Zeichenketten in einem Datenfeld

Etwas kniffliger wird es, wenn ein Datenfeld zum Beispiel neben der einen Abkürzung eine weitere beinhaltet, die ebenfalls ersetzt werden soll. In diesem Fall müssen mehrere Aufrufe der REPLACE-Funktion ineinander verschachtelt werden:

=REPLACE(REPLACE([ObjDatierungS],"u.r.","unten rechts"),"u.l.","unten links")

Diese Verschachtelung kann man (fast) beliebig weit fortführen, wenn in einem Text sehr viele zu ersetzende Zeichenketten enthalten sind. Aber ab einem bestimmten Punkt wird der Aufruf natürlich sehr unübersichtlich.

Standardkünstler bei der Ausgabe ausblenden

Eine Besonderheit von MuseumPlus ist, dass jedes Sammlungsobjekt mindestens eine Person aus dem Modul Künstler/Beteiligte zugeordnet haben muss - auch dann, wenn dem Objekt vielleicht kein Künstler oder sonstiger Beteiligter zugeordnet werden kann. Letztlich hat diese Eigenart nur technische Gründe, die allerdings bei der Druckausgabe durchaus stören können. Daher zeige ich in diesem Beispiel, wie man die Ausgabe des Standardkünstlers unterdrücken kann.

Auch dazu verwende ich die Funktion REPLACE, allerdings wird ihr als erster Parameter nicht direkt ein Feld zugewiesen, sondern sie muss nun die Ausgabe einer anderen Funktion verarbeiten - nämlich jener Listengeneratorfunktion, welche normalerweise alle einem Objekt zugewiesenen Künstler und Beteiligten als Textblock zurückliefert. Allerdings kann ich diese Funktion nicht in der gewohnten Schreibweise

=<<Beteiligte(1)>>

verwenden, da diese von der Funktion REPLACE nicht "verstanden" werden würde. Statt dessen sieht der VBA-konforme Aufruf der Funktion so aus:

=vObjBezugBeteiligte([ObjId],"''",1)

An dieser Stelle muss ich noch kurz die Parameter der Funktion vObjBezugBeteiligte erklären:

  • 1. Parameter: [ObjId]
    Enthält die Objekt-ID des aktuell ausgegebenen Objektes.
  • 2. Parameter: "''"
    Enthält eine Liste der Typen von Künstlerverknüpfungen, die bei der Ausgabe berücksichtigt werden. Ist die Liste wie im angegebenen Beispiel leer, werden alle Künstler ausgegeben.
  • 3. Parameter: 1
    Steuert - wie in der normalen Listengeneratorfunktion - das Ausgabeformat. Die Werte 0 und 1 stehen für eine kurze Ausgabe (es wird nur der Künstlername ausgegeben), die Werte 2 und 3 für eine lange Ausgabe inklusive der Lebensdaten. Bei Verwendung von geraden Parametern (0, 2) werden die einzelnen Künstler durch ein Semikolon voneinander getrennt, bei den ungeraden Parametern (1, 3) durch einen Zeilenumbruch.

Kombiniert mit der Funktion REPLACE wird dann also folgender Aufruf daraus:

=REPLACE(vObjBezugBeteiligte([ObjId],"''",1), "Standardkünstler",""), "Standardkünstler","")

Es wird also in der Ausgabe der Funktion vObjBezugBeteiligte() jedes Vorkommen des Textes "Standardkünstler" durch eine leere Zeichenkette ersetzt. Das Problem ist nun noch, dass bei mehreren zugewiesenen Künstlern nun immer noch das Trennzeichen ausgegeben wird, welches den Standardkünstler von den anderen Künstlern separiert hat - also ein Semikolon oder eine Leerzeile, je nach verwendetem Parameter 3 in der Funktion vObjBezugBeteiligte. Soll auch dies verhindert werden, muss ich jedes doppelte Vorkommen eines solchen Trennzeichens durch ein einfaches Vorkommen ersetzen. Für die durch Semikolon getrennte Ausgabe (0, 2) sieht der Ausdruck dann so aus:

=REPLACE(REPLACE(vObjBezugBeteiligte([ObjId],"''",1), "Standardkünstler",""), ";;", ";")

Und für die durch Zeilenumbruch getrennte Ausgabe (1, 3) ist folgender Ausdruck zu verwenden:

=REPLACE(REPLACE(vObjBezugBeteiligte([ObjId],"''",1), "Standardkünstler",""), chr(13) & chr(10) & chr(13) & chr(10), chr(13) & chr(10))