2011年1月26日

EXCEL VBA 讀取MS-SQL資料庫的資料

範例如下:

 

    Sub test()  '定義過程名稱 

'i,j為整數變數;sht 為excel工作表物件變數,指向某一工作表
Dim i As Integer, j As Integer, sht As Worksheet

'定義資料連結物件 ,保存連接資料庫資訊;請先引用ADO
Dim cn As New ADODB.Connection

Dim rs As New ADODB.Recordset '定義記錄物件

Dim strCn As String, strSQL As String

'定義資料庫連結字串
strCn = "Provider=sqloledb;Server=伺服器名稱或IP地址;Database=資料庫名稱;Uid=用戶登錄名;Pwd=密碼;"

'下面的語句將讀取資料表資料,並將它保存到excel工作表中:
'畫兩張表想像一下, 工作表為一張二維表, 記錄集也是一張二維表
strSQL = "select 欄位1,欄位2 from 表名稱" '定義SQL查詢命令字串
cn.Open(strCn) '與資料庫建立連接,如果成功,返回連線物件cn
rs.Open(strSQL, cn) '執行strSQL所含的SQL命令,結果保存在rs記錄集物件中
i = 1
sht = ThisWorkbook.Worksheets("sheet1") '把sht指向當前工作簿的sheet1工作表
Do While Not rs.EOF '當資料指標未移到記錄集末尾時,迴圈下列操作
sht.Cells(i, 1) = rs("欄位1") '把目前記錄的欄位1的值保存到sheet1工作表的第i行第1列
sht.Cells(i, 2) = rs("欄位2") '把當前欄位2的值保存到sheet1工作表的第i行第2列
rs.MoveNext() '把指標移向下一條記錄
i = i + 1 'i加1,準備把下一記錄相關欄位的值保存到工作表的下一行
Loop
'關閉記錄集,至此,
'程式將把某資料表的欄位1和欄位2保存在excel工作表sheet1的第1、2列,行數等於資料表的記錄數
rs.Close()

'下面的語句將讀取excel工作表資料,並將之簡單計算後存入資料庫,這裡使用上面程式中的一些變數
'假設分別讀取工作表sheet1第5行至第500行的第8列和第9列已存在的資料,
'然後將它們相乘, 並將積存入資料庫的某個表
strSQL = "" '清空上面定義的變數
For i = 5 To 500 '迴圈開始,i從5到500
'構造SQL命令串
strSQL = strSQL & "insert into 表名(欄位) "
strSQL = strSQL & "values(" & sht.cells(i, 8) * sht.cells(i, 9) & ") ;"
Next
'至此生成一串SQL命令串,保存的內容大概為:
'insert into 表名(欄位) values(數值1);insert into 表名(欄位) values(數值2);
'執行該SQL命令串,如果SQL命令沒有錯誤,將在資料庫中添加501個記錄;
'也可用rs.open strSQL,cn 執行
cn.execute(strSQL)
cn.close() '關閉資料庫連結,釋放資源
End Sub

沒有留言:

張貼留言