大家好,今日繼續講解《VBA數據庫解決方案》,今日講解第42講內容,把記錄集的數據,如何記入數組。這講的內容涉及到數組在數據庫中的應用,如果大家對數組還有不理解之處也可以參考拙著《工作表數組與VBA數組解決方案》,數組在EXCEL及其接口程序中的應用中有著不可替代的角色,利用好了,可以給自己的工作表處理和VBA數據處理帶來很大的方便。
今日實例:在數據庫中有如下的數據:
大家好,今日繼續講解《VBA數據庫解決方案》,今日講解第42講內容,把記錄集的數據,如何記入數組。這講的內容涉及到數組在數據庫中的應用,如果大家對數組還有不理解之處也可以參考拙著《工作表數組與VBA數組解決方案》,數組在EXCEL及其接口程序中的應用中有著不可替代的角色,利用好了,可以給自己的工作表處理和VBA數據處理帶來很大的方便。
今日實例:在數據庫中有如下的數據:
我們要打開這個數據庫,然後把內容先存到一個數組中,最後在工作表中體現出來。
下面看我給出的代碼:
Sub mynzUpdateRecords_42() '第42將 將數據記錄存入數組的方案
Dim cnADO, rsADO As Object, Fdsarr, Arr
Dim strPath, strTable, strSQL, strMsg As String
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "\\mydata2.accdb"
strTable = "員工信息"
cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath
'彙報給用戶記錄數
strSQL = "SELECT * FROM " & strTable
rsADO.Open strSQL, cnADO, 1, 3
Fdsarr = Array("員工編號", "姓名", "性別", "民族", "部門", "職務", "電話", "出生日期") '字段名
Arr = Application.Transpose(rsADO.GetRows(, 1, Fdsarr)) '記錄存入數組
For x = 1 To UBound(Arr)
Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)
Next
rsADO.Close
'釋放內存
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代碼截圖:
大家好,今日繼續講解《VBA數據庫解決方案》,今日講解第42講內容,把記錄集的數據,如何記入數組。這講的內容涉及到數組在數據庫中的應用,如果大家對數組還有不理解之處也可以參考拙著《工作表數組與VBA數組解決方案》,數組在EXCEL及其接口程序中的應用中有著不可替代的角色,利用好了,可以給自己的工作表處理和VBA數據處理帶來很大的方便。
今日實例:在數據庫中有如下的數據:
我們要打開這個數據庫,然後把內容先存到一個數組中,最後在工作表中體現出來。
下面看我給出的代碼:
Sub mynzUpdateRecords_42() '第42將 將數據記錄存入數組的方案
Dim cnADO, rsADO As Object, Fdsarr, Arr
Dim strPath, strTable, strSQL, strMsg As String
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "\\mydata2.accdb"
strTable = "員工信息"
cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath
'彙報給用戶記錄數
strSQL = "SELECT * FROM " & strTable
rsADO.Open strSQL, cnADO, 1, 3
Fdsarr = Array("員工編號", "姓名", "性別", "民族", "部門", "職務", "電話", "出生日期") '字段名
Arr = Application.Transpose(rsADO.GetRows(, 1, Fdsarr)) '記錄存入數組
For x = 1 To UBound(Arr)
Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)
Next
rsADO.Close
'釋放內存
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代碼截圖:
代碼講解:
1 Fdsarr = Array("員工編號", "姓名", "性別", "民族", "部門", "職務", "電話", "出生日期") '字段名
Arr = Application.Transpose(rsADO.GetRows(, 1, Fdsarr)) '記錄存入數組
這裡利用了一個方法:rsADO.GetRows(, 1, Fdsarr)
GetRows方法:此方法傳回一個二維的數組,每一行對應Recordset中的一筆記錄,且每一列對應到記錄中的字段。
此方法的語法如下:varArray = rs.GetRows([Rows], [Start], [Fields])
參數:
①Rows是要讀取記錄的數量;如果想要取得Recordset所有記錄,可用-1或省略此參數。
②Start 是指出第一個被讀取記錄的書籤;也可以是下列列舉常數中的一個:0-adBookmarkCurrent(目前記錄)、1-adBookmarkFirst(第一筆記錄)、或2-adBookmarkLast(最後記錄)。
③Fields 是可選擇的欄位名稱字段,其用來限制要讀取的資料量。(也可指定單一字段名稱、單一欄位索引、或者一個欄位索引陣列)。
2 For x = 1 To UBound(Arr)
Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)
Next
上面的過程中也用到了一個函數Index(Arr, x, 0),是調用工作表函數index。INDEX 返回列表或數組中的元素值,此元素由行序號和列序號的索引值給定。
INDEX 函數有兩種語法形式:數組和引用。數組形式通常返回數值或數值數組,引用形式通常返回引用。
當函數 INDEX 的第一個參數為數組常數時,使用數組形式。
語法:數組形式INDEX(array,row_num,column_num)
參數:
① Array 為單元格區域或數組常量。
② 如果數組只包含一行或一列,則相對應的參數 row_num 或 column_num 為可選。
如果數組有多行和多列,但只使用 row_num 或 column_num,函數 INDEX 返回數組中的整行或整列,且返回值也為數組。
③ Row_num 數組中某行的行序號,函數從該行返回數值。如果省略 row_num,則必須有Column_num。
④ Column_num 數組中某列的列序號,函數從該列返回數值。如果省略 column_num,則必須有 row_num。
特別說明:
①如果同時使用 row_num 和 column_num,函數 INDEX 返回 row_num 和 column_num 交叉處的單元格的數值。
②如果將 row_num 或 column_num 設置為 0,函數 INDEX 則分別返回整個列或行的數組數值。Row_num 和 column_num 必須指向 array 中的某一單元格;否則,函數 INDEX 返回錯誤值 #REF!。
例:=INDEX(A2:B3,2,2) 返回單元格區域的第二行和第二列交叉處的值
=INDEX(A2:B3,2,1) 返回單元格區域的第二行和第一列交叉處的值
下面看我們程序的運行結果:
大家好,今日繼續講解《VBA數據庫解決方案》,今日講解第42講內容,把記錄集的數據,如何記入數組。這講的內容涉及到數組在數據庫中的應用,如果大家對數組還有不理解之處也可以參考拙著《工作表數組與VBA數組解決方案》,數組在EXCEL及其接口程序中的應用中有著不可替代的角色,利用好了,可以給自己的工作表處理和VBA數據處理帶來很大的方便。
今日實例:在數據庫中有如下的數據:
我們要打開這個數據庫,然後把內容先存到一個數組中,最後在工作表中體現出來。
下面看我給出的代碼:
Sub mynzUpdateRecords_42() '第42將 將數據記錄存入數組的方案
Dim cnADO, rsADO As Object, Fdsarr, Arr
Dim strPath, strTable, strSQL, strMsg As String
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.Path & "\\mydata2.accdb"
strTable = "員工信息"
cnADO.Open "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & strPath
'彙報給用戶記錄數
strSQL = "SELECT * FROM " & strTable
rsADO.Open strSQL, cnADO, 1, 3
Fdsarr = Array("員工編號", "姓名", "性別", "民族", "部門", "職務", "電話", "出生日期") '字段名
Arr = Application.Transpose(rsADO.GetRows(, 1, Fdsarr)) '記錄存入數組
For x = 1 To UBound(Arr)
Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)
Next
rsADO.Close
'釋放內存
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代碼截圖:
代碼講解:
1 Fdsarr = Array("員工編號", "姓名", "性別", "民族", "部門", "職務", "電話", "出生日期") '字段名
Arr = Application.Transpose(rsADO.GetRows(, 1, Fdsarr)) '記錄存入數組
這裡利用了一個方法:rsADO.GetRows(, 1, Fdsarr)
GetRows方法:此方法傳回一個二維的數組,每一行對應Recordset中的一筆記錄,且每一列對應到記錄中的字段。
此方法的語法如下:varArray = rs.GetRows([Rows], [Start], [Fields])
參數:
①Rows是要讀取記錄的數量;如果想要取得Recordset所有記錄,可用-1或省略此參數。
②Start 是指出第一個被讀取記錄的書籤;也可以是下列列舉常數中的一個:0-adBookmarkCurrent(目前記錄)、1-adBookmarkFirst(第一筆記錄)、或2-adBookmarkLast(最後記錄)。
③Fields 是可選擇的欄位名稱字段,其用來限制要讀取的資料量。(也可指定單一字段名稱、單一欄位索引、或者一個欄位索引陣列)。
2 For x = 1 To UBound(Arr)
Cells(x + 1, 1).Resize(1, 8) = Application.Index(Arr, x, 0)
Next
上面的過程中也用到了一個函數Index(Arr, x, 0),是調用工作表函數index。INDEX 返回列表或數組中的元素值,此元素由行序號和列序號的索引值給定。
INDEX 函數有兩種語法形式:數組和引用。數組形式通常返回數值或數值數組,引用形式通常返回引用。
當函數 INDEX 的第一個參數為數組常數時,使用數組形式。
語法:數組形式INDEX(array,row_num,column_num)
參數:
① Array 為單元格區域或數組常量。
② 如果數組只包含一行或一列,則相對應的參數 row_num 或 column_num 為可選。
如果數組有多行和多列,但只使用 row_num 或 column_num,函數 INDEX 返回數組中的整行或整列,且返回值也為數組。
③ Row_num 數組中某行的行序號,函數從該行返回數值。如果省略 row_num,則必須有Column_num。
④ Column_num 數組中某列的列序號,函數從該列返回數值。如果省略 column_num,則必須有 row_num。
特別說明:
①如果同時使用 row_num 和 column_num,函數 INDEX 返回 row_num 和 column_num 交叉處的單元格的數值。
②如果將 row_num 或 column_num 設置為 0,函數 INDEX 則分別返回整個列或行的數組數值。Row_num 和 column_num 必須指向 array 中的某一單元格;否則,函數 INDEX 返回錯誤值 #REF!。
例:=INDEX(A2:B3,2,2) 返回單元格區域的第二行和第二列交叉處的值
=INDEX(A2:B3,2,1) 返回單元格區域的第二行和第一列交叉處的值
下面看我們程序的運行結果:
今日內容迴向:
1 如何把記錄集傳遞給數組?
2 GetRows 和 INDEX 是否理解呢?
備註:《VBA數據庫數據庫解決方案》第一冊到此講結束,明天開始第二冊內容的講解。