Problème de macro sous SAS
Mathi
-
pioupiou21 -
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;;
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:
- Problème de macro sous SAS
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Free sas c'est quoi - Forum Virus
- Prélèvement par Free sans avoir souscrit ✓ - Forum Réseaux sociaux
3 réponses
Salut,
Dans une macro, les if et then deviennent des macros commandes donc mettre un % avant if et then i.e: %if et %then.
Dans une macro, les if et then deviennent des macros commandes donc mettre un % avant if et then i.e: %if et %then.
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.
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.
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 ????
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 ????
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.
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.