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 :

[%DO] Pourquoi ma boucle ne fonctionne-t-elle pas ?


Sujet :

Macro

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Par défaut [%DO] Pourquoi ma boucle ne fonctionne-t-elle pas ?
    Bonjour,

    Voici mon problème : ma boucle ne fonctionne pas et je ne comprends pas pourquoi. Je m'arrache les cheveux depuis hier. Pourriez-vous m'éclairer ?

    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
    option mlogic;
    data essai;
    v_1 = .;
    v_2 = 5;
    run;
     
    %macro essai();
    data essai;
    set essai;
    %do i = 1 %to 2;
    	vv_&i. = v_&i.;
    	%if v_&i. = . %then vv_&i. = 0;
    %end;
    run;
    %mend;
     
    %essai();
    Pour ma première valeur SAS revoie FALSE alors que c'est pourtant le cas j'ai bien une valeur manquante pour V_1.

    A l'aide !

    Merci infiniment

    alers

  2. #2
    Membre émérite
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Par défaut
    Bonjour,

    Tu mélange tu langage macro dans une étape data, ça ne fonctionnera donc pas (les expressions macros sont évaluées lors de la précompilation par le macro processor, avant l'exécution de l'étape data).

    Si tu veux faire une boucle dans une étape data, tu peux faire par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA essai (drop=i);
    SET essai;
    array v_(*) v_:;
    array vv_(2) ;
    do i = 1 TO 2;
    	vv_(i) = v_(i);
    	IF v_(i) = . then vv_(i) = 0;
    end;
    run;
    Bon courage

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Par défaut
    Merci, ça fonctionne impeccablement !

    En fait si je mets %do i = 1 %to 2 et le %end associé en dehors de l'étape et les IF/THEN sans % data ça fonctionne aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    %macro essai();
    %do i = 1 %TO 2;
    DATA essai;
    SET essai;
     
    	vv_&i. = v_&i.;
    	IF v_&i. = . then vv_&i. = 0;
     
    run;
    %end;
    %mend;
    Mais ça exécute plusieurs fois l'étape DATA donc nettement moins intéressant que ta méthode.

    Merci !

    alers

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Par défaut
    Bonjour,

    Je m'excuse de revenir sur ce sujet mais en fait je me rends compte aujourd'hui que je n'ai pas bien compris la réponse. Pourquoi exactement ce que j'ai fait au début ne peut pas fonctionner ?

    Là je suis de nouveau bloqué sur une autre macro qui me semble similaire, et je ne comprends pas pourquoi ça ne fonctionne pas...

    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
    data table;
    var1 = "[.]";
    var2 = "[5]";
    run;
     
    option mprint mlogic;
    %macro try();
    %do i = 1 %to 2;
    data table2;
    set table;
    %if var&i. = "[.]" %then var&i. = "";
    run;
    %end;
    %mend;
     
    %try();
    Je ne comprends pas du tout car j'utilise souvent des boucles et des %IF dans des data step de mes macros-programmes et ça fonctionne, mais pas là.

  5. #5
    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 : 49
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Pour faire simple :
    si la condition porte sur la valeur d'une macro-variable et doit être évaluée une seule fois --> %IF
    si la condition porte sur la valeur d'une variable SAS et doit être évaluée à chaque observation --> IF

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Par défaut
    En l'occurence var.&i est considéré comme une macro-variable ou une variable SAS normale ? De plus, pour l'exemple je n'ai mis qu'une seule ligne, dans ma vraie table il y en a plusieurs. J'ai donc une variable avec la macro-variable &i que je dois faire tourner sur toutes les lignes.

    Peut-on faire une boucle DO classique (étape data) sans avoir à créer des ARRAY avant ?

Discussions similaires

  1. [Débutant] Pourquoi mes mini boucles ne fonctionnent pas ?
    Par Attila54 dans le forum VB.NET
    Réponses: 7
    Dernier message: 09/10/2012, 11h55
  2. [MySQL] Boucle ne fonctionne pas pourquoi ?
    Par BXDSPORT dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/07/2011, 17h05
  3. Pourquoi ebx,'A' ne fonctionne-t-il pas ?
    Par Lulu_n10 dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/01/2009, 01h14
  4. Pourquoi une boucle For i = 1 to. . . commence-t-elle à 2 ?
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/03/2008, 10h41
  5. Réponses: 11
    Dernier message: 11/05/2006, 09h05

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