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 :

Changer le contenu d'une macro variable à l'aide d'une boucle


Sujet :

Macro

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 30
    Points : 33
    Points
    33
    Par défaut Changer le contenu d'une macro variable à l'aide d'une boucle
    Bonjour,

    Je vous explique mon problème: j'ai une liste d'indicateur que je dois calculer à l'aide de différents filtres. Pour l'instant l'utilisateur doit rentrer le nom de l'indicateur en paramètre dans le %LET et le programme marche.
    Cependant j'aimerais automatiser tout cela afin que toute ma liste d'indicateur se trouvant dans un fichier SAS s’exécute pour avoir tous mes filtres.

    Code pour le moment:
    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
     
    %let Indicateur="LCR_OF_RET_D_SEC_TR_5";
     
    DATA _NULL_;
    set RACINE.Stg_moteur_lcr;
    if  Nom_indicateur=&Indicateur. then
    do; 
    call symput('Filtre_gene',filtre_g_n_rique);
    call symput('Nom_du_filtre',Nom_du_filtre);
    call symput('Filtre_spe',filtre_sp_cfique);
    call symput('metrique',metrique);
    call symput('Indicateur',Nom_indicateur);
    end;
    run;
     
    proc sql;
    create table Ind.&Indicateur.  as 
    select sum(&metrique.)
    from FIL.&Nom_du_filtre.
    where &Filtre_spe. 
    ;
    quit;
    Ma liste d'indicateur se trouve dans une table SAS "stg_moteur" avec comme nom de variables "Nom_indicateur". la boucle doit se faire jusqu’à la fin de ma table et je ne sais pas par ou commencer.

    Merci de votre aide.

  2. #2
    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
    AH ! Je vais pouvoir devancer Géraldine dans la promotion d'une solution à base de CALL EXECUTE. C'est une manière de coder qui évite de passer par des macro-variables, et qui permet de rédiger un programme à partir du contenu d'une table : typiquement ce dont tu as besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA _NULL_ ;
      SET RACINE.Stg_moteur_lcr ;
      /* pour chaque indicateur */
      CALL EXECUTE("PROC SQL ; CREATE TABLE IND." !! Nom_indicateur !! " AS ") ;
      CALL EXECUTE("SELECT SUM(" !! metrique !! ")" ) ;
      CALL EXECUTE("FROM FIL."!! Nom_du_filtre) ;
      CALL EXECUTE("WHERE " !! filtre_sp_cfique) ;
      CALL EXECUTE(" ; QUIT ;") ;
    RUN ;
    Bon courage.
    Olivier

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 30
    Points : 33
    Points
    33
    Par défaut Merci de ton aide
    Encore merci, je me rappel avoir vu en cours ce CALL EXECUTE mais je l'avais oublié

    Encore une question car je me retrouve de nouveau bloqué. Si je veut mettre des IF dans ce programme comment je peut m'y prendre?

    Par exemple if filtre_sp_cfique=" " then ne pas faire exécuter CALL EXECUTE("WHERE " !! filtre_sp_cfique) ;"

    Bonne journée.

  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
    ça s'écrit à peu près exactement comme tu le penses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF NOT MISSING(filtre_sp_cfique) THEN CALL EXECUTE ("WHERE " !! filtre_sp_cfique) ;

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Merci encore, maintenant je sais que je peut manipuler les if avec les call execute.

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

Discussions similaires

  1. [XL-2010] Reprise d'une macro 1 après exécution d'une macro 2 appelée par la macro 1
    Par julio44 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/07/2014, 12h32
  2. Réponses: 1
    Dernier message: 02/06/2010, 14h05
  3. Changer le nom de variables à l'aide d'une macro
    Par cocoty dans le forum Macro
    Réponses: 4
    Dernier message: 03/07/2008, 09h12
  4. Utiliser le contenu d'une macro variable
    Par stefsas dans le forum Macro
    Réponses: 8
    Dernier message: 22/05/2008, 10h17
  5. [VBA-E]Ouvrir une image jpg àl'aide d'une macro
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/03/2006, 09h47

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