IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Utilisation de variables d'une macro dans une autre macro SAS


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Utilisation de variables d'une macro dans une autre macro SAS
    Bonjour à tous,
    je souhaiterais avoir une information par rapport à la programmation en SAS. Voilà je dispose de deux macros programmes a et b. je souhaite utiliser des variables créees dans la macro b (par exemple u et v de la table "table") dans la macro a (pour effectuer des tests)
    Est-ce possible ? Je précise aussi que j'utilise la macro b dans la macro a...
    Merci pour vos réponses !

    Voici une illustration des macro-programmes a et b (je ne sais pas si cela fonctionne, mais c'est juste pour que vous ayez un aperçu de mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    %macro a ();
     
    ...
    %b(3.6)
    ...
     
    %mend a;
     
     
    %macro b(var1,var2);
    data table;
    input res1 res2 res3;
    cards;
    1 2 3
    4 5 6
    ;
    run;
    proc print data=table;
    run;
     
    data table;
    set table;
    u = res3 * 3 + &var1;
    v = &var2 +  (2 * res2);
    w = 1/&var1;
    y = 1/&var2;
    run;
    proc print data=table;
    run;
    %mend b;
     
    %a()

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Points : 224
    Points
    224
    Par défaut
    Bonjour,

    Il faut les déclarer en global et non en paramètre de la macro b

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    %macro a ();
     
    ...
    %global var1;
    %global var2;
    %let var1=3;
    %let var2=6;
    %b(&var1, &var2)
    ...
     
    %mend a;
     
     
    %macro b;
    data table;
    input res1 res2 res3;
    cards;
    1 2 3
    4 5 6
    ;
    run;
    proc print data=table;
    run;
     
    data table;
    set table;
    u = res3 * 3 + &var1;
    v = &var2 + (2 * res2);
    w = 1/&var1;
    y = 1/&var2;
    run;
    proc print data=table;
    run;
    %mend b;
     
    %a()
    Bon courage

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut réponse
    j'ai déclaré les 2 paramètres de la macro b en global, mais je n'arrive toujours pas à récupérer le résultat de u ou de v dans la macro a.. Peut-être ai-je mal compris votre réponse ?

    Et d'une manière générale, cmt peut-on récuperer le résultat d'une variable d'une macro b (dans une macro a) s'il ne dépend pas des paramètres de la macro b?
    Je vous remercie.

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Tu crées des VARIABLES dans le macro-programme %b, d'après ton exemple. Ce ne sont pas des MACRO-VARIABLES. Elles n'ont donc pas à être globales ou locales, elles sont dans leur table et elles y restent. Si tu veux te servir de leurs valeurs, tu relis la table.
    Si tu veux les "sortir" de leur table pour en faire des macro-variables, il faut faire un CALL SYMPUTX (ou juste CALL SYMPUT en v8).
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Points : 224
    Points
    224
    Par défaut
    OK, je croyais que tu voulais récupérer var1 et var2, qui sont des macros variables.
    Si tu veux récupérer u et v qui sont des variables de ta table, suit ce qu'a t'écrit Olivier.

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut réponse
    D'accord très bien merci olivier.decourt ! je vais utiliser un call symput dans la macro b pour créer des macro-variables. Et du coup, si jutilise la macro-variable dans la macro a, elle la connaitra aussi ? Merci !

  7. #7
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    si jutilise la macro-variable dans la macro a, elle la connaitra aussi ?
    Disons que ce n'est pas automatique. On a débattu de ça la semaine dernière je crois dans un autre post. Le plus sûr, si tu as SAS v9, serait de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL SYMPUTX ("nomMV", nomVariableSAS, "G") ;
    pour que la macro-variable &nomMV soit globale (le G final) à coup sûr. Et donc visible dans le macro-programme %a.
    Bon courage.
    Olivier

  8. #8
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut remerciement
    d'accord je vais essayer, merci bien !

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Boucle sur une macro
    Bonsoir,

    j'ai une autre question toujours par rapport aux deux macros a et b : J'aimerais pouvoir appeler la macro b depuis la macro a, dans une boucle comme je l'ai écrit juste après... Cependant cela ne fonctionne pas.
    Est-ce possible ? Je vous remercie beaucoup !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    %macro a ();
    %let i=1; 
     
    %do &i=1 %to 5;
    %b()
    %let i= %sysevalf(&i+1);
    %end;
     
    %mend a;
     
     
    %macro b()
     
     
    %mend b;
     
    %a()

  10. #10
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Deux soucis dans ta boucle :
    1) au niveau du %DO, le nom de la macro-variable ne doit pas être précédé d'un & --> %DO i=1 %TO 5 ;
    2) l'incrémentation du compteur de boucle est automatique : tu n'as donc pas besoin de la ligne %LET i= %sysevalf(&i+1) ; car sinon i va être incrémenté 2 fois (il vaudra 1, puis 3, puis 5). Si c'est pourtant ce que tu veux faire (augmenter i de 2 en 2) il est plus propre d'écrire %DO i=1 %TO 5 %BY 2 ; et de virer la ligne de %LET.
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  11. #11
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut r
    Merci pour votre réponse ! j'y arrive lorsque j'incrémente avec un entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %do i=1 %to 5;
    %b()
    %end;
    mais comment faire avec un incrément décimal ? Le code ci-après ne fonctionne pas... Merci encore.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %do i=0.1 %to 0.5 %by 0.1;
    %b()
    %end;

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Tu ne peux pas : il faut que cela soit des entiers.

  13. #13
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Hello,
    sa dépend de ton usage, dans certains cas tu peux contourner ce problème.
    Il suffit de consulter le FAQs
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  14. #14
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    A part la solution de la boucle %WHILE donnée dans la FAQ, on peut aussi utiliser une boucle avec des entiers et diviser ensuite à l'intérieur d'un %SYSEVALF.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %DO i=1 %TO 5 ;
      %LET j=%SYSEVALF(&i / 10) ;
      ...
    %END ;
    Bon courage.
    Olivier

  15. #15
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 31
    Points : 20
    Points
    20
    Par défaut remerciement
    Merci beaucoup, les deux solutions fonctionnent !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo