2013-07-18 100 views
6

我希望有人可以提供幫助。我正在嘗試構建一個從VBA啓動SAS的子例程。我一直在使用SAS工作區管理器。由於我在離舒適區很遠的地方漫步,我主要關注了我在這些twosources中發現的內容。以下是我想出了迄今爲止在VBA:從VBA運行SAS,完全訪問

Public Sub SubmitSasProg(usrid As String, passid As String, path As String, sasprog As String, varinput As String, Optional logreturn) 
    Dim obWsMgr As New SASWorkspaceManager.WorkspaceManager 

Dim obSAS As SAS.Workspace 
Dim xmlInfo As String 

Set obSAS = obWsMgr.Workspaces.CreateWorkspaceByServer("Local", VisibilityProcess, Nothing, usrid, passid, xmlInfo) 

Dim obStoredProcessService As SAS.StoredProcessService 
Set obStoredProcessService = obSAS.LanguageService.StoredProcessService 

obStoredProcessService.Repository = "file:" & path 
obStoredProcessService.Execute sasprog, varinput 

If IsMissing(logreturn) Then logreturn = 100000 
MsgBox obSAS.LanguageService.FlushLog(logreturn) 

End Sub 

而且我有我自己一點點SAS方案,我們稱之爲「Test.sas」:

%let loopTimes=3; 
*ProcessBody; 
data a; 
do x= 1 to &loopTimes; 
y=x*x*x; 
output; 
end; 
run; 

現在,這條線將工作中庸之道罰款:

Call SubmitSasProg("myuserid", "mypassword", "somepath", "Test", "loopTimes=10") 

但每當我試圖執行一個SAS proceedure是修改文件/ libnames等。我會得到一個無論是「此SAS會話的操作無效」或「用戶不能訪問」。 請注意,我在本地使用SAS,而不是在服務器上。 所以我猜測我沒有正確地使用我的SAS worksession登錄並且沒有權限。我認爲CreateWorkspaceByServer中的用戶ID和密碼參數應該登錄我。

所以我的問題是如何成功地啓動SAS會話與我的本地計算機上的憑據,並具有所有正常訪問我會有通過打開窗戶的environement。

只是爲了澄清,這SAS過程將在窗口environement做工精細:

Data _NULL_; 
     *x del C:\WINDOWS; 
     x mkdir C:\Users\Myname\Desktop\NewFolder; 
    run; 

但是,如果從VBA開始它會失敗與代碼「這個SAS會話的操作無效」。 如果我嘗試編寫SAS數據集,會發生類似的情況。

我一直在尋找一段時間,但大多數線程都是關於SAS服務器會話。 任何幫助,將不勝感激。

+0

哇...這是相當邊緣的情況下。我的猜測是,SAS進程正在啓動它的進程的權限下運行,並且VBA進程限制了權限(以防止惡意腳本嵌入無害的文檔中以接管您的機器)。 – JDB

+0

您正在運行哪個版本的SAS和OS? –

+0

這將是基本的SAS 9.2和Win 7 32b。也可能值得注意的是,我沒有在這臺機器上設置管理員帳號,儘管這並不影響SAS窗口環境。我會用管理員帳號試試我的運氣...誰知道。 – Pane

回答

2

嗯,它看起來像我的大部分問題,從事實幹,我不是管理員在我的系統上。 我已經成功地使用上述技術編寫數據集,因爲我使用我的帳戶(duuh)在目錄上寫入權限。阿拉斯,x命令是固執的,不會工作,以免讓我自己成爲一個管理員帳戶。所以,有兩個選擇來「解決」這個問題: 1.獲得管理員權限。 或 2.忘記工作區管理器。使用OleObjects。

雖然不太優雅,而且執行時可能會耗費更多的時間(未測試),但OleObject將讓我充分使用SAS。這裏是VBA代碼:

Dim OleSAS As Object 
Set OleSAS = CreateObject("SAS.Application") 
OleSAS.Visible = True 
OleSAS.Top = 1 
OleSAS.Title = "Automation Server" 
OleSAS.Wait = True 
OleSAS.Submit(yourSAScode) 
OleSAS.Quit 
Set OleSAS = Nothing 

如果你想運行一個特定的進程並像* ProcessBody一樣改變一些宏變量;只需做OleSAS.Submit(「%let」& variable_name &「=」&「yourValue」)和OleSAS.Submit(「%include」& your_program)。

無論如何,我很遺憾地失去了我在Worspace Manager上的日誌報告返回,對於快速調試來說這真的很棒。 希望這是有用的。

0

我知道以前我遇到過SAS/Intrnet沒有安裝所需的安全策略的問題。我不能保證,這將修復它,但它的地方開始尋找:

控制面板 - >管理工具 - >本地安全策略

安全設置 - >本地策略 - >用戶權利Assignments->作爲批處理作業登錄

確保SAS將用於運行作業的帳戶擁有此權限。

另外,你是否說你的test.sas程序失敗,因爲它試圖寫一個數據集?

此外,您可能會遇到一些同樣的問題我已經在這裏了:

Using SAS and mkdir to create a directory structure in windows