SAS Macro  •  Module X  •  2 h
Les macro-fonctions et le débogage
M2 TIDE — Stage de programmation SAS — Enseignement 100 % distanciel
Objectifs du module
  • Utiliser les macro-fonctions de manipulation de chaînes
  • Protéger des caractères spéciaux avec les macro-fonctions de quoting %STR et %NRSTR
  • Appeler une fonction SAS Base depuis le macro-langage avec %SYSFUNC
  • Calculer avec %EVAL et %SYSEVALF, et déboguer avec SYMBOLGEN, MPRINT et MLOGIC

1. Généralités

Les fonctions SAS usuelles ne sont pas accessibles dans le cadre d'un macro-programme. Il faut avoir recours aux macro-fonctions. On peut retenir qu'en règle générale, préfixer un mot-clé ou une fonction SAS par le caractère % permet de trouver leur équivalent en macro-langage.

2. Les macro-fonctions identiques à SAS Base

Les macro-fonctions de manipulation de chaînes de caractères.

Macro-fonction Rôle
%length() Retourne la longueur de l'argument
%index(), %scan(), %substr(), %upcase() Fonctionnent comme leurs équivalents en langage SAS Base
%qscan(), %qsubstr(), %qupcase() Permettent en outre d'ignorer les caractères réservés % et &, qui sont alors considérés comme des caractères normaux et donc non interprétés
Exercice X.1 (32-A) — Exercices avec des macro-fonctions :
  • Récupérer le département à partir d'un code postal
  • Récupérer la longueur de la macro-variable CP
  • À partir d'une chaîne de la forme prénom-nom : mettre la chaîne en majuscules, puis en minuscules
  • Récupérer dans une macro-variable le prénom
  • Trouver la position de la lettre a
Voir le corrigé
%let cp = 75015 ;
%put Departement : %substr(&cp,1,2) ;
%put Longueur de CP : %length(&cp) ;

%let nom = Julie-Martin ;
%put %upcase(&nom) ;
%put %lowcase(&nom) ;

%let prenom = %scan(&nom,1,-) ;
%put Prenom : &prenom ;

%put Position de la lettre a : %index(&nom,a) ;

Les macro-fonctions de quoting %STR et %NRSTR. Les macro-fonctions dites de quoting permettent à SAS d'interpréter des caractères spéciaux, tels que le point-virgule ou l'apostrophe, ou encore des mots-clés tels que NE, OR, GT, LT, comme du texte et non comme faisant partie intégrante du macro-langage.

Macro-fonction Rôle
%str(expression) Masque les caractères spéciaux
%nrstr(expression) Masque les caractères spéciaux, y compris % et &
Exercice X.2 (32-B) — Écrire dans la LOG le contenu d'une macro-variable qui vaut : proc print ; run ;
Voir le corrigé
%let programme = %str(proc print ; run ;) ;
%put &programme ;

Sans %STR, le point-virgule serait interprété comme la fin de l'instruction %LET, et le macro-processeur signalerait une erreur de syntaxe bien avant d'atteindre RUN.

3. Les macro-fonctions spécifiques

Liste non exhaustive :

Macro-fonction Rôle
%SYSFUNC Exécute UNE fonction SAS. Il est possible de spécifier un format en deuxième argument
%EVAL Fait des opérations sur des nombres entiers
%SYSEVALF Fait des opérations sur des décimales
%BQUOTE Masque les blancs et caractères spéciaux
%NRBQUOTE Masque en plus les % et &

La très utile macro-fonction %SYSFUNC. Les macro-fonctions identiques à celles de SAS Base n'étant pas nombreuses, il est souvent utile de faire appel à %SYSFUNC, qui permet d'utiliser la plupart des fonctions du langage SAS/Base.

%upcase("toto")  est equivalent a  %sysfunc(upcase("toto"))

%sysfunc(int(ranuni(0)*100))   tire un entier entre 0 et 100
Exercice X.3 (33-A) — Utiliser la fonction date() pour afficher une macro-variable comme suit : Cours de SAS du JJ/MM/AA. Puis remplacer tous les S par des Z dans cette chaîne.
Voir le corrigé
%let msg = Cours de SAS du %sysfunc(date(), ddmmyy8.) ;
%put &msg ;

%let msg2 = %sysfunc(tranwrd(&msg, S, Z)) ;
%put &msg2 ;
Exercice X.4 (33-B) — Calculer la racine carrée de 1971 et l'afficher dans la LOG.
Voir le corrigé
%put %sysfunc(sqrt(1971)) ;

4. Les fonctions d'évaluation %EVAL et %SYSEVALF

La valeur d'une macro-variable est un texte, mais on peut forcer le macro-compilateur à exécuter des opérations avec les macro-fonctions %EVAL et %SYSEVALF. Les opérations supportées se limitent aux additions, soustractions, multiplications et divisions.

%EVAL(expression)

%EVAL évalue des calculs sur des entiers à partir d'expressions contenant des macro-variables. Attention : cette macro-fonction ne traite et ne retourne que des nombres entiers. Le résultat du calcul est arrondi à l'entier inférieur.

Exercice X.5 (33-C) — À partir des macro-variables un=1 et deux=2, à initialiser, calculer la somme, la multiplication et la division des deux macro-variables.
Voir le corrigé
%let un   = 1 ;
%let deux = 2 ;

%put Somme : %eval(&un + &deux) ;
%put Produit : %eval(&un * &deux) ;
%put Division : %eval(&un / &deux) ;

La division affiche 0 : %EVAL ne travaille que sur des entiers et tronque le résultat, elle ne l'arrondit pas au plus proche.
%SYSEVALF(expression, type de conversion)

%SYSEVALF évalue des calculs sur des valeurs numériques décimales à partir d'expressions contenant des macro-variables. Le deuxième argument, non obligatoire, permet éventuellement de convertir le résultat. Les valeurs possibles pour ce paramètre sont :

Valeur Effet
boolean 0 si le résultat est nul ou manquant, 1 sinon
ceil Le plus petit entier supérieur ou égal à l'évaluation de l'expression
floor Le plus grand entier inférieur ou égal à l'évaluation de l'expression
integer Partie entière
Exercice X.6 (33-D) — À partir de la macro-variable i=5, effectuer les opérations suivantes :
  • Diviser i par 2 sans préciser le type de conversion
  • Diviser i par 2 avec le type de conversion boolean
  • Faire une addition de i et de la valeur manquante avec le type de conversion boolean
  • Diviser i par 2 avec le type de conversion ceil
  • Diviser i par 2 avec le type de conversion floor
Voir le corrigé
%let i = 5 ;

%put Sans conversion : %sysevalf(&i/2) ;
%put Boolean : %sysevalf(&i/2, boolean) ;
%put Boolean avec manquant : %sysevalf(&i + ., boolean) ;
%put Ceil : %sysevalf(&i/2, ceil) ;
%put Floor : %sysevalf(&i/2, floor) ;

&i/2 vaut 2.5 : sans conversion la valeur exacte est affichée, avec ceil on obtient 3, avec floor on obtient 2. L'addition avec une valeur manquante donne un résultat manquant, donc boolean renvoie 0.

5. Les options de débogage

Plusieurs options permettent de déboguer un code écrit en macro-langage.

L'option SYMBOLGEN permet d'afficher dans la LOG la valeur d'une macro-variable lors de sa résolution.

OPTIONS SYMBOLGEN ;

Elle est également positionnable au démarrage de SAS ou dans le fichier de configuration de SAS. Pour la désactiver, on utilise NOSYMBOLGEN.

OPTIONS SYMBOLGEN ;

%let quantite  = %EVAL(5+3+7) ;
%let prix      = 3 ;
%let total     = %EVAL(&prix*&quantite) ;
%let moy_jour  = %EVAL(&total/7) ;

L'option MPRINT permet d'afficher dans la LOG le code SAS généré puis exécuté au travers d'un macro-programme, et plus particulièrement de vérifier la bonne résolution des macro-variables.

OPTIONS MPRINT ;

Elle est également positionnable au démarrage de SAS ou dans le fichier de configuration de SAS. Pour la désactiver, on utilise NOMPRINT.

OPTIONS MPRINT ;

%MACRO exemple(table=PRDSAL3, var1=, var2=) ;
    ODS HTML body = 'C:\temp\exemple.html' ;
    PROC PRINT data = SASHELP.&table(obs=5) ;
        %IF &var1 ne and &var2 ne %THEN %DO ;
            var &var1 &var2 ;
        %END ;
    RUN ;
    ODS HTML close ;
%MEND ;

%exemple(table=PRDSAL3, var1=PRODUCT, var2=PREDICT) ;

L'option MLOGIC permet d'afficher dans la LOG, lors d'un test sur la valeur d'une macro-variable, si l'expression est vérifiée ou non.

OPTIONS MLOGIC ;

Elle est également positionnable au démarrage de SAS ou dans le fichier de configuration de SAS. Pour la désactiver, on utilise NOMLOGIC.

%MACRO mlogic(table=PRDSAL3, var1=, var2=) ;
    ODS HTML body = 'C:\temp\exemple.html' ;
    PROC PRINT data = SASHELP.&table(obs=5) ;
        %IF &var1 ne and &var2 ne %THEN %DO ;
            var &var1 &var2 ;
        %END ;
    RUN ;
    ODS HTML close ;
%MEND mlogic ;

%mlogic(table=PRDSAL3, var1=PRODUCT, var2=PREDICT) ;
En général, l'utilisation simultanée des trois options MPRINT, MLOGIC et SYMBOLGEN s'avère fortement utile afin de déboguer au mieux le macro-programme. Retenez la répartition des rôles : SYMBOLGEN vous dit ce que vaut une macro-variable, MPRINT vous dit quel code a été produit, MLOGIC vous dit quel chemin la macro a emprunté.
Point de contrôle — à faire avant de continuer
Dernier contrôle du parcours : reprenez le macro-programme %exemple de la section 5 et lancez-le successivement avec les trois options activées une à une, puis toutes ensemble. Vous devez savoir dire, pour chaque ligne de la LOG, laquelle des trois options l'a produite.
Pour valider ce module
  • QCM — QCM Module X — 6 questions, auto-évaluation
Modifié le: mardi 11 août 2026, 14:19
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