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 input dans une macro pour tester une variable


Sujet :

Macro

  1. #1
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut Utilisation input dans une macro pour tester une variable
    Bonsoir,
    j'essaie de faire une macro qui vérifie que la valeur d'une variable est numérique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %Macro Contenu_Numeric(MyvarIn);
    	%global Flag;
    	%let Flag=1;
     
    	%local temp;
    	%let temp=%sysfunc(input(&MyVarIn,best.));
     
    	%if &temp eq . %then %let Flag=0;
    %Mend;
    Me renvoie à l'exécution :
    ERREUR: The INPUT function referenced in the %SYSFUNC or %QSYSFUNC macro function is not found.
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %Macro Contenu_Numeric(MyvarIn);
    	%global Flag;
    	%let Flag=1;
     
    	%local temp;
    	%let temp=%input(&MyVarIn,best.);
     
    	%if &temp eq . %then %let Flag=0;
    %Mend;
    Produit à la compilation :
    ERREUR: Macro keyword INPUT appears as text. A semicolon or other delimiter may be missing.
    Sinon j'ai aussi essayé une autre macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    %Macro Contenu_Numeric(MyvarIn);
    	%global Flag;
    	%let Flag=1;
     
    	%local l;
    	%local n;
     
    	%let l=%length(&MyVarIn);
    	%do n=1 %to &l;
    		%if %sysfunc(substr(&MyVarIn,&n,1)) not in ('0','1','2','3','4','5','6','7','8','9','.',',') %then %let flag=0;
    	%end;
    %Mend;
    qui produit à l'éxécution, avec ou sans %sysfunc :

    ERREUR: The macro CONTENU_NUMERIC will stop executing.
    ERREUR: A character operand was found in the %EVAL function or %IF condition where a numeric
    operand is required. The condition was: %sysfunc(substr(&MyVarIn,&n,1)) not in
    ('0','1','2','3','4','5','6','7','8','9','.',',')

    Si quelqu'un a une idée de syntaxe pour la 1ère ou la seconde macro, je suis preneur.

    Merci
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  2. #2
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Avec input, tu essaies de transformer le texte en valeur numérique, alors qu'une macro variable ne peut pas être numérique, c'est peut-être l'origine du problème ?

    J'ai un truc qui marche avec le code suivant, mais suis pas sûr que ça réponde à ton besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    %Macro Contenu_Numeric(MyvarIn);
    	%global Flag; %let Flag=1;
        %local j k ;
        %let j      = %sysfunc(compress(&&&myvarin.,' 0123456789.,'));  %put j    = &j. ;
        %let k      = %sysfunc(lengthn("&j.")) ;                        %put k    = &k. ;
        %let flag   = %eval(&k. = 2 ) ;                                 %put flag = &flag. ;
    %Mend;
     
    %let i = 154124  ;  %contenu_numeric(i);  %put i = &i., flag = &flag. ;
    %let i = 14.1421 ;  %contenu_numeric(i);  %put i = &i., flag = &flag. ;
    %let i = 14.14aa ;  %contenu_numeric(i);  %put i = &i., flag = &flag. ;
    %let i =         ;  %contenu_numeric(i);  %put i = &i., flag = &flag. ;

  3. #3
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Merci Rémi pour ton aide

    Ton exemple fonctionne bien.

    Dans mon cas j'aurais besoin de de pouvoir appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %Contenu_Numeric(Variable);
    car j'appelle la macro dans une étape data par le biais d'un CALL EXECUTE et récupère la valeur de &flag dans la suite de l'étape data.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %Contenu_Numeric('10');
    produit Flag=0 dans la log.

    Je vais revenir à mon idée de input mais sans macro ça sera plus simple
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  4. #4
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Si la valeur de la macro variable est entre simple quote, ça nécessite une petite adaptation effectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %Macro Contenu_Numeric(MyvarIn);
    	%global Flag; %let Flag=1;
        %LOCAL j k ;
        %let j      = %sysfunc(compress(&&&myvarin.," 0123456789.,"));   /*%put j    = &j. ;    */ 
        %let k      = %sysfunc(lengthn(&j.)) ;                           /*%put k    = &k. ;    */ 
        %let flag   = %eval(&k. = 2 ) ;                                  /*%put flag = &flag. ; */
    %Mend;
     
    %let i = '10'    ;  %contenu_numeric(i);  %put i = &i., flag = &flag. ;
    %let i = 'aa'    ;  %contenu_numeric(i);  %put i = &i., flag = &flag. ;
    qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = '10', flag = 1
    i = 'aa', flag = 0

  5. #5
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Merci Rémi,
    ton exemple fonctionne bien mais dans une étape data je récupère toujours 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data _null_;
    	%Contenu_Numeric('40');
    	%put &flag;
    run;
    Me donne :

    14935 data _null_;
    14936 %Contenu_Numeric('40');
    14937 %put &flag;
    0
    14938 run;
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  6. #6
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Si myvarin est une valeur plutôt qu'une macrovariable, alors il faut enlever le "&&&" :
    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
    %Macro Contenu_Numeric(MyvarIn);
    	%global Flag; %let Flag=1;
        %LOCAL j k ;
        %let j      = %sysfunc(compress(&myvarin.," 0123456789.,"));   /*%put j    = &j. ;    */ 
        %let k      = %sysfunc(lengthn(&j.)) ;                         /*%put k    = &k. ;    */ 
        %let flag   = %eval(&k. = 2 ) ;                                /*%put flag = &flag. ; */
    %Mend;
     
    DATA _null_;
    	%Contenu_Numeric('40'); %put &flag;
    	%Contenu_Numeric('aa'); %put &flag;
    	%Contenu_Numeric('1.5'); %put &flag;
    	%Contenu_Numeric('1  '); %put &flag;
    	%Contenu_Numeric('11aa'); %put &flag;
    run;

  7. #7
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Ca marche impeccable

    Merci Rémi
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

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

Discussions similaires

  1. [XL-2007] Problème dans une macro pour ajouter une date
    Par INFINITY100 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/05/2015, 20h28
  2. Réponses: 2
    Dernier message: 30/01/2014, 09h49
  3. Réponses: 8
    Dernier message: 04/01/2008, 08h28
  4. [Macro Access] pb dans mon code pour lancer une macro Access
    Par Commodore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2007, 10h51
  5. faire une condition pour arrêter une macro
    Par db48752b dans le forum Access
    Réponses: 11
    Dernier message: 21/09/2006, 20h21

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