Beispiel: Snippet per Namen ersetzen

Erstellt: 2026-07-11 · Aktualisiert: 2026-07-11

Dieses Beispiel sucht alle Shapes mit einem bestimmten technischen Namen (z. B. Kundenlogo) und ersetzt jeden Treffer durch ein im Dialog gewähltes Snippet — optional über alle Folien. Klassischer Einsatz: ein altes Logo in einer ganzen Präsentation auf einen Schlag austauschen.

Kombiniert wird dazu der @param snippet-Picker mit dem Helfer ppptools.ReplaceShape(...).

Voraussetzung: technischer Name

Damit die Suche greift, müssen die Ziel-Shapes einen Objektnamen tragen (z. B. Kundenlogo). Snippets vergeben diesen automatisch über das Feld Technischer Name beim Speichern — so bleibt das eingefügte Objekt später per Name auffindbar und ersetzbar.


Das Snippet

// ╔════════════════════════════════════════════════════════════════════╗
// ║  Snippet ersetzen — sucht Shapes per technischem Namen und          ║
// ║  ersetzt jeden Treffer durch ein im Dialog gewähltes Snippet        ║
// ║  (z.B. altes Kundenlogo → neues Logo).                              ║
// ╚════════════════════════════════════════════════════════════════════╝

// @help https://ppptools.help.happy-pc.ch/de/ase-beispiel-snippet-ersetzen
/* PARAMS */

// @param string  TechName  "Technischer Name"  default="Kundenlogo" tooltip="Objektname der zu ersetzenden Shapes (exakt)"
// @param snippet Ersatz    "Ersatz-Snippet"    subtype="Fragment"   tooltip="Womit ersetzt werden soll (Logo aus der Bibliothek)"
// @param enum    Scale     "Skalieren nach"    options="Breite|Höhe|Einpassen|Strecken|Original" default="Breite"
// @param bool    KeepName  "Namen beibehalten" default="true"       tooltip="Ersatz erhält denselben technischen Namen (bleibt wieder ersetzbar)"
// @param bool    AllSlides "Alle Folien?"      default="true"
// @button Ersetzen

string techName  = Params.GetString("TechName", "");
var    ersatz    = Params.GetSnippet("Ersatz");
string scale     = Params.GetString("Scale", "Breite");
bool   keepName  = Params.GetBool("KeepName", true);
bool   allSlides = Params.GetBool("AllSlides", true);

int replaced = 0;

// Ersetzt auf EINER Folie alle Shapes, deren Name == techName.
// Wichtig: erst Treffer sammeln (Snapshot), dann ersetzen — ReplaceShape verändert
// die Shapes-Collection (löscht das Original, fügt den Ersatz ein).
void ProcessSlide(System.Collections.Generic.List<dynamic> shapes)
{
    var targets = new System.Collections.Generic.List<dynamic>();
    foreach (dynamic sh in shapes)
    {
        string name = "";
        try { name = (string)sh.Name; } catch { }
        if (string.Equals(name, techName, System.StringComparison.OrdinalIgnoreCase))
            targets.Add(sh);
    }

    foreach (dynamic t in targets)
        if (ppptools.ReplaceShape(t, ersatz, scale, keepName) != null)
            replaced++;
}

// Nur laufen, wenn ein Ersatz-Snippet gewählt und ein Name angegeben wurde.
if (ersatz != null && !string.IsNullOrWhiteSpace(techName))
{
    if (allSlides)
        for (int s = 1; s <= ppptools.SlideCount; s++)
            ProcessSlide(ppptools.GetAllShapes(ppptools.GetSlide(s)));
    else
        ProcessSlide(ppptools.GetAllShapes());
}

So arbeitet es

  1. Der Picker (@param snippet … subtype="Fragment") zeigt nur Fragment-Snippets mit Vorschaubild — du wählst das neue Logo.
  2. Das Script durchsucht die Folie(n) nach Shapes, deren Objektname exakt dem technischen Namen entspricht (Gross-/Kleinschreibung egal).
  3. Jeder Treffer wird per ReplaceShape ersetzt: das neue Snippet landet am Zentrum des alten, wird gemäss Skalieren nach dimensioniert, das Original gelöscht.
  4. Mit Namen beibehalten trägt der Ersatz wieder Kundenlogo — die Aktion lässt sich also beliebig oft wiederholen.

Beispiel-Szenario

Eine 30-seitige Präsentation zeigt auf jeder Folie das Logo Kundenlogo. Der Kunde hat rebrandet:

  1. Neues Logo einmalig als Fragment-Snippet speichern (Technischer Name z. B. Kundenlogo).
  2. Dieses Snippet ausführen → im Dialog Technischer Name = Kundenlogo, Ersatz = neues Logo, Skalieren nach = Breite, Alle Folien = ja.
  3. Ausführen → alle 30 Logos werden ersetzt, jeweils auf Logo-Breite skaliert und am selben Platz positioniert.

Varianten

  • Teiltreffer statt exakt (z. B. Kundenlogo, Kundenlogo_DE, …): die Vergleichszeile ersetzen durch csharp if (name.IndexOf(techName, System.StringComparison.OrdinalIgnoreCase) >= 0)
  • Nur Bilder zulassen: im @param snippet subtype="Picture" statt "Fragment".
  • Rotation übernehmen macht ReplaceShape bereits automatisch.

Gruppen

Gesucht werden Shapes auf oberster Ebene. Liegt ein Logo innerhalb einer Gruppe, wird es nicht gefunden — dann die Gruppe vorher auflösen oder die Gruppe selbst benennen und ersetzen.


Verwandte Seiten