天天看點

vba 如何控制listbox的字号_VBA資料庫解決方案第15講:利用VBA代碼對Recordset集合中的單個資料精确處理...

vba 如何控制listbox的字号_VBA資料庫解決方案第15講:利用VBA代碼對Recordset集合中的單個資料精确處理...

大家好,今天給繼續講解VBA資料庫解決方案的第15講:Recordset集合的單個資料精确處理,在前幾講中,我們講了對于Table的對象的添加和删除。今天我們要講的内容是Recordset集合的處理方案,這個處理和Table的處理是關系緊密的,在第10講中我們講了利用下面的語句實作Recordset集合内容的可視化導出:Range("A2").CopyFromRecordset rsADO,那麼是否還有其他的辦法能精确的控制導出的内容呢?

比如我隻需要其中幾個字段的記錄,該如何處理呢?這時我們需要對Recordset集合的詳細的資料處理了,也就是說要通過循環語句把每一個資料都要周遊到。

一 為了達到對Recordset集合資料的詳細處理,我們先看看記錄集的MoveFirs,MoveLast,MoveNext,MovePrevious系列的方法:

1 MoveFirst方法

作用是:将記錄指針移動到記錄集中的第一條記錄。它以第一條記錄作為目前記錄。

注意:當記錄集為空時,請求MoveFirst或MoveLast将産生一個錯誤。

2 MoveLast方法

作用是:将記錄指針移動到記錄集中的最後一條記錄。它以最後一條記錄作為目前記錄。

注意:當記錄集為空時,請求MoveFirst或MoveLast将産生一個錯誤。

注意:如果記錄集對象不支援書簽或不能向後移動指針,那麼将産生錯誤。

3 MoveNext方法

作用是:将記錄指針移動到記錄集中的下一條記錄。它以下一條記錄作為目前記錄。

注意:當目前記錄指針位于最後一條記錄時,如果你請求這個方法,将産生錯誤。

4 MovePrevious 方法

作用是:将記錄指針移動到記錄集中的上一條記錄。它以上一條記錄作為目前記錄。

注意:如果記錄集對象不支援書簽或不能向後移動指針,那麼将産生錯誤。.

注意:當目前記錄為記錄集中第一條記錄時,如果你請求該方法,那麼它将産生一個錯誤。

由此我們還要判斷記錄集是否為首位還要判斷,這時是通過般需要通過Recordset對象的EOF屬性先進行判斷遊标是否到了記錄尾。當遊标到了記錄尾時,EOF屬性會被設定為True。

同理可以通過Recordset對象的BOF屬性先進行判斷遊标是否到了記錄首。當遊标到了記錄首時,BOF屬性會被設定為True。

二 今日要講的代碼就是利用上面的方法達到精準控制記錄集導出,如下面的資料庫的資料,我們要導出部門為“一廠”的職工目錄,該如何做到呢?

vba 如何控制listbox的字号_VBA資料庫解決方案第15講:利用VBA代碼對Recordset集合中的單個資料精确處理...

代碼如下:

Sub mynzRSCT()

Dim cnADO, rsADO As Object

Dim strPath, strSQL As String

Dim i As Integer

Set cnADO = CreateObject("ADODB.Connection")

Set rsADO = CreateObject("ADODB.RecordSet")

strPath = ThisWorkbook.Path & "mydata2.accdb"

cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath

strSQL = "SELECT * FROM 員工資訊 WHERE 部門='一廠'"

rsADO.Open strSQL, cnADO, 1, 3

For i = 0 To rsADO.Fields.Count - 1

Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name

Next i

For i = 1 To rsADO.RecordCount

For j = 0 To rsADO.Fields.Count - 1

Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)

Next j

rsADO.MoveNext

Next i

rsADO.Close

cnADO.Close

Set rsADO = Nothing

Set cnADO = Nothing

End Sub

代碼截圖:

vba 如何控制listbox的字号_VBA資料庫解決方案第15講:利用VBA代碼對Recordset集合中的單個資料精确處理...

代碼解析:

1 Set cnADO = CreateObject("ADODB.Connection")

Set rsADO = CreateObject("ADODB.RecordSet")

strPath = ThisWorkbook.Path & "mydata2.accdb"

cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath

上述代碼先建立ADO 和RS 對象并打開

2 strSQL = "SELECT * FROM 員工資訊 WHERE 部門='一廠'"

rsADO.Open strSQL, cnADO, 1, 3

上述語句,建立一個SQL語句并打開

3 For i = 0 To rsADO.Fields.Count - 1

Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name

Next i

表頭計入

4 For i = 1 To rsADO.RecordCount

For j = 0 To rsADO.Fields.Count - 1

Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)

Next j

rsADO.MoveNext

Next i

資料内容計入,這個是今日内容的重點,這種方法的操作資料是一個一個計入的。對于記錄集的指針轉到下一個記錄一定要用rsADO.MoveNext 移動記錄。

5 rsADO.Close

cnADO.Close

Set rsADO = Nothing

Set cnADO = Nothing

關閉連接配接,釋放記憶體。

看下面的輸出結果:

vba 如何控制listbox的字号_VBA資料庫解決方案第15講:利用VBA代碼對Recordset集合中的單個資料精确處理...

通過記錄集的精準控制,可以完成具體到每個資料的判斷,應用是非常靈活的,

今日内容回向:

1 MoveFirs,MoveLast,MoveNext,MovePrevious 方法的意義是否了解呢?

2 如何實作記錄的精确控制?

《VBA代碼解決方案》系列電子書,是我将一些非常實用的VBA内容結內建冊,PDF格式檔案,朋友們可以從中查找到你想要解決問題的思路和方法,可以複制文中的VBA代碼直接使用。有需要的朋友微信聯絡我NZ9668。