Hallo, Manfred.
Das das Makro so aufgebaut werden muß... mal sehen, wann ich das verstehe.
Du baust in einer Schleife Objekte. Das ist im Prinzip eine feine Angelegenheit, weil es den Code sehr viel kompakter und flexibler macht, ist aber mit Problemen behaftet. Eines davon besteht darin, dass bestimmte Codeblöcke, die man Objekten zuweist, erst
zur Laufzeit evaluiert werden, wohingegen andere bereits im Moment der Erzeugung ausgewertet werden. Zu den erstgenannten gehört der DATA-Codeblock (Datalink) der Spalte. Weil der Zähler, mit dem Du die Objekte erzeugst, aber nach Beendigung der Schleife auf Endbedingung+1 steht, bekämst Du dann in allen Spalten denselben Wert (weil alle Spalten in ihrem Data-Codeblock auf irgendwas + 1 verweisen) - oder totalen Murks. Du musst also den Codeblock so bauen, dass er auf einen Zähler zeigt, den es im Moment der Evaluierung schon nicht mehr gibt. Gleichzeitig kannst Du den Vorteil nutzen, dass der Wert (Inhalt) des Codeblocks in den Data-Slot wandert und nicht dessen Variable (deshalb brauchst Du nur eine Codeblock-Variable, aber im Prinzip könnte man sogar darauf verzichten).
Die Lösung besteht darin, per Makro einen Codeblock zu basteln, der im Moment der Entstehung den richtigen Wert enthält.
Diese Codezeile:
sagt ja: Hier ist ein Makro (deshalb das "&" am Anfang). Es folgt also (Klammer auf, Anführungszeichen) ein Text, der zur Laufzeit (also in dem Moment, in dem das
Ergebnis der Makrooperation der Variablen zugewiesen wird) als Code interpretiert werden soll. Dann folgt (ab "{||") der eigentliche Codeblock. Der Trick besteht darin, diesen Codeblock so zu gestalten, dass die iterierende Variable ("cNi") im Moment der Makroexpansion (!) "richtig" ist. Das ist sie dadurch, dass man im Makro ihren Wert in den Makro-Text einbaut. Wären da nicht die Anführungs- und Pluszeichen um "cNi" herum, hätte man dasselbe Problem wie zuvor. Aber Du baust in den Text an dieser Stelle ihren
Wert. Der Makroexpander setzt also nicht oVarianten+cNi+:nArea usw. um, sondern oVarianten1:nArea, oVarianten2:nArea und so weiter. Wenn man das verstanden hat, liest sich dieser Code sehr viel einfacher, und man kann mit diesem mächtigen Mittel tatsächlich alles mögliche bauen. Komplexe data-driven-Anwendungen werden erst so möglich.
Kapiert?