Bonjour,
Cette année encore, je sollicite vos compétences en SAS macro mais plus particulièrement sur les liaisons DDE entre SAS 9.1.3 et excel 2007.
Je vous explique mon cas:
Je dois exporter des données SAS dans des tableaux pré-paramétrés dans excel. Pour ce faire, j'utilise habituellement les liaisons dde pour ouvrir mon classeur et transférer les données dans telle ligne, telle colonne. J'utilise aussi des macros, car les opérations à effectuer sont les mêmes avec des variables différentes. Et le plus important, ici dans ce cas, est le fait que je dois réitérer ce programme 40 fois (pour 40 individus) dans 40 onglets différents.
Je me demandais donc, s'il n'y avait pas un moyen (un code plus exactement) pour systématiser cette manipulation dans 40 onglets?
Voici mon code qui permet de créer un classeur pour un individu:
Et voici ce que j'ai rajouté pour essayer de systématiser l'export de données SAS vers plusieurs onglets (40). Ma variable "repère" est NCR, il y aura autant d'onglet que de NCR.
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 /*Il faut que Excel soit ouvert au préalable*/ /*ces deux lignes servent à rendre la liaison possible et normalement ouvre excel mais bon la tu l'as deja ouvert*/ options noxwait noxsync; x 'C:\Program Files\Microsoft Office\Office12\EXCEL.EXE'; /*tu attends 2 secondes avant de générer la liaison excel afin que le process excel soit bien lancée mais la aussi c'est un peu inutile vu que excel est déjà ouvert*/ data _null_; x=sleep(2); run; /*tu permets la manipulation de excel à partir de sas grâce à cette ligne*/ filename cmds dde 'excel|system'; /*tu ouvres le fichier où tu as ton modèle*/ data _null_; file cmds; put "%bquote ([OPEN("C:\DONNEE\estelle\.....\diagnostic CR.xls")])"; run; %macro CR(NCR); DATA STICR; SET STIC; IF CR=&NCR; RUN; %macro remp (feuille,nligne,ncol); DATA CR (KEEP= CR); SET STICR; RUN; PROC SORT DATA=CR NODUPKEY; BY CR; RUN; filename col1 dde "excel|&feuille!L&nligne.C&ncol.:L&nligne.C&ncol."; data _null_ ; file col1; set Cr; put CR ; run; PROC DATASETS LIBRARY=WORK; DELETE CR C1; RUN; %mend; %remp(EXEMPLE,5,4); /* NB de MENAGE */ %macro remp1a (base,NB,feuille,nligne,ncol); data C (KEEP= MARCHE ID_MENA &NB); SET &base; run; PROC SORT DATA=C nodupkey; BY MARCHE ID_MENA; RUN; proc means data=C noprint; by MARCHE ; var &NB; output out=C1 (DROP= _TYPE_ _FREQ_ ) SUM = ; run; filename col1 dde "excel|&feuille!L&nligne.C&ncol.:L&nligne.C&ncol."; data _null_ ; file col1; set C1; put &NB ; ATTRIB &NB FORMAT=numx8.4; run; PROC DATASETS LIBRARY=WORK; DELETE C C1 ; RUN; %mend; %remp1a (STICR,NMENA,EXEMPLE,6,4); /* MARCHE CLIENT_CR */ %macro remp1 (base,NB,feuille,nligne,ncol); data C (KEEP=MARCHE &NB); SET &base; run; PROC SORT DATA=C; BY MARCHE ; RUN; proc means data=C noprint; by MARCHE ; var &NB; output out=C1 (DROP= _TYPE_ _FREQ_ ) SUM = ; run; filename col1 dde "excel|&feuille!L&nligne.C&ncol.:L&nligne.C&ncol."; data _null_ ; file col1; set C1; put &NB ; ATTRIB &NB FORMAT=numx8.4; run; PROC DATASETS LIBRARY=WORK; DELETE C C1 ; RUN; %mend; %remp1(STICR,NCLI,EXEMPLE,7,4); %remp1(STICR,NB_DAV,EXEMPLE,11,4); %remp1(STICR,MPOPU,EXEMPLE,12,4); %remp1(STICR,NDAV,EXEMPLE,14,4); %remp1(STICR,MDAV,EXEMPLE,16,4); /*tu enregistres ton classeur rempli et tu le fermes*/ data _null_; file cmds; put " %bquote ([SAVE.AS("C:\DONNEE\estelle\...\CR'&NCR'_diagnostic CR.xls")])"; put " %bquote([QUIT()])"; run; %mend; %cr(802); %cr(810); %cr(812); . . /* 40 individus = 40 classeurs */ . %cr(893);
Mais, quand j'effectue ce drenier code j'ai ce message d'erreur:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88options noxwait noxsync; x 'C:\Program Files\Microsoft Office\Office12\EXCEL.EXE'; data _null_; x=sleep(2); run; filename cmds dde 'excel|system'; data _null_; file cmds; put "%bquote ([OPEN("C:\DONNEE\estelle\.....\diagnostic CR.xls")])"; run; /* début de la macro CR */ %macro CR(NCR); /* on passe la variable feuille en global pour l'appeler d'où on veut */ %global feuille ; /* on lui afecte la valeur de NCR */ %let feuille = &NCR ; /* affiche dans la log la valeur de la macro variable feuille, j'ai un doute sur la syntaxe &NCR ou &NCR. ????? */ %put &feuille; DATA STICR; SET STIC; IF CR=&NCR; RUN; %macro remp (feuille,nligne,ncol); DATA CR (KEEP= CR); SET STICR; RUN; PROC SORT DATA=CR NODUPKEY; BY CR; RUN; filename col1 dde "excel|&feuille!L&nligne.C&ncol.:L&nligne.C&ncol."; data _null_ ; file col1; set Cr; put CR ; run; PROC DATASETS LIBRARY=WORK; DELETE CR C1; RUN; %mend; %remp(EXEMPLE,5,4); /* * * */ /* MARCHE CLIENT_CR */ %macro remp1 (base,NB,feuille,nligne,ncol); data C (KEEP=MARCHE &NB); SET &base; run; PROC SORT DATA=C; BY MARCHE ; RUN; proc means data=C noprint; by MARCHE ; var &NB; output out=C1 (DROP= _TYPE_ _FREQ_ ) SUM = ; run; filename col1 dde "excel|&feuille!L&nligne.C&ncol.:L&nligne.C&ncol."; data _null_ ; file col1; set C1; put &NB ; ATTRIB &NB FORMAT=numx8.4; run; PROC DATASETS LIBRARY=WORK; DELETE C C1 ; RUN; %mend; %remp1(STICR,NCLI,EXEMPLE,7,4); %remp1(STICR,NB_DAV,EXEMPLE,11,4); %remp1(STICR,MPOPU,EXEMPLE,12,4); %remp1(STICR,NDAV,EXEMPLE,14,4); %remp1(STICR,MDAV,EXEMPLE,16,4); /*tu enregistres ton classeur rempli et tu le fermes*/ data _null_; file cmds; put " %bquote ([SAVE.AS("C:\DONNEE\estelle\...\CR_diagnostic CR.xls")])"; put " %bquote([QUIT()])"; run; %mend; %cr(802 810 ..... 893 );
ERREUR: Le fichier physique n'existe pas, excel|802 810!L12C4:L12C4.
Je pense qu'il faudrait créer une boucle avec %do i=802 %to=893, mais n'étant pas très avertie sur les macros, j'aimerais avoir votre avis sur ce problème. Si je n'ai pas été assez claire, n'hésitez pas à me demander des précisions.
Merci de votre aide.




Répondre avec citation




Partager