Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro 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 27/01/2011, 12h45   #1
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Par défaut PUT dans un DDE

Bonjour,
J'utilise des liens DDE pour écrire dans un fichier Execel, j'ai bien mes données mais pas les entêtes de colonnes.
(vous avez quelque chose à mettre sous la dent pour cet aprem )

Code :
put mois '09'X var1 '09'X var2 '09'x var3
Merci de votre aide!


Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 13h39   #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
Effectivement, ce n'est pas géré ainsi avec les DDE.

Deux solutions classiques et facile à mettre en oeuvre :

- Si tu travailles avec une maquette, tu peux préremplir les entêtes

- Si tu travailles avec un fichier vierge, tu peux exporter séparément les entête. Cela consite à redéfinir un filename sur la plage correspondant à tes entêtes, et à exporter tes noms de variables comme du texte :
put "Mois" '09'x
"Libellé de ma var 1" '09'x
"Libellé de ma var 2" '09'x
"Libellé de ma var 3" ;

Au besoin, tu peux complexifier ton programme en donnant une liste de nom de variable, qui sera traité en macro, avec boucle, proc content pour récupérer les labels, etc...
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 14h01   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Merci!

Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 14h21   #4
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Si ca intéresse le forum j'avais écrit cela il y a bien longtemps.

Si ca fonctionne pour vous, notre modérateur préféré pourrait le mettre dans les outils.

Table à passer dans Excel = > dsnin=sashelp.class,
Fichier excel modèle = > lib_modele=work.Sastab,
Nom de l'onglet recevant les données = > onglet=sastab,
Nom du fichier et son emplacement = > libout_xls=work.sastoexcel,
N° de la ligne = > ldbt=1,
N° de la colonne = > cdbt=1,
Ferme ou non Excel = > close=oui,
NOTES lors de l'exécution = > notes=oui

de mémoire, ca ouvre Excel avec un temporisateur, ca recherche les noms et les libellés puis les données. Le tout est injecté dans l'onglet. Le ficheir est par défaut dans la WORK.

HTH


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
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
%macro inject(  dsnin=_last_,
                lib_modele=work.Sastab,
                onglet=sastab,
                libout_xls=work.sastoexcel,
                ldbt=1,
                cdbt=1,
				close=oui,
				notes=oui) ;
 
 
%let _notes     =%sysfunc(getoption(notes,keyword));
%let _spool     =%sysfunc(getoption(spool,keyword));
%let _source    =%sysfunc(getoption(source,keyword));
%let _symbolgen =%sysfunc(getoption(symbolgen,keyword));
%let _mprint    =%sysfunc(getoption(mprint,keyword));
%let _mfile     =%sysfunc(getoption(mfile,keyword));
%let _mlogic    =%sysfunc(getoption(mlogic,keyword));
 
options nospool nosource nosymbolgen nomprint nonotes nomlogic;
 
 
/*************************************************************************
 
Test d existence sur la table en entrée 
 
*************************************************************************/
 
DATA _null_;
    call symput('_stop',0);
 
    rcd=exist("&dsnin");
    IF rcd ne 1 then do;
    	put '';
    	put "(inject) la table SAS en entrée n est pas valide: &dsnin";
    	put '';
    	call symput('_stop',1);
    	stop;
    end;
run;
%IF &syserr > 1 OR &_stop = 1 %then %goto erreur;
 
 
/*************************************************************************
 
Création des chemins du fichier Excel en entrée 
 
*************************************************************************/
 
/*************************************************************************
Création du fichier Excel par défaut
*************************************************************************/
 
%IF &lib_modele=work.Sastab %then %do;
	%let xlsfile = %sysfunc(pathname(WORK))\sastab.xls;
	filename myXls "&xlsfile";
	ods html file=myXls;
	ods html close;
%end;
 
/*************************************************************************
Chemin et nom du fichier Excel
*************************************************************************/
 
%let libmod=%scan(&lib_modele,1,'.');
%let ficmod=%scan(&lib_modele,2,'.');
%let repin=%sysfunc(pathname(&libmod))\;
 
 
/*************************************************************************
 
Création des chemins du fichier Excel en sortie
 
*************************************************************************/
 
%let libxls=%scan(&libout_xls,1,'.');
%let ficxls=%scan(&libout_xls,2,'.');
%let repout=%sysfunc(pathname(&libxls))\;
 
filename myXls "&repout.&ficxls..xls";
 
/*************************************************************************
 
Test des paramètres utilisateurs
 
*************************************************************************/
 
DATA _null_;
    call symput('_stop',0);
 
    rcl=libref("&libmod");
    IF rcl ne 0 then do;
    	put ' ';
    	put "(inject) La librairie n est pas valide: &libmod";
    	put ' ';
    	call symput('_stop',1);
    	stop;
    end;
 
    rcm=FILEEXIST ("&repin.&ficmod..xls");
    IF rcm ne 1 then do;
    	put ' ';
		put "(inject) Le fichier modèle n existe pas: &repin.&ficmod..xls";
    	put ' ';
		call symput('_stop',1);
    	stop;
    end;
 
    rcl=libref("&libxls");
    IF rcl ne 0 then do;
    	put ' ';
    	put "(inject) La librairie n est pas valide: &libxls";
    	put ' ';
    	call symput('_stop',1);
    	stop;
    end;
 
	IF fexist ("myXls") then do;
 
		fid = fopen ("myXls");
 
		IF fid = 0 then do;
	    	put ' ';
	    	put "(inject) Le fichier de sortie est ouvert : &repout.&ficxls..xls";
	    	put ' ';
			call symput('_stop',1);
			stop;
		end;
 
	end;
 
run;
%IF &syserr > 1 OR &_stop = 1 %then %goto erreur;
 
 
/*************************************************************************
 
reprise des variables
 
*************************************************************************/
 
proc contents DATA = &dsnin Noprint out=temptab;
run;
%IF &syserr > 1 %then %goto erreur;
 
 
/*************************************************************************
Réarrangement
*************************************************************************/
 
proc sort DATA=temptab; BY varnum;run;
%IF &syserr > 1 %then %goto erreur;
 
 
/*************************************************************************
reprise des noms, des labels du nombre de colonnes et du nombre de lignes
*************************************************************************/
 
DATA _null_;
SET temptab end=fin;
call symput ('tit'!!LEFT(_n_),compbl(name));
call symput ('lab'!!LEFT(_n_),compbl(label));
IF fin then do;
    call symput ('dimc',LEFT(_n_));
    call symput ('dimr',LEFT(nobs));
end;
run;
%IF &syserr > 1 %then %goto erreur;
 
 
/*************************************************************************
Arrêt si il y a plus de 65535 lignes (limite Excel)
*************************************************************************/
 
%IF &dimr > 65535 %then %do ;
    %put %cmpres((inject) La TABLE contient %sysfunc(putn(&dimr,commax10.)) lignes.);
    %put (inject) La feuille Excel accepte 65.535 lignes maximum;
    %goto erreur;
%end;
 
 
/*************************************************************************
MV passent à 0
*************************************************************************/
 
DATA &dsnin (DROP=i);
SET &dsnin;
array num(*) _numeric_;
do i = 1 TO dim(num);
IF num(i) = . then num(i)=0;
end;
run;
%IF &syserr > 1 %then %goto erreur;
 
 
/*************************************************************************
 
Travail dans Excel
 
*************************************************************************/
 
%let tab='09'x;
 
options noxsync noxwait xmin;
 
filename openxcel dde 'excel|system';
DATA _null_;
length fid rc start stop time 8;
fid=open('openxcel','s');
IF (fid le 0) then do;
	rc = system('start excel');
	start=datetime();
	stop=start+30;
	do while (fid le 0);
		fid=fopen('openxcel','s');
		time=datetime();
		IF (time ge stop) then fid=1;
	end;
end;
rc=fclose(fid);
call sleep (1000,0.001);
run;
%IF &syserr > 1 %then %goto erreur;
 
/*************************************************************************
Ouverture du fichier modèle
*************************************************************************/
 
DATA _null_;
file openxcel;
put '[error(false)]';
Put "[open(""&repin.&ficmod..xls"")]";
run;
%IF &syserr > 1 %then %goto erreur;
 
 
/*************************************************************************
Délimitation des zones des variables, labels et des données
*************************************************************************/
 
Filename titre   DDE "excel|&repin.[&ficmod..xls]&onglet.!l&ldbt.c&cdbt.:l&ldbt.c%trim(%eval(&cdbt+&dimc-1))" notab lrecl=200000;
Filename label   DDE "excel|&repin.[&ficmod..xls]&onglet.!l%trim(%eval(&ldbt+1))c&cdbt.:l%trim(%eval(&ldbt+1))c%trim(%eval(&cdbt+&dimc-1))" notab lrecl=200000;
Filename donnees DDE "excel|&repin.[&ficmod..xls]&onglet.!l%trim(%eval(&ldbt+2))c&cdbt.:l%trim(%eval(&ldbt+&dimr+2))c%trim(%eval(&cdbt+&dimc-1))" notab lrecl=200000;
 
/*************************************************************************
Insertion
*************************************************************************/
 
DATA _null_ ;
	File titre;
	Put 
    %do i = 1 %TO &dimc;
    "&&tit&i." &tab
    %end;;
 
	file label;
	Put 
    %do i = 1 %TO &dimc;
    "&&lab&i" &tab
    %end;;
 
    DATA _null_;
    SET &dsnin;
    File donnees;
	Put 
    %do i = 1 %TO &dimc;
    &&tit&i. &tab
    %end;;
run;
%IF &syserr > 1 %then %goto erreur;
 
/*************************************************************************
Largeur des colonnes automatiquement revu
Sauvegarde dans le fichier lib_out
*************************************************************************/
 
Filename temp DDE 'excel|system';
 
DATA _null_ ;
File temp ;
put '[column.width(0,"c1:c26",false,3)]';
put '[error(false)]';
Put "[save.as(""&repout.&ficxls..xls"")]";
 
%IF &close=oui %then %do; put '[quit]'; %end;
 
run;
%IF &syserr > 1 %then %goto erreur;
 
%IF &notes=oui %then %do;
	%IF &close=oui %then %do;
		DATA _null_;
		x "explorer /e, &repout";
		Put '/************************************************************************************/ ';
		Put ' ';
		put "(inject) Pour consulter le fichier Excel &ficxls..xls ";
		put "(inject) Merci de vous référer à la fenêtre de l'explorateur qui vient d'être ouverte ";
		Put ' ';
		Put '/************************************************************************************/ ';
		run;
	%end;
 
	%IF &close=non %then %do;
		DATA _null_;
		Put '/************************************************************************************/ ';
		Put ' ';
		put "(inject) Le fichier Excel &ficxls..xls est laissé ouvert";
		Put ' ';
		Put '/************************************************************************************/ ';
		run;
	%end;
%end;
 
/*************************************************************************
Nettoyage
*************************************************************************/
 
Filename titre  clear;
Filename label  clear;
Filename donnees clear;
filename temp clear;
 
%goto fin;
 
 
%erreur:
%put ;
%put (Inject) Traitement interrompu;
 
%fin:
 
options &_spool &_source &_symbolgen &_mprint &_notes &_mlogic;
 
%mend inject;
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 14h30   #5
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Pas mal, je vais essayer de comprendre avant de l'utiliser


Brice
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h23.


 
 
 
 
Partenaires

Hébergement Web