VBA:Excel :ADO:Access
第4話 DAOとADOの違い【連載】実務で使えるAccessのコツ - itstaffing エンジニアスタイル
配列?構造体?いやレコードセットでしょ!エクセルVBA - ぼくLog
https://sowel.co.jp/PDF_file/VB6/HowToUseRecordSet.pdf
DB Class化
プロパティ
■clsAccDB
Option Explicit Private Const sPROVIDER_ As String = "Microsoft.ACE.OLEDB.12.0" Private sDataSrc_ As String Private sTbName_ As String Private dmy_ ' // データソース Property Get pDataSrc() As String pDataSrc = sDataSrc_ End Property Property Let pDataSrc(sDataSrc As String) sDataSrc_ = sDataSrc End Property ' // テーブル名 Property Get pTbName() As String pTbName = sTbName_ End Property Property Let pTbName(sTbName As String) sTbName_ = sTbName End Property
DB作成、削除
■clsAccDB
'*************************************************** '* DB作成 '* '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Sub mthDB_Create() '参照設定:Microsoft ADO Ext.6.0 for DDL and Security Dim cat As ADOX.Catalog Dim ConStr As String On Error GoTo ErrHandler '新規作成するデータベースのパスと名前 'Access 2007以降(accdb ファイル) ConStr = "Provider=" & sPROVIDER_ & ";" _ & " Data Source=" & sDataSrc_ 'Access 2003以前(mdb ファイル) 'DBFile = ActiveWorkbook.Path & "\mydb2.mdb" 'ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDataSrc_ Set cat = New ADOX.Catalog cat.Create ConStr ErrHandler: If Err.Number <> 0 Then MsgBox Err.Number & vbCrLf & Err.Description End If Set cat = Nothing End Sub
'*************************************************** '* DB削除 '* '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Sub mthDB_Delete() Dim FSO As FileSystemObject Set FSO = New FileSystemObject FSO.DeleteFile (sDataSrc_) Set FSO = Nothing End Sub
'*************************************************** '* DB存在確認 '* '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Function mthDB_IsExists() As Boolean Dim FSO As FileSystemObject Set FSO = New FileSystemObject mthDB_IsExists = FSO.FileExists(sDataSrc_) Set FSO = Nothing End Function
■modAccDB
'*************************************************** '* CraateDB '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Sub mthDB_Create() Dim c As clsAccDB Set c = New clsAccDB c.pDataSrc = ThisWorkbook.Path & "\test.accdb" If c.mthDB_IsExists Then Call c.mthDB_Delete End If Call c.mthDB_Create End Sub
'*************************************************** '* DeleteDB '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Sub mthDB_Delete() Dim c As clsAccDB Set c = New clsAccDB c.pDataSrc = ThisWorkbook.Path & "\test.accdb" If c.mthDB_IsExists Then Call c.mthDB_Delete End If End Sub
TB 存在確認、作成、削除
TB存在確認
'*************************************************** '* [cls]TB存在確認 '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Function mthTB_IsExist() '参照設定:Microsoft ADO Ext.6.0 for DDL and Security mthTB_IsExist = False Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim ConStr As String On Error GoTo ErrHandler 'データベースのパスと名前 'Access 2007以降(accdb ファイル) ConStr = "Provider=" & sPROVIDER_ & ";" _ & " Data Source=" & sDataSrc_ 'Access 2003以前(mdb ファイル) 'DBFile = ActiveWorkbook.Path & "\mydb2.mdb" 'ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDataSrc_ 'データベース接続 Set cat = New ADOX.Catalog cat.ActiveConnection = ConStr 'テーブルの確認 For Each tbl In cat.Tables Select Case tbl.Type Case "TABLE" If tbl.Name = sTbName_ Then mthTB_IsExist = True Exit Function End If End Select Next tbl ErrHandler: If Err.Number <> 0 Then MsgBox Err.Number & vbCrLf & Err.Description End If Set cat = Nothing Set tbl = Nothing End Function
TB作成
'*************************************************** '* [cls]TB作成 '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Sub mthTB_Create( _ ByVal dic_Fld As Dictionary _ ) '参照設定:Microsoft ADO Ext.6.0 for DDL and Security Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim ConStr As String On Error GoTo ErrHandler 'データベースのパスと名前 'Access 2007以降(accdb ファイル) ConStr = "Provider=" & sPROVIDER_ & ";" _ & " Data Source=" & sDataSrc_ 'データベース接続 Set cat = New ADOX.Catalog cat.ActiveConnection = ConStr 'テーブルの作成 Set tbl = New ADOX.Table tbl.Name = sTbName_ Set tbl.ParentCatalog = cat 'フィールド(列)の設定 Dim v For Each v In dic_Fld tbl.Columns.Append v, dic_Fld(v) Next v 'テータベースへ登録 cat.Tables.Append tbl ErrHandler: If Err.Number <> 0 Then MsgBox Err.Number & vbCrLf & Err.Description End If Set cat = Nothing Set tbl = Nothing End Sub
'*************************************************** '* [mod]TB作成 '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Sub mthTB_Create() '参照設定:Microsoft ADO Ext.6.0 for DDL and Security '------------------------------------------------------------------------- Dim dic_Fld As Dictionary Set dic_Fld = New Dictionary 'フィールド(列)の設定 dic_Fld.Add "登録ID", adInteger dic_Fld.Add "氏名", adVarWChar dic_Fld.Add "生年月日", adDate dic_Fld.Add "備考", adLongVarWChar '------------------------------------------------------------------------- Dim c As clsAccDB Set c = New clsAccDB c.pDataSrc = ThisWorkbook.Path & "\test.accdb" c.pTbName = "TB_TEST" If Not c.mthTB_IsExist Then Call c.mthTB_Create(dic_Fld) End If End Sub
TB削除
'*************************************************** '* [cls]TB削除 '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Sub mthTB_Delete() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim ConStr As String On Error GoTo ErrHandler 'データベースのパスと名前 'Access 2007以降(accdb ファイル) ConStr = "Provider=" & sPROVIDER_ & ";" _ & " Data Source=" & sDataSrc_ 'データベース接続 Set cat = New ADOX.Catalog cat.ActiveConnection = ConStr 'テーブルの削除 cat.Tables.Delete sTbName_ ErrHandler: If Err.Number <> 0 Then MsgBox Err.Number & vbCrLf & Err.Description End If Set cat = Nothing Set tbl = Nothing End Sub
'*************************************************** '* [mod]TB削除 '* '* @Arg01 {} '* @Arg02 {} '* @Ret {} '* @Note '* '*************************************************** Public Sub mthTB_Delete() Dim c As clsAccDB Set c = New clsAccDB c.pDataSrc = ThisWorkbook.Path & "\test.accdb" c.pTbName = "TB_TEST" If c.mthTB_IsExist Then Call c.mthTB_Delete End If End Sub
INSERT
Dim colc_mrg As Collection Set colc_mrg = New Collection Dim colc As Collection Set colc = New Collection colc.Add (Array("登録ID", 1)) colc.Add (Array("氏名", "a")) colc.Add (Array("生年月日", "1971/1/1")) colc.Add (Array("備考", "note")) Call colc_mrg.Add(colc) Set colc = New Collection colc.Add (Array("登録ID", 2)) colc.Add (Array("氏名", "b")) colc.Add (Array("生年月日", "1971/1/2")) colc.Add (Array("備考", "note2")) Call colc_mrg.Add(colc) Call c.mthInsert(colc_mrg)
'** '* INSERT '* '* parg {} '* @arg_ref {} '* @arg_opt {} '* @ret {} '* '* @note '* Sub mthInsert(colc As Collection) '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = " & sPROVIDER_ & ";" & _ "Data Source = " & sDataSrc_ & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open sTbName_, cn, adOpenDynamic, adLockOptimistic Dim r As Long Dim c As Long For r = 1 To colc.Count rs.AddNew For c = 1 To colc.Item(r).Count ' Debug.Print colc.Item(r)(c)(0) ' Debug.Print colc.Item(r)(c)(1) rs.Fields(colc.Item(r)(c)(0)) = colc.Item(r)(c)(1) Next c rs.Update Next r '================================ ' CLOSE '================================ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
Collection(Collection((Array))
Sub dmy() ' Dim arrFld(), arrVal() ' ReDim arrFld(colc.Item(r).Count - 1) ' ReDim arrVal(colc.Item(r).Count - 1) For c = 1 To colc.Item(r).Count ' Debug.Print colc.Item(r)(c)(0) ' Debug.Print colc.Item(r)(c)(1) ' arrFld(c - 1) = colc.Item(r)(c)(0) ' arrVal(c - 1) = colc.Item(r)(c)(1) rs.Fields(colc.Item(r)(c)(0)) = colc.Item(r)(c)(1) Next c ' Dim sFld As String ' Dim sVal As String ' sFld = "([" & Join(arrFld, "],[") & "])" ' sVal = "('" & Join(arrVal, "','") & "')" ' ' 'INSERT INTO syain(id,name,romaji) VALUES (1,'鈴木','suzuki'); ' Dim sSQL As String ' sSQL = "" ' sSQL = sSQL & "INSERT INTO " & sTbName_ & sFld ' sSQL = sSQL & " VALUES" & sVal ' sSQL = sSQL & ";" End Sub
JOIN(FULL)
'** '* FULL JOIN '* '* parg {} '* @arg_ref {} '* @arg_opt {} '* @ret {} '* '* @note '* Sub mth_JoinFull() '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = " & sPROVIDER_ & ";" & _ "Data Source = " & sDataSrc_ & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset '================================ ' SQL '================================ Dim sSQL As String sSQL = "" sSQL = sSQL & "SELECT" sSQL = sSQL & " [T1.File],[T2.File],[T1.Sheet1],[T2.Sheet2],[T1.Code],[T2.Code]," sSQL = sSQL & " [T1.Data01],[T1.Data02],[T2.Data11],[T2.Data12]" sSQL = sSQL & " FROM TB_01 AS T1" sSQL = sSQL & " LEFT JOIN TB_02 AS T2" sSQL = sSQL & " ON T1.File = T2.File" sSQL = sSQL & " AND T1.Code = T2.Code" sSQL = sSQL & " Union " sSQL = sSQL & "SELECT" sSQL = sSQL & " [T1.File],[T2.File],[T1.Sheet1],[T2.Sheet2],[T1.Code],[T2.Code]," sSQL = sSQL & " [T1.Data01],[T1.Data02],[T2.Data11],[T2.Data12]" sSQL = sSQL & " FROM TB_01 AS T1" sSQL = sSQL & " RIGHT JOIN TB_02 AS T2" sSQL = sSQL & " ON T1.File = T2.File" sSQL = sSQL & " AND T1.Code = T2.Code" rs.Open sSQL, cn, adOpenStatic #If Win64 Then Dim lRecord_Cnt As LongLong ' 64ビット版のとき #Else Dim lRecord_Cnt As Long ' 32ビット版のとき #End If Dim lField_Cnt As Long lRecord_Cnt = rs.RecordCount lField_Cnt = rs.Fields.Count ThisWorkbook.Worksheets("AccDB").Cells.ClearContents ThisWorkbook.Worksheets("AccDB").Range("A1").CopyFromRecordset rs 'RecordSetをシートに貼り付け rs.MoveFirst '================================ ' RESULT '================================ #If Win64 Then Dim r As LongLong ' 64ビット版のとき #Else Dim r As Long ' 32ビット版のとき #End If Dim c As Long lRecord_Cnt = rs.RecordCount lField_Cnt = rs.Fields.Count Dim colcRecordAll As Collection Set colcRecordAll = New Collection For r = 0 To lRecord_Cnt - 1 Dim colcBuf As Collection Set colcBuf = New Collection For c = 0 To lField_Cnt - 1 Dim vDatPair() Dim sFldName As String sFldName = rs.Fields.Item(c).Name Dim sData As String If IsNull(rs.Fields(sFldName)) Then sData = "" Else sData = rs.Fields(sFldName) End If vDatPair = Array(sFldName, sData) Call colcBuf.Add(vDatPair) Next c Call colcRecordAll.Add(colcBuf) rs.MoveNext Next r '================================ ' CLOSE '================================ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
接続文字列
Const sDataSorce As String = "D:\Northwind.accdb" Const sPASS As String = "pass"
DB接続
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// DB接続 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_DB接続() Call mth_OpenDB End Sub '************************************************************************* '機能 : DB接続 '戻り値 : 'ARG1 : '説明 : '************************************************************************* Public Sub mth_OpenDB() '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Data Source = " & sDataSorce & ";" & _ "Jet OLEDB:Database Password = " & sPASS & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' CLOSE '================================ cn.Close: Set cn = Nothing End Sub
選択
SELECT [First Name],[Job Title] FROM Employees WHERE City = 'Seattle'
「Sales」を含む
SELECT [First Name],[Job Title] FROM Employees WHERE [Job Title] LIKE '%Sales%'
0文字以上:%
1文字:_
『SELECT』ByRef collect(FLD_NAME, Value)
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『SELECT』テーブルの全データをシートに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ '********************************************************* '* SELECT '* '* parg {} '* @arg_ref {} '* @arg_opt {} '* @ret {} '* '* @note '* '********************************************************* Sub mth_Select( _ ByVal sSQL As String, _ ByRef Ref_colcDatas As Collection _ ) Dim i As Long 'Ref_collection Delete For i = 1 To Ref_colcDatas.Count Ref_colcDatas.Remove 1 Next i '## 接続文字列 ##################### Dim cnstr As String cnstr = "Provider = " & sPROVIDER_ & ";" & _ "Data Source = " & sDataSrc_ & ";" '## 接続(cn) ##################### Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '## レコードセット(rs SQL,DB) ##################### Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open sSQL, cn, adOpenDynamic, adLockReadOnly '## Result ################## If rs.RecordCount < 1 Then GoTo END_PROC Do Until rs.EOF Dim colcFldDats As Collection Set colcFldDats = New Collection For i = 0 To rs.Fields.Count - 1 colcFldDats.Add Array(rs.Fields(i).Name, rs.Fields(rs.Fields(i).Name).Value) Next i Ref_colcDatas.Add colcFldDats Set colcFldDats = Nothing rs.MoveNext Loop '## CLOSE ####################################### rs.Close cn.Close END_PROC: Set rs = Nothing Set cn = Nothing End Sub
『SELECT』テーブルの全データをシートに出力
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『SELECT』テーブルの全データをシートに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_テーブルデータをシートに出力() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) ws.Cells.Clear ws.Activate Dim rngStartCell As Range Set rngStartCell = ws.Range("B2") '// 処理 Call mth_SelectAll_CopyFormRs(rngStartCell) ws.Cells.EntireColumn.AutoFit Set rngStartCell = Nothing Set ws = Nothing End Sub '************************************************************************* '機能 : 『SELECT』テーブルの全データをシートに出力 '戻り値 : 'ARG1 : '説明 : '************************************************************************* Public Sub mth_SelectAll_CopyFormRs(rngStartCell As Range) '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Data Source = " & sDataSorce & ";" & _ "Jet OLEDB:Database Password = " & sPASS & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim sSQL As String sSQL = "SELECT * FROM Employees" rs.Open sSQL, cn, adOpenStatic, adLockReadOnly '================================ ' RESULT '================================ rngStartCell.CopyFromRecordset rs '================================ ' CLOSE '================================ cn.Close: Set cn = Nothing End Sub
『SELECT』フィールド指定:データをシートに出力
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『SELECT』フィールド指定:データをシートに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_フィールド指定_データをシートに出力() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) ws.Cells.Clear ws.Activate Dim rngStartCell As Range Set rngStartCell = ws.Range("B2") '// 処理 Call mth_SelectFld_CopyFormRs(rngStartCell) ws.Cells.EntireColumn.AutoFit Set rngStartCell = Nothing Set ws = Nothing End Sub '************************************************************************* '機能 : 『SELECT』フィールド指定:データをシートに出力 '戻り値 : 'ARG1 : '説明 : '************************************************************************* Public Sub mth_SelectFld_CopyFormRs(rngStartCell As Range) '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Data Source = " & sDataSorce & ";" & _ "Jet OLEDB:Database Password = " & sPASS & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim sSQL As String sSQL = "SELECT [Last Name],[Job Title] FROM Employees" rs.Open sSQL, cn, adOpenStatic, adLockReadOnly '================================ ' RESULT '================================ rngStartCell.CopyFromRecordset rs '================================ ' CLOSE '================================ cn.Close: Set cn = Nothing End Sub
『WHERE』条件_データをシートに出力
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『WHERE』条件_データをシートに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_条件_データをシートに出力() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) ws.Cells.Clear ws.Activate Dim rngStartCell As Range Set rngStartCell = ws.Range("B2") '// 処理 Call mth_SelectWhere_CopyFormRs(rngStartCell) ws.Cells.EntireColumn.AutoFit Set rngStartCell = Nothing Set ws = Nothing End Sub '************************************************************************* '機能 : 『WHERE』条件_データをシートに出力 '戻り値 : 'ARG1 : '説明 : '************************************************************************* Public Sub mth_SelectWhere_CopyFormRs(rngStartCell As Range) '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Data Source = " & sDataSorce & ";" & _ "Jet OLEDB:Database Password = " & sPASS & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim sSQL As String sSQL = "" sSQL = sSQL & "SELECT * FROM [Order Details]" 'sSQL = sSQL & " WHERE [Quantity] >= 100" rs.Open sSQL, cn, adOpenStatic, adLockReadOnly '================================ ' RESULT '================================ rngStartCell.CopyFromRecordset rs '================================ ' CLOSE '================================ cn.Close: Set cn = Nothing End Sub
『LIKE』パタンマッチ_データをシートに出力
'■■■■■■■■■■■■■■■■■■■■■■■■■ '// 『LIKE』パタンマッチ_データをシートに出力 '// '■■■■■■■■■■■■■■■■■■■■■■■■■ Private Sub psub_パタンマッチ_データをシートに出力() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) ws.Cells.Clear ws.Activate Dim rngStartCell As Range Set rngStartCell = ws.Range("B2") '// 処理 Call mth_SelectLike_CopyFormRs(rngStartCell) ws.Cells.EntireColumn.AutoFit Set rngStartCell = Nothing Set ws = Nothing End Sub '************************************************************************* '機能 : 『LIKE』パタンマッチ_データをシートに出力 '戻り値 : 'ARG1 : '説明 : [%:0以上][_:1文字] '************************************************************************* Public Sub mth_SelectLike_CopyFormRs(rngStartCell As Range) '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Data Source = " & sDataSorce & ";" & _ "Jet OLEDB:Database Password = " & sPASS & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim sSQL As String sSQL = "" sSQL = sSQL & "SELECT [Last Name],[Job Title] FROM Employees" sSQL = sSQL & " WHERE [Job Title] Like 'Sales%'" rs.Open sSQL, cn, adOpenStatic, adLockReadOnly '================================ ' RESULT '================================ rngStartCell.CopyFromRecordset rs '================================ ' CLOSE '================================ cn.Close: Set cn = Nothing End Sub
SELECT * FROM TB
'************************************* ' SELECT * FROM TB ' '************************************* Private Sub btn_04_05_DB接続_Click() '=========================== '// 出力先 開始セル '=========================== Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("RES") Dim ws_Range As Range Set ws_Range = ws.Range("A2") '=========================== '// 実行 '=========================== Dim varrTB() As Variant varrTB = mth_0405_DB_Select(ws_Range) '=========================== '// TB 2次元配列データ '=========================== Dim lRow_Last As Long lRow_Last = ws.Cells(Rows.Count, 1).End(xlUp).Row Dim lRow As Long: lRow = UBound(varrTB, 1) - LBound(varrTB, 1) + 1 Dim lCol As Long: lCol = UBound(varrTB, 2) - LBound(varrTB, 2) + 1 ' Out 1 ws.Range("A13", Cells(lRow - 1 + 13, lCol - 1)).Value = varrTB ' Out 2 lRow_Last = ws.Cells(Rows.Count, 1).End(xlUp).Row ws.Range( _ "A" & lRow_Last + 2, _ ws.Range("A" & lRow_Last + 2).Offset(lRow - 1, lCol - 1)).Value = varrTB End Sub '************************************* ' SELECT * FROM TB ' '************************************* Function mth_0405_DB_Select(ByVal ws_Range As Range) As Variant() Dim lRecord As Long Dim lField As Long Dim varrTB() As Variant '================== ' 接続文字列 '================== Dim cnstr As String cnstr = "Provider = Microsoft.ACE.OLEDB.12.0;" & _ "Data Source = " & "D:\Northwind.accdb;" & _ "Jet OLEDB:Database Password = " & ps_PASS & ";" '================== ' 接続(cn) '================== Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = cnstr cn.Open '================================ ' レコードセット(rs SQL,DB) '================================ Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Dim sSQL As String sSQL = "SELECT * FROM Employees" rs.Open sSQL, cn, adOpenStatic, adLockReadOnly '================================ ' RESULT '================================ Dim lRecord_Cnt As Long Dim lField_Cnt As Long lRecord_Cnt = rs.RecordCount lField_Cnt = rs.Fields.Count Dim vArr2D() As Variant '---------------------------------- ' 配列格納1 '---------------------------------- ReDim vArr2D(lRecord_Cnt - 1, lField_Cnt - 1) varrTB = rs.GetRows '※配列(列,行) 一括読込み ' Dim vArr2D As Variant ' '// Transpose : 配列に Null 値を含めることはできません。 ' vArr2D = WorksheetFunction.Transpose(varrTB) Dim iRec As Long Dim iCol As Long For iRec = LBound(varrTB, 2) To UBound(varrTB, 2) For iCol = LBound(varrTB, 1) To UBound(varrTB, 1) vArr2D(iRec, iCol) = varrTB(iCol, iRec) Next Next '---------------------------------- ' 配列格納2 '---------------------------------- ReDim vArr2D(lRecord_Cnt - 1, lField_Cnt - 1) rs.MoveFirst For iRec = 0 To lRecord_Cnt - 1 For iCol = 0 To lField_Cnt - 1 vArr2D(iRec, iCol) = rs.Fields.Item(iCol).Value Next rs.MoveNext Next '---------------------------------- ' 一括セル出力 '---------------------------------- ' rs.MoveFirst ' ThisWorkbook.Sheets("RES").Range("A2").CopyFromRecordset rs rs.MoveFirst ws_Range.CopyFromRecordset rs '---------------------------------- ' フィールド名 '---------------------------------- Dim sFldName() As String ReDim sFldName(lField_Cnt - 1) rs.MoveFirst For iCol = 0 To lField_Cnt - 1 sFldName(iCol) = rs.Fields.Item(iCol).Name Next '---------------------------------- ' 指定FLD レコード 配列格納 '---------------------------------- Dim vRecDat_1() As Variant 'nullを想定 Dim vRecDat_2() As Variant ReDim vRecDat_1(lRecord_Cnt - 1) ReDim vRecDat_2(lRecord_Cnt - 1) rs.MoveFirst For iRec = 0 To lRecord_Cnt - 1 vRecDat_1(iRec) = rs.Fields("Last Name") vRecDat_2(iRec) = rs.Fields("First Name") rs.MoveNext Next '================================ ' CLOSE '================================ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ' mth_0405_DB_Select = vArr2D End Function