Problème de macro sous SAS

Mathi -  
 pioupiou21 -
Bonjour, je travaille sous SAS mais je suis néophyte. On m'a écrit une macro à mettre dans mon programme mais SAS me dit instruction incorrecte ou mal utilisée et surtout ne reconnait pas les 'if' et les 'then'. Il doit y avoir une erreur de syntaxe mais je ne la trouve pas. MERCI DE VOTRE AIDE.....
Voilà ce que j'ai écrit :

%macro recod(var);
If (&var eq 'AUCUNE DIFFICULTE') then &var=0;
If (&var eq 'QUELQUES DIFFICULTES') then &var=1;
If (&var eq 'BEAUCOUP DE DIFFICULTES') then &var=2;
If (&var eq 'INCAPABLE DE LE FAIRE') then &var=3;
%mend;

%recod(PEUT_HABILLER);
%recod(CHEVEUX);
%recod(CHAISE);
%recod(LEVER_LIT);
%recod(VIANDE);
%recod(PEUT_BOIRE);
%recod(BRIQUE);
%recod(MARCHER);
%recod(MONTER);
%recod(LAVER);
%recod(BAIGNER);
%recod(ASSEOIR);
%recod(PRENDRE);
%recod(BAISSER);
%recod(PORTE);
%recod(DEVISSER);
%recod(ROBINET);
%recod(FAIRE_COURSE);
%recod(VOITURE);
%recod(MENAGE);

%macro deuxdim (var1, var2, var3);
If (&var1 eq .) then &var3=&var2;
If (&var2 eq .) then &var3=&var1;
If (&var1 ge &var2) then &var3=&var1;
If (&var1 lt &var2) then &var3=&var2;
%mend;

%deuxdim(PEUT_HABILLER, CHEVEUX, haq1);
%deuxdim(CHAISE, LEVER_LIT, haq2);
%deuxdim(MARCHER,MONTER, haq4);
%deuxdim(PRENDRE, BAISSER, haq6);

%macro troisdim(var1, var2, var3, var4);
If(&var1 eq . or &var2 eq .) then &var4=&var3;
If(&var1 eq . or &var3 eq .) then &var4=&var2;
If(&var2 eq . or &var3 eq .) then &var4=&var1;
If(&var1 ge &var2) then &var4=&var1;
If(&var1 lt &var2) then &var4=&var2;
If(&var4 ge &var3) then &var4=&var4;
If(&var4 lt &var3) then &var4=&var3;
%mend;

%troisdim(VIANDE, PEUT_BOIRE, BRIQUE, haq3);
%troisdim(LAVER, BAIGNER, ASSEOIR, haq5);
%troisdim(PORTE, DEVISSER, ROBINET, haq7);
%troisdim(FAIRE_COURSE, VOITURE, MENAGE, haq8);

%macro recal(var1, var2);
If (&var1 eq 1 and &var2 eq .) then &var2=2;
If (&var1 eq 1 and &var2 lt 2) then &var2=2;
%mend;

%recal(ACCESS_HABIT,HAQ1); %recal(AIDE_HABIT,HAQ1);
%recal(CHAISE_SP,HAQ2); %recal(AIDE_LEVER,HAQ2);
%recal(USTENSILE,HAQ3);%recal(AIDE_MANGER,HAQ3);
%recal(CANNE,HAQ4);%recal(DEAMBU,HAQ4);%recal(BEQUILLE,HAQ4);
%recal(CHAISE_ROUE,HAQ4);%recal(AIDE_MARCHER,HAQ4);
%recal(WC,HAQ5);%recal(SIEGE_BAIN,HAQ5);%recal(LG_MANCHE_SALLE_BAIN,HAQ5);
%recal(POIGNEE_BAIN,HAQ5);%recal(HYGIENE,HAQ5);
%recal(ATTRAPE,HAQ6);%recal(ATTRAPER,HAQ6);
%recal(OUVRE_POT,HAQ7);%recal(SAISIR,HAQ7);
%recal(COURSES,HAQ8);

HAQ=sum(of HAQ1, HAQ2, HAQ3, HAQ4, HAQ5, HAQ6, HAQ7, HAQ8);
HAQ=HAQ/8;;
A voir également:

3 réponses

hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention   50
 
Salut,
Dans une macro, les if et then deviennent des macros commandes donc mettre un % avant if et then i.e: %if et %then.
1
hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention   50
 
Resalut,
Desolé je n'ai pas lu le reste de ton programme.
Je crois que si tu definis ta macro variable comme étant alphanumerique, a l'appel de ta macro, l'argument sera mis entre ''.
Et aussi, pour le test If (&var1 eq .), au lieu de . tu mets ''. Le point est un missing data pour une variable numerique.
Je crois que c'est tout ce que j'ai pu deceler d'eventuelles erreures, avises moi s'il manque autre chose.
1
Mathi
 
Merci pour ta réponse mais je comprends pas tout...
Comment je définis la macro variable comme alphanumérique ?
Sinon, j'ai remplacé les . par '' mais pour l'instant ça ne change rien.
Autre chose, je voulais te demander : avant de lancer ma macro, il faut que je précise data=fichier dans lequel se trouvent les infos; run; c'est bien ça ?
parceque pour l'instant, à aucun moment je ne lui ai indiqué où trouver les infos ????
0
hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention   50 > Mathi
 
Quand tu dis;
If (&var eq 'AUCUNE DIFFICULTE') then &var=0;
tu as bien mis 'AUCUNE DIFFICULTE' qui est une chaine de caracteres donc si on veut tester si missing data mettre %if &var =''.
Et puis a l'appel de ta macro, tu dois donner le nom de ton data set pour qu'il sache avec quelles donnees il va faire ses traitements. En sas, tout traitement sur des donnees doivent se faire en precisant le data set de ces donnees avec:

DATA ton_data_set;
set NOM_DATA;
traitements_a_faire;
run;

Donc, au prealable, crée ton data set avant de faire les traitement que tu veux faire.

J'espere avoir été tres clair, sinon fais le moi savoir.
0
Mathi > hssissen Messages postés 844 Date d'inscription   Statut Membre Dernière intervention  
 
merci beaucoup . ça marche!
0
pioupiou21
 
j'ai un projet sas a faire avec des macros mais je n'ai pas compris comment cela fonctionnait et vu que vous en parliez ici, pouvez vous m'expliquer en général
0