180 likes | 337 Views
Building an Excel to SAS to Excel System. Tim Walters InfoTech Marketing. Desired Outcome – Dashboard Sheet and 6 Results Sheets. Client Environmental Considerations. Client company has software to facilitate transfer of images between mobile phones and the Internet. System Overview.
E N D
Building an Excel to SAS to Excel System Tim Walters InfoTech Marketing
Client Environmental Considerations Client company has software to facilitate transfer of images between mobile phones and the Internet
1. User Opens Excel Workbook Folder Location of SAS
3. User Runs – Launches SAS Private Sub Run_Click() access_type = &H400 still_active = &H103 'this will be used to delete files and check for existence Set fsofile = CreateObject("scripting.filesystemobject") a = ThisWorkbook.path On Error Resume Next fsofile.deletefile (a & "\phone_errors.xls") 'Deletes existing file fsofile.deletefile (a & "\site_errors.xls") 'Deletes existing file sas_location = Workbooks("company Reports.xls").Worksheets("Sheet1").Range("B1").Value sas_program = a & "\ReadWeeklyFiles.sas" datec = "'" & Application.WorksheetFunction.Text(Calendar1, "ddmmmyy") & "'" & "d" runparm = a & "\$" & datec & "$" & WeeklyFile & "$" & Weeks & "$" & CountryCutoff & "$" & HeavyUsers & _ "$" & PreviouslyActive & "$" & AccountsUsingBackup & "$" & UploadActivity & "$" & SitesConfigured _ & "$" & UploadSites & "$" & NumDaysUploads & "$" & NumDaysActiveUploads & "$" & _ OTA_Downloads completeline = sas_location & " -sysin " & sas_program & " -log " & a & " -noprint -sysparm " & runparm 'uses shell execute taskid = Shell(completeline, 1) hproc = OpenProcess(access_type, False, taskid)
3. User Runs – Excel Monitors Do 'loop continuously 'check on the process GetExitCodeProcesshproc, lexitcode 'allow event processing DoEvents Loop While lexitcode = still_active currpath = ActiveWorkbook.path If fsofile.fileexists(currpath & "\phone_errors.xls") Then MsgBox ("New phones exists. Please update handsets.csv and re-submit") Workbooks.Open (currpath & "\phone_errors.xls") Workbooks.Open (currpath & "\handsets.csv") stopper = "Yes" End If If fsofile.fileexists(currpath & "\site_errors.xls") Then MsgBox ("New sites exists. Please update parameters.csv and re-submit") Workbooks.Open (currpath & "\site_errors.xls") Workbooks.Open (currpath & "\parameters.csv") stopper = "Yes" End If If stopper <> "Yes" Then Workbooks.Open (currpath & "\Weekly Dashboard.xls") Me.Hide Unload Me End Sub
4. SAS Processing – ReadWeeklyFiles.sasRead 14 Parameters Passed %macro createmacvars; %global week_date folder filedate ; %let folder=%scan(%quote(&sysparm),1,$); %let week_date=%scan(%quote(&sysparm),2,$); %let filedate=%scan(%quote(&sysparm),3,$); %let weeks=%scan(%quote(&sysparm),4,$); %let country_cutoff=%scan(%quote(&sysparm),5,$); %let heavy_users=%scan(%quote(&sysparm),6,$); %let previous_active=%scan(%quote(&sysparm),7,$); %let accounts_using_backup=%scan(%quote(&sysparm),8,$); %let upload_activity=%scan(%quote(&sysparm),9,$); %let sites_configured=%scan(%quote(&sysparm),10,$); %let upload_sites=%scan(%quote(&sysparm),11,$); %let num_days_uploads=%scan(%quote(&sysparm),12,$); %let num_days_active_uploads=%scan(%quote(&sysparm),13,$); %let ota_downloads=%scan(%quote(&sysparm),14,$); %mend; %createmacvars;
4. SAS Processing – ReadWeeklyFiles.sasProgram Aspects • All files must be in the same folder. Folder name used for input/output files • Input %let userfile=&folder&filedate Users & Accounts.csv; %let parafile=&folder.Parameters.csv; %let handfile=&folder.Handsets.csv; • Output %let out_errors=&&folder.phone_errors.xls; %let out_weekly=&&folder.weekly.xls;
4. SAS Processing – ReadWeeklyFiles.sasStop Program for New Data /* data file of new types not in table */ data phone_errors; set company.userphone; if phone_type=" "; run; data site_errors; set company.usersite; if site_type=" "; run; /* invoke stopp macro -- if phone or site errors, stops awaiting user correction */ %stopp; %macro stopp; %if &obs_errors > 0 %then %do; ods html file="&&out_errors" style = printer headtext="<STYLE> TD {MSO-NUMBER-FORMAT:\#\#\,\#\#\#\,\#\#0;}</STYLE>"; title; proc print data=phone_errors(keep=phone_text_1_20) &printstyle; run; ods html close; %abort; %end; %if &site_o_errors > 0 %then %do; ods html file="&&out_site_errors" style = printer headtext="<STYLE> TD {MSO-NUMBER-FORMAT:\#\#\,\#\#\#\,\#\#0;}</STYLE>"; title; proc print data=site_errors(keep=site_code) &printstyle; run; ods html close; %abort; %end; %mend;
4. SAS Processing – ReadWeeklyFiles.sasOutput Files Using ODS Parameters File Fed Back to Excel data uploads_28_final; weeks=symget('weeks'); heavy_users=symget('heavy_users'); previous_active=symget('previous_active'); country_cutoff=symget('country_cutoff'); run; ods html file="&&out_within_28" style = printer headtext="<STYLE> TD {MSO-NUMBER-FORMAT:\#\#\,\#\#\#\,\#\#0;}</STYLE>"; title; proc print data=uploads_28_final &printstyle; run; ods html close; Main File ods html file="&&out_weekly" style = printer headtext="<STYLE> TD {MSO-NUMBER-FORMAT:\#\#\,\#\#\#\,\#\#0;}</STYLE>"; title; proc print data=weekly_report_out(where=(week_activated ne -10)) &printstyle; var _numeric_ ; run; ods html close;
5. Results Workbook Populated – Weekly Dashboard.xls VBA Code in Microsoft Excel Objects This Workbook
5. Results Workbook Populated – Weekly Dashboard.xls Sub Chart_Update() Application.ScreenUpdating = False Application.DisplayAlerts = False Application.EnableEvents = False a = ThisWorkbook.Path pp = "Weekly Dashboard.xls" With Workbooks(pp) ' Clear existing worksheets .Worksheets("within28").Cells.ClearContents .Worksheets("weekly").Cells.ClearContents .Worksheets("countries active").Cells.ClearContents End With ' start by processing within 28 file Workbooks.Open (a & "\within28.xls") Workbooks("within28.xls").Worksheets("within28").Cells.Select ‘selects all cells from workbook Selection.Copy ‘copy Workbooks(pp).Worksheets("within28").Activate ‘activate worksheet you want Range("A1").Select ActiveSheet.Paste
5. Results Workbook Populated – Weekly Dashboard.xls More Chart_Update Macro Statements Application.ScreenUpdating = True Application.DisplayAlerts = True Application.EnableEvents = True End Sub
6. User Distributes – Checks Data, Manually Saves, and Manually Emails
For More Information Tim Walters InfoTech Marketing 720-732-4588 tim@infotechmarketing.net