Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > ODS et reporting
ODS et reporting Forum d'entraide sur les fonctionnalités de reporting de SAS : gérer les sorties et graphiques de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/10/2011, 10h22   #1
Invité de passage
 
Inscription : octobre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 2
Points : 1
Points : 1
Par défaut Macro Excel Incrémentation

Bonjour,

Premier message dans ces lieux, mais vous m'avez déjà aidé à de nombreuses reprises, merci à vous.

J'ai préalablement essayé d'utiliser la fonction recherche, sans trouver de solution applicable de mon niveau (6 mois de sas).

Voilà le problème simplifié à l'extrême.

Le but du jeu est de produire une macro avec divers test statistiques, de sélectionner les valeurs importantes à exporter sous excel ; jusque là aucun problème. Mais voilà, je fais tourner cette macro
des centaines de fois, avec moult variables et cas de figures différents, et rentrer les plages de case excel pour chaque macro est parfois pénible (et si peu optimisé j'imagine). Le code se présente comme suit :


Code :
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
 
%macro exemple (varx, lig, col);
proc glm DATA=TABLE;
class &varx var1 var2 ;
model vary= &varx var1 var2 var3;
ods   output NObs=&varx.NObs;
run;
 
DATA &varx.NObs;SET &varx.NObs;
IF NObsUsed ne N then DELETE;
run;
 
DATA _null_;
SET &varx.NObs;
file q0;
 
filename q0 dde "Excel|chemin[docxls]feuille!L&lig.C&col";
 put NObsUsed; 
run;
%mend;
 
 
%exemple (varA,1,1);
%exemple (varB,1,2);
%exemple (varC,1,3);
%exemple (varD,1,4);
%exemple (varE,1,5);
%exemple (varF,1,6);
%exemple (varG,1,7);
 
*etc.;
Évidement, on parle d'une macro faisant intervenir à chaque fois une dizaine de plages de donnée d'excel, ce qui rend l'écriture de la dizaine d'argument de chaque appel de macro assez fastidieux.
J'aimerai donc, si possible, pouvoir plus simplement incrémenter certains de mes arguments (ici col, de 1) sans rajouter de code entre chaque appel de macro.

Pardonnez-moi si les termes utilisés n'étaient pas forcément les plus justes.
Merci d'avance pour votre aide potentielle.
shafian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 09h17   #2
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

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

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Hello,
Dans un contexte similaire, j'utilise la macro suivante :
Code :
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
37
38
39
40
41
42
43
44
45
%MACRO DDE_EXPORT_ROW ( VARIABLE    =           
                      , ROW         =
                      , SHEET       =   
                      , TABLE       = 
                      , FORMAT      =
                      ) ;
 
/*=== 1. Creation or modification of global macro variable DDE_ROW =================================================*/ ;
%global DDE_ROW;
 
%IF "%substr(&ROW,1,1)" = "+" OR "%substr(&ROW,1,1)" = "-"
    %then %do ;
        %let DDE_ROW = %eval(&DDE_ROW. &ROW.) ;
    %end ; 
    %else %do ;
        %let DDE_ROW = &ROW. ;
    %end ;
 
/*=== 2. Clearing the specified export area ========================================================================*/ ;
/**/DATA _NULL_; file SYS; put "[SELECT(""&DDE_RX.&DDE_ROW.&DDE_CX.3:&DDE_RX.&DDE_ROW.&DDE_CX.%eval(&DDE_NB_COL.+2)"")]"; 
/**/DATA _NULL_; file SYS; put "[CLEAR(3)]" ;
 
/*=== 3. Selection of the format ===================================================================================*/ ;
 
%IF %upcase(&VARIABLE.) = TIMEUNIT 
    %then %do ;         %let FORMAT = +(-1) ; %end ;       
    %else %do ; 
        %IF "&FORMAT." = ""
        %then %do ;     %let FORMAT = &DDE_FORMAT. ; %end ;       
        %else %do ;     %let FORMAT = &FORMAT.     ; %end ;       
    %end; 
 
/*=== 4. Export of the variable in the specified row ===============================================================*/ ;
filename export dde "Excel|&SHEET.!&DDE_RF.&DDE_ROW.&DDE_CF.3:&DDE_RF.&DDE_ROW.&DDE_CF.%eval(&DDE_NB_COL.+2)" lrecl = 5000; 
DATA _NULL_ ;
    SET  &TABLE. ;
    file export notab ; 
    IF NOT missing (&VARIABLE.) 
        then     put    &VARIABLE.  &FORMAT.  '09'x @ ;
        else     put                          '09'x @ ;
    IF _N_ > &DDE_NB_COL. then stop ;
run ;
 
 
%MEND DDE_EXPORT_ROW ;
A retenir :
- l'utilisation d'une macro variable globale DDE_ROW
- La possibilité de spécifier le paramètre de deux façons :
* soit en spécifiant la ligne où l'on exporte,
* soit en spécifiant le nombre de lignes dont on descend par rapport à l'export précédent.


Exemple appel :
Code :
1
2
3
    %DDE_EXPORT_ROW (VARIABLE = TIMEUNIT          , ROW =  7, TABLE = MYTABLE, SHEET = &DDE_SHEET.) ;
    %DDE_EXPORT_ROW (VARIABLE = NB_APPLICATION    , ROW = +1, TABLE = MYTABLE, SHEET = &DDE_SHEET.) ;
    %DDE_EXPORT_ROW (VARIABLE = MT_APPLICATION    , ROW = +1, TABLE = MYTABLE, SHEET = &DDE_SHEET.) ;
(Il y a également des complications dans la macro dont tu n'auras peut être pas besoin, spécifique à mon environnement, je te laisse "faire ton marché")
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/10/2011, 11h38   #3
Invité de passage
 
Inscription : octobre 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 2
Points : 1
Points : 1
Tout à fait excellent, c'est parfaitement ce que je cherchais. Je vais mettre un peu de temps à décortiquer, et c'est tant mieux.

Merci beaucoup pour avoir pris le temps de répondre aussi précisément, j'espère un jour pouvoir aussi aider mon prochain
shafian est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h20.


 
 
 
 
Partenaires

Hébergement Web