3. Die %Macro-Anweisung3.1 Definition und Aufruf von <strong>SAS</strong>-<strong>Makro</strong>sEin <strong>SAS</strong>-<strong>Makro</strong> ist ein Text zwischen einer %macro und einer %mend-Anweisung.Syntax:Beispiel:Aufruf:%macro name(parameter) / optionen;<strong>Makro</strong>text;%mend name;%macro datum;Title "Heute ist &sysday, der &sysdate";%mend datum;%datumDas <strong>Makro</strong> %datum erzeugt automatisch eine Überschrift mit dem aktuellen Datum.Die %macro-Anweisung•beginnt die Definition des <strong>Makro</strong>s,• weist dem <strong>Makro</strong> einen Namen zu und• kann (optional) eine Parameterliste und Optionen übergeben.3.2 <strong>Makro</strong>-NameDer Name des <strong>Makro</strong>s muß ein gültiger <strong>SAS</strong>-Name sein.Es gibt reservierte Worte, die nicht verwendet werden dürfen, etwa GO,RUN,OPEN usw.. WerdenSie trotzdem verwendet, erscheint folgende Fehlermeldung:ERROR: Macro NAME has been given a reserved name.ERROR: A dummy macro will be compiled.3.3 <strong>Makro</strong>-Parameter<strong>Makro</strong>-Parameter sind <strong>Makro</strong>variablen, die mit dem Aufruf an das <strong>Makro</strong> übergeben werden. Diesist, neben der %let-Anweisung, eine weitere Art, <strong>Makro</strong>variablen zu bilden.Beispiel:Aufruf:%macro mittel (SDS);Proc means data=&SDS;run;%mend mittel;%mittel(co.blutbild)In Klammern steht der Wert, der an die <strong>Makro</strong>variablen SDS übergeben wird. In diesem Beispielbekommt der Parameter SDS den Wert co.blutbild zugewiesen.Die Parameter in der <strong>Makro</strong>-Definition• sind in Klammern eingeschlossen,• werden durch Kommas getrennt,• können mit ihrer Position oder mit einem Schlüsselwort spezifiziert werden und12
• definieren lokale <strong>Makro</strong>variablen, d.h. Variablen, die nur während der Ausführung<strong>Makro</strong>s gültig sind. (Im Gegensatz zu globalen <strong>Makro</strong>variablen, siehe Kap. 4.)des3.3.1 Positions- und Schlüsselparameter<strong>Makro</strong>-Parameter können entweder als Positionsparameter (posparm) oder Schlüssel-parameter(keyparm) übergeben werden. Der wesentliche Unterschied zwischen beiden besteht darin, daß das<strong>Makro</strong> Positionsparameter allein durch ihre Position beim Aufruf erkennt, und Schlüsselparametermit Variablennamen und Gleichheitszeichen aufgelistet werden müssen.Beispiel für Positionsparameter:Beispiel für Schlüsselparameter:%macro name(posparm-1, posparm-2);%macro name(keyparm-1=wert1, keyparm-2=wert2);Die Positionsparameter• erscheinen ohne Gleichheitszeichen,• müssen in der im <strong>Makro</strong>-Aufruf definierten Reihenfolge aufgelistet werden,• haben den Wert Null zum Zeitpunkt der Defintion und können diesen beibehalten, wenn einKomma als Platzhalter beim Aufruf eingesetzt wurde.Die Schlüsselparameter• werden mit einem Gleichheitszeichen aufgelistet,• können in beliebiger Reihenfolge angegeben werden,• können mit Defaultwerten (auch Null) versehen werden und• brauchen beim Aufruf nicht genannt zu werden.Positions- und Schlüsselparameter können auch gemeinsam in <strong>Makro</strong>s auftreten, doch müssen diePositionsparameter zuerst aufgelistet werden.Beispiel 1: %macro print (var1,var2,var3,sds=_last_);proc print data=&SDS;var &var1 &var2 &var3;run;%mend print;Aufruf:%print(albumin,calcium,alter,SDS=co.blutbild);Die Positionsparameter Var1, Var2 und Var3 erhalten die Werte Albumin, Calcium undAlter. Der Schlüsselparameter SDS erhält den Wert co.blutbild. Der Defaultwert ist auf_last_ gesetzt; dies bedeutet, daß automatisch der zuletzt bearbeitete Datensatz verwendet wird,falls im <strong>Makro</strong>aufruf kein neuer Dateiname angegeben wird.Beispiel 2: %macro ttest (var1,var2,classvar,sds);proc ttest data=&SDS;class &classvar;var &var1 &var2 ;run;%mend ttest;Aufruf 1: %ttest (calcium,albumin,pille, co.blutbild);Aufruf 2: %ttest (calcium,,pille, co.blutbild);Im zweiten Beispiel werden die Positionsparameter var1, var2, classvar und sds verwendet.Beim zweiten Aufruf soll der T-Test nur für eine Variable berechnet werden. Um eine13