Kết nối giữa SAS và Excel bằng ADO

Liên hệ QC

HuyNS

Thành viên mới
Tham gia
8/9/13
Bài viết
21
Được thích
1
Ai biết cách truy cập dataset của SAS bằng VBA Excel chỉ giáo hộ mình cái. Mình có đoạn code sau, đã làm đúng hướng dẫn nhưng luôn găp lỗi “ The table could not be found”. Thanks for any help !
Mã:
Sub Sas2excel()
Dim obRecordset As ADODB.Recordset
Dim i As Integer
Set obConnection = New ADODB.Connection
obConnection.Provider = "sas.LocalProvider.1"
obConnection.Properties("Data Source") = "C:\My SAS Files\9.1\"
obConnection.Open
Set obRecordset = New ADODB.Recordset
obRecordset.Open "All.sas7dbdat", obConnection, adOpenDynamic, adLockReadOnly, ADODB.adCmdTableDirect
'format the cells to text
Range(Cells(1, 1), Cells(obRecordset.RecordCount + 1, obRecordset.Fields.Count)).NumberFormat = "@"
'add header row
Cells(1, 1).Select
For i = 0 To obRecordset.Fields.Count - 1
ActiveCell.Offset(0, i).Value = obRecordset.Fields(i).Name
Next i
' add detail rows
obRecordset.MoveFirst
Cells(2, 1).SelectActiveCell.CopyFromRecordset obRecordset
obRecordset.Close
Set obRecordset = Nothing
obConnection.Close
Set obConnection = Nothing
End Sub
 
Lần chỉnh sửa cuối:
...
obRecordset.Open "All.sas7dbdat", obConnection, adOpenDynamic, adLockReadOnly, ADODB.adCmdTableDirect
...
[/code]

Đối với SAS, cách khai báo All.sas7dbdat là "thư viện tên All" + "bảng tên sas7dbdat"

Bạn có xác định thư viện chưa?

"Nobody answer" là cái gì? Học tiếng ngoại bồi mà cũng bày đặt.
Nobody là ngôi thứ ba số ít. Nếu trong một câu than thì phải dùng với answers (hoặc answered).
Nếu dùng động từ nguyên thể (không có s) thì sẽ được hiểu như một câu ra lệnh! Dịch là : không ai được trả lời!
 
Lần chỉnh sửa cuối:
Trong Folder “C:\My SAS Files\9.1\” Có 1 Table tên là All. Mình có xem properties của table All thì thấy nó ghi là .sas7bdat nên nghĩ là ghi thế thôi, thật ra thì mình cũng đã thử chỉ ghi là “All” hoặc ghi là “sasuser.all” (table alll nằm trong library sasuser) nhưng đều không được. Nó đều báo lỗi “Table not found” hoặc “Physical library does not exist or is not in a valid format”.
 
Tôi dùng đúng code của bạn. Chỉ sửa cái folder cho đúng chỗ. Và comment out cái phần ghi lên worksheet.
Nó chạy qua chỗ debug, chứng tỏ là mở được table.
(trong thư mục của tôi có một cái file tên là schedule.sas7bdat, Win 7 gọi nó là SAS Data Set)

Mã:
Sub Sas2excel()
Dim obRecordset As ADODB.Recordset
Dim i As Integer
Set obConnection = New ADODB.Connection
obConnection.Provider = "sas.LocalProvider.1"
obConnection.Properties("Data Source") = "C:\Users\myName\Documents\My SAS Files\9.1"
obConnection.Open
Set obRecordset = New ADODB.Recordset
obRecordset.Open "schedule", obConnection, adOpenDynamic, adLockReadOnly, ADODB.adCmdTableDirect
[COLOR=#008000]''format the cells to text
'Range(Cells(1, 1), Cells(obRecordset.RecordCount + 1, obRecordset.Fields.Count)).NumberFormat = "@"
''add header row
'Cells(1, 1).Select
'For i = 0 To obRecordset.Fields.Count - 1
'ActiveCell.Offset(0, i).Value = obRecordset.Fields(i).Name
'Next i
'' add detail rows
'obRecordset.MoveFirst
'Cells(2, 1).SelectActiveCell.CopyFromRecordset obRecordset
[/COLOR][COLOR=#ff0000]Debug.Print "ok"[/COLOR]
obRecordset.Close
Set obRecordset = Nothing
obConnection.Close
Set obConnection = Nothing
End Sub
 
Ok. Mình cũng vừa mới thử cho table khác với code đấy thì đều sử dụng được. Chắc là do table All có gì đặc biệt chăng ( table All mặc định trong sasuser). Nhân tiện hỏi bạn chút là liệu mình có thể chạy code của SAS thông qua VBA không? Mình muốn VBA gọi đến code SAS rồi chạy code sas đó, dữ liệu chạy SAS sẽ được chuyển sang Excel.
 
Mở một cái SAS.Workspace object và một cái SASWorkspaceManager
Dùng cái workspace object để submit cái lệnh run proc
Dùng ADO để đọc work.result
 
Giả sử bạn có 1 file “test.sas” ở Desktop của bạn thì bạn sẽ viết thế nào? Mình đang viết rồi nhưng luôn gặp lỗi “ The hostname is not recognized or invalid”, mình đang băn khoăn sử dụng mấy cái MachineDSName, LanguageService. Cảm ơn bạn nhiều !

Mã:
Sub RunSAScode()
            "
            Dim obObjectFactory As New SASObjectManager.ObjectFactory
            Dim obObjectKeeper As New SASObjectManager.ObjectKeeper
            Dim obSAS As SAS.workspace
            Dim cn As New ADODB.Connection
            Dim rs As New ADODB.Recordset
            Dim observer As New SASObjectManager.ServerDef
                
            observer.MachineDNSName = "C:\Program Files\SAS\SAS 9.1"
            'cau nay dang bi loi
            Set obSAS = obObjectFactory.CreateObjectByServer("sasserver1", True, observer, "Nhat", "")
            
            obSAS.LanguageService.Submit ("options source2 ; %include 'C:\Users\myName\Desktop\test.sas';")
            
            Dim sLog As String
            sLog = obSAS.LanguageService.FlushLog(200000)
            MsgBox "" & sLog
            obSAS.Close
            Exit Sub
End Sub
 
Web KT
Back
Top Bottom