%macro xlread;
/**Assign a libname for excel sheet*/
LIBNAME XLSLIB "C:\NESUG-2011\Metabolite.xls" access=readonly;
/***PART1 OF THE PROGRAM USE PROC SQL TO READ THE SHEET NAMES IN THE EXCEL SHEET
SPECIFIED BY THE LIBNAME STATMENT ABOVE****/
/**creating macro variables for the sheet**/
proc sql noprint;
/***Get total Number of Sheets***/
select count(distinct(MEMNAME)) into: tot
from sashelp.vtable
where LIBNAME ='XLSLIB' AND INDEX(MEMNAME,'General')=0;
/**Get the sheet names without $ in to macro variables***/
select distinct(compress(MEMNAME,"',$")) into: s1 - :s%trim(%left(&tot))
from sashelp.vtable
where LIBNAME ='XLSLIB' AND INDEX (MEMNAME,'General')=0;
/**Get the sheet names with $ in to macro variables***/
select distinct(MEMNAME) into: v1 - :v%trim (%left(&tot))
from sashelp.vtable
where LIBNAME ='XLSLIB' AND INDEX (MEMNAME,'General')=0;
/**GET NAMES WITH OUT THE DELIMETERS***/
select distinct(compress(MEMNAME,"',$,-")) into: c1 - :c%trim(%left(&tot))
from sashelp.vtable
where LIBNAME ='XLSLIB' AND INDEX(MEMNAME,'General')=0;
Quit;
/***PART2 THE ABOVE MACRO VARIABLE TOT IS USE TO RUN A DO LOOP SO THAT WE HAVE TO
CREATE NAMES OF THE VARIABLES****/
%do i=1 %to &tot;
/*Create macro variables to store names of variables for reach dataset*/
proc sql noprint;
select COUNT(distinct(NAME)) into: T
from sashelp.vcolumn
where LIBNAME ='XLSLIB' AND MEMNAME="&&v&i." and SUBSTR(NAME,1,1)^='F';
select distinct(NAME) into: O1 - :O%trim(%left(&T))
from sashelp.vcolumn
where LIBNAME ='XLSLIB' AND MEMNAME="&&v&i." and SUBSTR(NAME,1,1)^='F';
QUIT;
/**set the datasets**/
data &&c&i.;
set xlslib."&&s&i.$"n;
RUN;
/**renaming the variable names to set all of them**/
PROC DATASETS LIBRARY=WORK;
MODIFY &&C&i.;
%do j=1 %to &T;
rename
&&O&j. =%sysfunc(compress("&&O&j.","',$,-,_ "));
%end;
quit;
run;
%end;
/***SAS 9.2 Code***/
data final;
set data1 - data&tot.:
run;
/***THIS MACRO WAS USED FROM SAS.COM WEBSITE
http://support.sas.com/kb/26/010.html***/
/**Code from SAS.COM***/
%macro names(prefix,maxnum);
%do i=1 %to &maxnum;
&prefix&i
%end;;
%mend names;
/***SAS 9.1.3 Code**/
data final;
set %names(Source,&tot);
run;
%mend;
%xlread;