LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (November 2009, week 5)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
Date:   Mon, 30 Nov 2009 07:58:28 -0500
Reply-To:   Arthur Tabachneck <art297@NETSCAPE.NET>
Sender:   "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From:   Arthur Tabachneck <art297@NETSCAPE.NET>
Subject:   Re: Anyone familiar with Excel 4 macro language?
Comments:   To: Søren Lassen <s.lassen@POST.TELE.DK>
Content-Type:   text/plain; charset=ISO-8859-1

Søren,

I probably am making things more complicated than necessary, but I think that your suggestion would be oversimplifying the problem statement. The complications were added so that two specific Excel formats could be differentiated, namely m/d/yyyy and d/m/yyyy.

Art ---------- On Mon, 30 Nov 2009 01:54:12 -0500, S=?ISO-8859-1?Q?=C3=B8ren?= Lassen <s.lassen@POST.TELE.DK> wrote:

>Art, >You can download a complete help file of Excel 4.0 macro functions >from http://support.microsoft.com/kb/q128185/. > >Though I cannot help thinking that you are making things a little more >complicated than necessary - would something like this not work: > >options noxsync noxwait xmin; >filename sas2xl dde 'excel|system'; > >/*Open Excel*/ >data _null_; > length fid rc start stop time 8; > fid=fopen('sas2xl','s'); > if (fid le 0) then do; > rc=system('start excel'); > start=datetime(); > stop=start+10; > do while (fid le 0); > fid=fopen('sas2xl','s'); > time=datetime(); > if (time ge stop) then fid=1; > end; > end; > rc=fclose(fid); >run; >data _null_; > file sas2xl; > put '[open("c:\datetest.xls")]'; >run; > >filename xldates dde 'excel|[datetest.xls]sheet1!r2c1:r15c1' notab; > >data one; > infile xldates truncover; > input datetxt $char40.; > /* and then you can use your SAS code to convert datetext to a date */ >run; > >Regards, >Søren > > >On Sun, 29 Nov 2009 12:30:03 -0500, Arthur Tabachneck <art297@NETSCAPE.NET> >wrote: > >>I'll try to make this request brief, but what appeared at first to be a >>simple question is quickly turning into a dissertation. >> >>I'm working with a very short excel file (c:\DateTest.xls) that appears as >>follows: >> >>date >>jan.1, 2009 >>Friday, January 02, 2009 >>Saturday, January 03, 2009 >>01/04/09 >>01/05/09 >>01/06/09 >>7/1/2009 >>8/1/2009 >>9/1/2009 >>jan-10-09 >>11-Jan >>january-12-2009 >>january/13/2009 >>2009-jan-14 >> >>The 14 rows represent Jan 1, 2009 thru Jan 14, 2009 in various formats. >> >>Even if one licences SAS/ACCESS for pc file formats, proc import can't >>directly interpret all of the rows correctly. I was able to get it to work >>with a double import and then a little more work after merging the two >files >>together: >> >>PROC IMPORT OUT= WORK.INPUTa >> DATAFILE= "c:\DateTest.xls" >> DBMS=EXCEL REPLACE; >> SHEET="Sheet1$"; >> GETNAMES=YES; >> MIXED=NO; >> SCANTEXT=YES; >> USEDATE=YES; >> SCANTIME=YES; >>RUN; >> >>PROC IMPORT OUT= WORK.INPUTb >> DATAFILE= "c:\DateTest.xls" >> DBMS=EXCEL REPLACE; >> SHEET="Sheet1$"; >> GETNAMES=YES; >> MIXED=YES; >> SCANTEXT=YES; >> USEDATE=YES; >> SCANTIME=YES; >>RUN; >> >>data want (drop=bdate); >> merge INPUTa INPUTb (rename=(date=bdate)); >> if missing(date) then do; >> Date=inputn (bdate , 'anydtdte' , 20 ); >> if missing(Date) and substr(bdate,length(bdate)-2,1) eq '-' then do; >> if substr(bdate,length(bdate)-1) le 9 then bdate= >> catt(substr(bdate,1,length(bdate)-2),'20', >> substr(bdate,length(bdate)-1)); >> else bdate=catt(substr(bdate,1,length(bdate)-2),'19', >> substr(bdate,length(bdate)-1)); >> date=inputn (bdate , 'anydtdte' , 20 ); >> end; >> end; >>run; >> >>However, I wanted to include a solution for those who don't license >>SAS/ACCESS for pc formats as well. One of Koen Vverman's old excellent >SAS- >>L posts shows how one can accomplish getting and using functions in the >form >>of old-style Excel macros via DDE: >>http://www.listserv.uga.edu/cgi-bin/wa?A2=ind0209A&L=sas-l&P=12088 >> >>I was able to modify his example to accomplish what I wanted to do but, >>since my Excel macro skills aren't sufficiently strong, the solution is >>quite round about and requires a manual save of the end file. >> >>My code follows. What I am looking for is what to add to get the Excel >>macro to save the resulting file as a comma separated file. Of course, I >>wouldn't complain if anyone also had suggestions for cleaning up the code >>itself. >> >>Art >>-------- >>/*Set options and filename for dde commands*/ >>options noxsync noxwait xmin; >>filename sas2xl dde 'excel|system'; >> >>/*Open Excel*/ >>data _null_; >> length fid rc start stop time 8; >> fid=fopen('sas2xl','s'); >> if (fid le 0) then do; >> rc=system('start excel'); >> start=datetime(); >> stop=start+10; >> do while (fid le 0); >> fid=fopen('sas2xl','s'); >> time=datetime(); >> if (time ge stop) then fid=1; >> end; >> end; >> rc=fclose(fid); >>run; >> >>/*Open spreadsheet*/ >>data _null_; >> file sas2xl; >> put '[open("c:\datetest.xls")]'; >>run; >> >>/*Insert an old-style macro-sheet into the workbook.*/ >>data _null_; >> file sas2xl; >> put '[workbook.next()]'; >> put '[workbook.insert(3)]'; >>run; >> >>/*Create and run the macro*/ >>filename xlmacro dde 'excel|macro1!r1c1:r100c1' notab lrecl=200; >>data _null_; >> file xlmacro; >> put '=set.name("Tag",!$b$1)'; >> put '=formula("<>",Tag)'; >> put '=set.name("OldValue",!$c$1)'; >> put '=set.name("NewValue",!$b$2)'; >> put '=for.cell("CurrentCell",sheet1!$a$2:$a$100,true)'; >> put '=formula(get.cell(5,CurrentCell),OldValue)'; >> put '=formula("=concatenate(Tag,OldValue)",NewValue)'; >> put '=formula(NewValue,CurrentCell)'; >> put '=next()'; >> put '=halt(true)'; >> put '!dde_flush'; >> file sas2xl; >> put '[run("macro1!r1c1")]'; >>run; >>filename xlmacro clear; >> >>/*Save the spreadsheet as a csv file - then import the data*/ >>data want (keep=date); >> infile "c:\DateTest.csv" dsd dlm="," lrecl=32768 firstobs=2; >> informat rawdate $20.; >> input rawdate; >> format date date9.; >> rawdate=substr(rawdate,3); >> if anyalpha(rawdate) then do; >> date=inputn (rawdate , 'anydtdte' , 20 ); >> if missing(Date) and >> substr(rawdate,length(rawdate)-2,1) eq '-' then do; >> if substr(rawdate,length(rawdate)-1) le 9 then rawdate= >> catt(substr(rawdate,1,length(rawdate)-2),'20', >> substr(rawdate,length(rawdate)-1)); >> else rawdate= >> catt(substr(rawdate,1,length(rawdate)-2),'19', >> substr(rawdate,length(rawdate)-1)); >> date=inputn (rawdate , 'anydtdte' , 20 ); >> end; >> end; >> else Date=rawdate-21916; >>run;


Back to: Top of message | Previous page | Main SAS-L page