SAS Macro  •  Module VIII  •  2 h
Les macro-variables
M2 TIDE — Stage de programmation SAS — Enseignement 100 % distanciel
Objectifs du module
  • Comprendre à quel moment et par quel compilateur le macro-langage est traité
  • Créer une macro-variable par %LET et par CALL SYMPUT / CALL SYMPUTX
  • Distinguer l'environnement GLOBAL de l'environnement LOCAL
  • Résoudre une macro-variable avec &, avec les & consécutifs et avec SYMGET

1. Introduction au langage Macro

Le langage MACRO est un moyen d'écrire des programmes SAS paramétrables et de simplifier des traitements répétitifs. Il est notamment utilisé dans les situations suivantes :

  • Plusieurs traitements identiques à exécuter avec uniquement une option ou un critère de sélection à modifier
  • Automatisation de programme SAS en fonction d'une valeur récupérée par ailleurs
  • Génération dynamique de code SAS, ce qui ouvre des possibilités jusqu'alors insoupçonnées en SAS/Base

Le langage MACRO comporte trois éléments principaux :

  • le macro-programme est une suite d'instructions SAS classiques, de macro-variables, de macro-instructions et de macro-fonctions — plus communément appelé « macro »
  • les macro-variables sont des paramètres utilisés dans le macro-programme
  • les macro-fonctions fonctionnent comme les fonctions SAS Base, mais elles sont traitées par un macro-compilateur

Dans un programme SAS, le langage MACRO est toujours traité en PREMIER. Les étapes DATA et PROC et autres éléments de BASE sont traités après. SAS analyse le code et détecte du langage macro si l'un des deux caractères suivants est présent, sauf s'ils sont entre simples quotes : % et &.

La compilation d'un macro-programme se fait en deux temps :

  • Compilation par le compilateur du macro-langage, le macro-compilateur
  • Compilation par le compilateur SAS

Le macro-compilateur résout chaque élément du macro-langage — macro-variables, macro-fonctions — rencontré dans le programme et reconnaissable grâce aux caractères & pour les macro-variables ou % pour les macro-instructions et macro-fonctions qui les précèdent. Une fois ce premier passage effectué, si du code SAS a été généré, il est exécuté par le compilateur SAS comme s'il s'agissait d'un programme SAS Base classique.

La phrase à retenir pour tout le bloc macro : le macro-langage n'est ni plus ni moins qu'un générateur de texte. Il ne calcule pas sur vos données, il écrit du code que SAS exécutera ensuite. Toutes les difficultés rencontrées au cours des trois prochains modules se ramènent presque toujours à un oubli de ce principe.

2. Qu'est-ce qu'une macro-variable ?

Une macro-variable permet de stocker du texte et d'y faire référence. Il existe deux types de macro-variables :

  • Les macro-variables automatiques : créées automatiquement à l'ouverture de la session SAS. Par exemple SYSDATE, date de démarrage de la session SAS, ou SYSLAST, nom de la dernière table soumise
  • Les macro-variables définies par l'utilisateur

Caractéristiques des macro-variables :

  • Elles commencent toujours par une lettre ou un tiret bas
  • Le format de stockage est toujours du texte
  • Les caractères spéciaux, et tout particulièrement % ou &, sont à éviter
  • La longueur maximale d'une macro-variable est de 65 534 caractères

3. Créer une macro-variable avec %LET

L'instruction %LET crée une macro-variable en lui donnant un nom et lui assigne une valeur. Elle peut être utilisée à n'importe quel endroit d'un programme SAS, et pas nécessairement dans un macro-programme.

%let VARIABLE = VALEUR ;

Le champ VALEUR peut être :

  • vide
  • une chaîne de caractères
  • une expression avec des macro-variables
  • une expression avec des macro-fonctions
  • l'appel d'un macro-programme

Affichage d'une macro-variable via l'instruction %PUT. L'instruction %PUT permet d'inscrire dans la LOG la valeur prise par une macro-variable.

%PUT &macro-variable. ;

Si l'instruction %PUT fait référence à une macro-variable qui n'existe pas, un warning apparaît dans la LOG.

Exercice VIII.1 (112-A1) — Déterminez la valeur assignée à chacune des macro-variables suivantes :
%let name  = John Doe ;
%let name2 = ' John Doe ';
%let title = "John's Report";
%let start = ;
%let sum1  = 3+4;
%let sum2  = 0;
Exercice VIII.2 (112-A2) — Afficher les variables créées dans la LOG.
Voir le corrigé
%put &name ;
%put &name2 ;
%put &title ;
%put &start ;
%put &sum1 ;
%put &sum2 ;

Valeurs obtenues : name = John Doe (les blancs de début/fin sont supprimés par %LET, pas les blancs internes) ; name2 = ' John Doe ' (les quotes font partie du texte : le macro-langage ne les interprète pas) ; title = "John's Report" (idem) ; start = chaîne vide ; sum1 = 3+4 (texte brut, aucun calcul n'est effectué) ; sum2 = 0.

4. Créer une macro-variable avec CALL SYMPUT

À partir du contenu d'une table SAS, il est possible de créer une macro-variable grâce à l'instruction CALL SYMPUT à l'intérieur d'une étape DATA.

data TABLE ;
    set TABLE ;
    call symput("NOM", VALEUR) ;
run ;

NOM et VALEUR respectent les mêmes caractéristiques que celles décrites plus haut.

Exercice VIII.3 (112-B1) — Dans une étape DATA, créer la macro-variable PRODUIT à partir de la variable PRODUCT dans la table SASHELP.PRDSALE.
Voir le corrigé
data _null_ ;
    set sashelp.prdsale (obs=1) ;
    call symput("PRODUIT", product) ;
run ;

%put &produit ;

La variable automatique _N_. Dans une étape DATA, la variable _N_ est créée automatiquement. Elle contient le numéro de l'observation lue.

Exercice VIII.4 (112-C1) — À partir de la table SASHELP.PRDSALE, créer une nouvelle variable OBS contenant le numéro de l'observation lue.
Voir le corrigé
data work.prdsale2 ;
    set sashelp.prdsale ;
    obs = _n_ ;
run ;
Exercice VIII.5 (112-C2) — Compter le nombre de produits distincts dans la table SASHELP.PRDSAL3. Pour cela, créer une table contenant la liste de tous les produits distincts de la table. Puis récupérer dans une macro-variable N le nombre d'observations de la table précédemment créée.
Voir le corrigé
proc sort data=sashelp.prdsal3 (keep=product) out=work.produits nodupkey ;
    by product ;
run ;

data _null_ ;
    set work.produits nobs=n ;
    call symputx("N", n, "G") ;
    stop ;
run ;

%put &N ;

L'option NOBS de l'instruction SET donne le nombre total d'observations dès la première lecture ; STOP évite de parcourir inutilement le reste de la table.
Exercice VIII.6 (112-C3) — À partir de la table précédente, la liste des produits distincts, créer des macro-variables PRODUIT1 à PRODUIT4 à partir de la variable PRODUCT.
Voir le corrigé
data _null_ ;
    set work.produits ;
    call symputx(cats("PRODUIT", _n_), product, "G") ;
run ;

%put &produit1 &produit2 &produit3 &produit4 ;

5. Remarques et notions d'environnement

Jusqu'à la version SAS 8.2, pour éliminer les blancs contenus dans les valeurs numériques lors de la création d'une macro-variable, il fallait utiliser les fonctions COMPRESS ou LEFT et TRIM.

Depuis la version SAS 9, on peut directement utiliser l'instruction CALL SYMPUTX qui récupère la valeur de la variable numérique en supprimant les blancs et en justifiant à gauche. Un troisième argument a également été ajouté : l'environnement de référence dans lequel sera stockée la macro-variable, L pour local ou G pour global. Ce dernier argument est très pratique car il évite les instructions %GLOBAL.

call symputx("NOM", VALEUR, "G") ;

On distingue deux environnements :

  • L'environnement GLOBAL, par défaut : les macro-variables créées dans cet environnement sont disponibles durant toute la durée de la session SAS active et accessibles depuis toute sorte de programme SAS, SAS/Base ou SAS/Macro. On crée ces macro-variables à l'aide du %LET.
  • L'environnement LOCAL : les macro-variables créées dans cet environnement ne sont disponibles que lors de l'exécution du macro-programme dans lequel elles sont créées.

Les macro-variables automatiques sont créées par le système SAS dans l'environnement GLOBAL. Si l'utilisateur crée une macro-variable dans un macro-programme, celle-ci sera définie en environnement LOCAL — sauf si le macro-programme n'a pas de paramètre. Elle ne peut être stockée en environnement GLOBAL que si elle est créée en dehors du macro-programme, ou si elle est déclarée comme devant être GLOBALE dans le macro-programme.

Toutes les macro-variables existantes sont disponibles dans une base de la librairie SASHELP, accessible via la vue VMACRO.

Affichage des macro-variables. Les expressions suivantes permettent d'afficher les valeurs de toutes les macro-variables définies dans la session :

Instruction Contenu affiché
%put _ALL_ ; Toutes les macro-variables
%put _AUTOMATIC_ ; Toutes les macro-variables automatiques
%put _USER_ ; Toutes les macro-variables créées par l'utilisateur
%put _LOCAL_ ; Toutes les macro-variables stockées en environnement LOCAL
%put _GLOBAL_ ; Toutes les macro-variables stockées en environnement GLOBAL
Il est également possible de stocker le résultat d'une PROC SQL dans une macro-variable, mais ce point est traité dans le cours SAS SQL.

Exemples de macro-variables automatiques :

Macro-variable Contenu
SYSDATE Date du début de la session SAS au format DATE7.
SYSDATE9 Date du début de la session SAS au format DATE9.
SYSDAY Jour de la semaine, en littéral, de la session SAS
SYSLAST Nom de la dernière table utilisée
SYSERR Code du type d'erreur rencontré : 0 exécution OK sans message ; 1 et 2 exécution arrêtée ; 3 et au-delà de 4 erreur dans le programme ; 4 exécution OK mais warning
SYSLIBRC Vaut 0 si le LIBNAME s'est bien exécuté
SYSVER Version de SAS utilisée

6. Résolution et utilisation d'une macro-variable avec &

Pour faire référence à une macro-variable, il faut utiliser le caractère spécial & suivi du nom de la macro-variable.

Exercice VIII.7 (121-A1) — Utiliser les affectations précédentes des macro-variables SUM1 et SUM2 pour créer une macro-variable TOTAL qui contient la valeur 3+4+0.
Voir le corrigé
%let total = &sum1+&sum2 ;
%put &total ;

La LOG affiche 3+4+0 : c'est bien une concaténation de texte, pas un calcul. Pour obtenir le résultat numérique 7, il faudrait passer par %EVAL, vu au module X.
Exercice VIII.8 (121-A2) — À partir de deux macro-variables TABLE et LIBRAIRIE, à initialiser, créer une troisième macro-variable contenant la valeur SASHELP.PRDSAL3.
Voir le corrigé
%let librairie = SASHELP ;
%let table     = PRDSAL3 ;
%let ref = &librairie..&table ;
%put &ref ;
Lorsque l'appel à une macro-variable est directement suivi d'un texte, il convient de préciser la fin du nom de la macro-variable par un point, qui est l'opérateur de concaténation du macro-langage. C'est pourquoi on écrit &LIBRAIRIE..&TABLE : le premier point ferme le nom de la macro-variable, le second est le point séparateur de la référence bibliothèque.table.

Il est possible de référencer des macro-variables de manière indirecte, ce qui est souvent utilisé dans les boucles macro. Lorsque l'on utilise des & consécutifs, SAS convertit && en & jusqu'à la résolution complète de la macro-variable.

Exemple : dans &&&variable, SAS résout &variable, convertit && en &, puis continue le traitement.

Exercice VIII.9 (121-B) — Soit le programme suivant :
%let toto = ma valeur ;
%let titi = toto ;
%let tata = titi ;

Afficher la valeur « ma valeur » dans la LOG en utilisant %PUT et seulement la macro-variable TATA.

Voir le corrigé
%put &&&tata ;

Déroulé : && devient &, puis &tata se résout en titi → résultat intermédiaire &titi. &titi se résout en toto → résultat &toto. &toto se résout enfin en ma valeur. Trois esperluettes suffisent ici car il n'y a que deux niveaux d'indirection à traverser (tata→titi→toto→valeur).

7. Résolution avec la fonction SYMGET dans une étape DATA

La fonction SYMGET permet de stocker le contenu d'une macro-variable dans une variable SAS à l'intérieur d'une étape DATA.

SYMGET(argument) ;

Où argument peut être :

  • le nom d'une macro-variable entre doubles quotes, sans le caractère &
  • le nom d'une variable SAS caractère : les valeurs de la nouvelle variable seront les valeurs des macro-variables ayant pour nom les valeurs de la variable passée en argument
  • une expression caractère pouvant être la concaténation d'une chaîne de caractères et d'une variable
Exercice VIII.10 (122-A) — À partir de la table SASHELP.DEMOGRAPHICS :
  1. Créer une macro-variable REG contenant la valeur EUR.
  2. Sélectionner dans une table temporaire DEMO les observations de la région Europe, en utilisant la macro-variable créée en 1.
  3. Sur le même modèle, ajouter une variable TEXTE contenant le texte « Zone géographique : Europe (EUR) ».
  4. Créer une macro-variable dans la même étape DATA qui contient le code ISO de la Slovaquie.
  5. En dehors de l'étape DATA, écrire dans la LOG le code ISO de la Slovaquie.
  6. Exécuter le même programme pour obtenir le code du Guatemala.
Voir le corrigé
/* 1 */
%let REG = EUR ;

/* 2 */
data work.demo ;
    set sashelp.demographics ;
    where region = "®" ;
run ;

/* 3 : SYMGET resout la macro-variable a l'interieur de l'etape DATA */
data work.demo ;
    set work.demo ;
    length texte $ 60 ;
    texte = "Zone geographique : Europe (" || trim(symget("REG")) || ")" ;
run ;

/* 4 et 5 */
data _null_ ;
    set sashelp.demographics ;
    if name = "Slovakia" then call symputx("COMM", iso, "G") ;
run ;

%put Code ISO de la Slovaquie : &COMM ;

/* 6 : une seule ligne a modifier */
data _null_ ;
    set sashelp.demographics ;
    if name = "Guatemala" then call symputx("COMM", iso, "G") ;
run ;

%put Code ISO du Guatemala : &COMM ;

L'objectif pédagogique de la question 6 est qu'une seule chaîne de caractères change entre les questions 5 et 6. Une version plus aboutie remplacerait le nom en dur par une macro-variable PAYS, ce qui prépare directement le passage au macro-programme du module IX.

8. Supprimer une macro-variable

Pour supprimer une ou plusieurs macro-variables, on utilise la macro-instruction %SYMDEL.

%SYMDEL macro-variable1 macro-variable2 ... ;
Exercice VIII.11 (122-B) — Supprimer les macro-variables REG et COMM.
Voir le corrigé
%symdel REG COMM ;
Point de contrôle — à faire avant de continuer
Avant de passer au module IX, reprenez l'exercice VIII.9 et écrivez dans la LOG le résultat de %put &tata ; puis de %put &&tata ; puis de %put &&&tata ;. Vous devez être capable d'expliquer les trois sorties. C'est le mécanisme exact que vous réutiliserez dans toutes les boucles du module suivant.
Pour valider ce module
  • QCM — QCM Module VIII — 6 questions, auto-évaluation
Modifié le: mardi 11 août 2026, 14:18
Accessibilité

Couleur de fond Couleur de fond

Police Police

Crénage de la police Crénage de la police

Visibilité de l’image Visibilité de l’image

Hauteur de ligne Hauteur de ligne

1.2

Surbrillance de lien Surbrillance de lien

Alignement du texte Alignement du texte

Taille de police Taille de police

1

Espacement des lettres Espacement des lettres

0

Couleur de texte Couleur de texte

Largeur de paragraphe Largeur de paragraphe

0