SAS IOMをExcelから使う

この例では、
ExcelのVBAでSAS Workspaceオブジェクトを生成し、
SASのmeansプロシジャで、実行結果をデータセットに出力するように指定してプロシジャを実行、
実行結果をSASデータセットからADOを使ってレコードセットに読み込み、
レコードセットの内容をExcelシートにコピー
します。

ローカルサーバでSASのIOMを使う場合には、SAS® Integration Technologiesのライセンスは必要ありませんが、DCOMCNFGで規定の偽装レベルを設定設定する必要があります。(WorkspaceオブジェクトをSAS.Workspaceから直接作成する場合には設定の必要がありませんが、この例ではADOのプロバイダーIDを取得するためにWorkspaceManagerからWorkspaceオブジェクトを作成するのでDCOMCNFGの設定が必要になります。)

DCOMCNFGによる規定の偽装レベルの設定

DCOMCNFG.exeを起動して規定のプロパティの規定の偽装レベルを偽装するに設定してください。

ExcelのVBAの設定

[ツール]->[参照設定]メニューで参照設定ダイアログボックスを開いて、Microsoft ActiveX Data ObjectsとMicrosoft ActiveX Data Objects Recordset,  SAS: Integrated Object Model, SASWorkspaceManager Type Libraryを参照可能なライブラリに選択します。

VBAの例

Option Explicit

Sub SASsample( )
    Dim objWM As New SASWorkspaceManager.WorkspaceManager
    Dim objWorkspace As SAS.Workspace
    Dim xmlinfo As String
    Dim dbCN As ADODB.Connection
    Dim dbRS As ADODB.Recordset
    Dim dbCOM As ADODB.Command
    Dim nFields As Long
    Dim rid As Long
    Dim cid As Long

    Set objWorkspace = objWM.Workspaces.CreateWorkspaceByServer("", _
        VisibilityProcess, Nothing, "", "", xmlinfo)
    ' Submit SAS Procedures
    objWorkspace.LanguageService.Submit _
        "Proc means data=sashelp.prdsale; class country; var actual; output out=prd_mean; Run;"
    'Create a Connection Object
    Set dbCN = New ADODB.Connection
    dbCN.Open "Provider=SAS.IOMProvider.1;SAS Workspace ID=" & objWorkspace.UniqueIdentifier
    'Create a Command Object
    Set dbCOM = New ADODB.Command
    dbCOM.ActiveConnection = dbCN
    dbCOM.CommandText = "select * from prd_mean"
    'Get Records from a SAS Dataset
    Set dbRS = dbCOM.Execute
    'Get Field Count
    nFields = dbRS.Fields.Count
    'Set Field Names
    For cid = 1 To nFields
        Sheet1.Cells(1, cid).Value = dbRS.Fields(cid - 1).Name
    Next

    rid = 2
    Do Until dbRS.EOF
        For cid = 1 To nFields
            Sheet1.Cells(rid, cid).Value = dbRS.Fields(cid - 1).Value
        Next
        rid = rid + 1
        dbRS.MoveNext
    Loop
    dbRS.Close
    Set dbRS = Nothing
    dbCN.Close
    Set dbCN = Nothing
    Set dbCOM = Nothing
    objWorkspace.Close
    Set objWorkspace = Nothing

End Sub

 

実行結果