Beispiel: Snippet per Namen ersetzen
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
- Der Picker (
@param snippet … subtype="Fragment") zeigt nur Fragment-Snippets mit Vorschaubild — du wählst das neue Logo. - Das Script durchsucht die Folie(n) nach Shapes, deren Objektname exakt dem technischen Namen entspricht (Gross-/Kleinschreibung egal).
- Jeder Treffer wird per
ReplaceShapeersetzt: das neue Snippet landet am Zentrum des alten, wird gemäss Skalieren nach dimensioniert, das Original gelöscht. - 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:
- Neues Logo einmalig als Fragment-Snippet speichern (Technischer Name z. B.
Kundenlogo). - Dieses Snippet ausführen → im Dialog
Technischer Name = Kundenlogo, Ersatz = neues Logo, Skalieren nach = Breite, Alle Folien = ja. - 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 durchcsharp if (name.IndexOf(techName, System.StringComparison.OrdinalIgnoreCase) >= 0) - Nur Bilder zulassen: im
@param snippetsubtype="Picture"statt"Fragment". - Rotation übernehmen macht
ReplaceShapebereits 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.