世間一般では、Excelに比べると、Accessはあまり使用されていないようです。ただ、Accessには、Excelでは処理しきれないような大量のデータを扱うことが出来ます。また、何かと自由度が高いExcelでの構築物に比べて、プログラムの仕組みが構造化されており、属人化されづらく、改修もしやすくなります。そこで、今回からはAccessVBAについて紹介して参りたいと思います。
ADO(ActiveX Data Object)とは
ADOは、データベースを操作するための各種オブジェクトのライブラリです。同種のものにDAOというものがありますが、それと違い、ADOは、Access以外のDBを操作できるというメリットがあります。
ADOのオブジェクトは、下記の通りです。
- Connection
- Command
- Recordset
- Field
- Parameter
- Property
- Error
データベース接続
◉Connectionオブジェクト
プロパティ
- ConnectionString:接続情報を返す
- State:接続状態を返す
メソッド
- Open
- Close
- Execute
- BeginTrans
- CommitTrans
- RollbackTrans
Sub DB接続()
Dim CN As ADODB.Connection
Set CN = New ADODB.Connection
CN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" &_
= "Data Source=" & CurrentProject.Path & "¥test.accdb"
CN.Open
Select Case CN.State
Case adStateOpen
MsgBox "データベースに接続しています"
Case adStateClosed
MsgBox "データベースに接続していません"
End Select
CN.Close
Set CN = Nothing
End Sub
レコードの操作
◉Recordsetオブジェクト
プロパティ
- BOF(Beginning Of File)
- EOF(End Of File)
- RecordCount
- CursorType
- CursorType_adOpenForwadOnly
- CursorType_adOpenKeyset 他のユーザーによる追加・削除確認不可。他動的カーソルと同じ
- CursorType_adOpenDynamic 動的カーソル。他ユーザーの追加等確認可。
- CursorType_adOpenStatic 動的カーソル。他ユーザーの追加等確認不可。
- CursorLocation
- CursorLocation_adUserServer サーバー側のカーソルを利用
- CursorLocation_adUserClient クライアント側のカーソルを利用
- LockType
- LockType_adLockReadOnly
- LockType_adLockPessimistic レコード単位の排他的ロック
- LockType_adLockOptimistic レコード単位の共有的ロック
- LockType_adLockBatchOptimistic 共有的バッチ更新
- LockType_adLockUnspecified ロックタイプ指定しない
- Bookmark レコードを識別するためのブックマーク
メソッド
- Open
- Close
- Move/MoveFirst/MoveLast/MoveNext/MovePrevious
- Find
- Clone
- AddNew
- Update
- Delete
Sub レコードセット()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = CN.Execute("T名簿")
Do Until RS.EOF
Debug.Print RS.Fields(0),RS.Fields(1),RS.Fields(2)
RS.MoveNext
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
Sub レコードセット2()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T名簿", CN , adOpenStatic
RS.MoveLast
Do Until RS.EOF
Debug.Print RS.Fields(0),RS.Fields(1),RS.Fields(2)
RS.MoveNext
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードの更新
Sub レコード更新()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
SQL = "SELECT * FROM T名簿 WHERE 社員番号 = 9999;"
RS.Open SQL, CN, adOpenKeyset, adLockOptimistic
RS.Update "給与", "10000"
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
Sub レコード更新2()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T名簿", CN, adOpenKeyset, adLockOptimistic
Do Until RS.EOF
RS("指数") = RS("指数") + 1
RS.Update
RS.MoveNext
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードの追加
Sub レコードの追加()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim FieldList As Variant
Dim ValueList As Variant
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T部門マスタ", CN, adOpenKeyset, adLockOptimistic
FieldList = Array("部門コード","部門名")
ValueList = Array("999","その他")
RS.AddNew FieldList, ValueList
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
Sub レコードの追加2()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T部門マスタ", CN, adOpenKeyset, adLockOptimistic
RS.AddNew
RS("部門コード") = "999"
RS("部門名") = "その他"
RS.Update
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードの削除
Sub レコードの削除()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
SQL = "SELECT * FROM T名簿 WHERE 社員番号 = 9999;"
RS.Open SQL, CN, adOpenKeyset, adLockOptimistic
RS.Delete
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
Sub レコードの削除2()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T名簿", CN, adOpenKeyset, adLockOptimistic
Do Until RS.EOF
RS.Delete
RS.MoveNext
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードの検索
Sub レコードの検索()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T名簿", CN, adOpenKeyset, adLockOptimistic
Do
RS.Find "所属" = "総務部"
If Not RS.EOF Then
Debug.Print RS("社員番号"),RS("氏名")
RS.Move.Next
Else
Exit Do
End If
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードの並べ替え
Sub レコードの並べ替え()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.CursorLocation = adUseClient
RS.Open "T名簿", CN
RS.Sort = "所属 ASC, 番号 DESC"
Do Until RS.EOF
Debug.Print RS("氏名"),RS("所属"),RS("番号")
RS.Move.Next
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードの抽出
Sub レコードの抽出()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "T名簿", CN
RS.Filter = "番号 = 100 Or 番号 = 101"
Do Until RS.EOF
Debug.Print RS("番号"),RS("氏名")
RS.Move.Next
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉レコードセットを利用
Sub レコードセットを利用()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.CursorLocation = adUseClient
RS.Open "T名簿", CN
Set Me.lst1.Recordset = RS
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
Private Sub btnClick()
Set Me.lsta1.Recordset = Nothing
Me.list1.Requery
End Sub
Private Sub btnClick2()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
CN.CursorLocation = adUseClient
Set RS = CN.Execute("名簿")
Set Me.lst1.Recordset = RS
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
トランザクション
Sub トランザクション()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "名簿",CN,adOpenKeyset,adLockOptimistic
On Error GoTo ErrExit
CN.BeginTrans
Do Until RS.EOF
If RS("名簿") = 100 Then
RS("番号") = RS("番号") & "2"
Else
RS("番号") = RS("番号") + 1
End If
RS.Update
RS.MoveNext
Loop
CN.CommitTrans
MsgBox "トランザクション確定"
Exit Sub
ErrExit:
CN.RollbackTrans
MsgBox "トランザクション取消"
End Sub
外部データベース利用
◉CSV接続
Sub CSV接続()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim MyPath As String
MyPath = CurrentProject.Path & "¥"
Set CN = New ADODB.Connection
CN.Open "Provider=Microsoft.Jet.OLEDB.4.0:" &_
"Data Source=" & MyPath & ";" &_
"Extended Properties='Text;HDR=NO'"
Set RS = CN.Execute("SELECT * FROM CSV.csv")
Do Until RS.EOF
Debug.Print RS.Fields(0),RS.Fields(1),RS.Fields(2)
RS.Move.Next
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
◉EXCEL接続
Sub EXCEL接続()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim MyPath As String
MyPath = CurrentProject.Path & "¥"
Set CN = New ADODB.Connection
CN.Open "Provider=Microsoft.ACE.OLEDB.12.0:" &_
"Data Source=" & MyPath & "EXCEL.xlsx;" &_
"Extended Properties='Excel 12.0;HDR=YES'"
Set RS = CN.Execute("SELECT * FROM [Sheet1$]")
Do Until RS.EOF
Debug.Print RS.("番号"),RS.("商品名"),RS.("値段")
RS.Move.Next
Loop
RS.Close: CN.Close
Set RS = Nothing: Set CN = Nothing
End Sub
例外処理
Sub 例外処理()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim MyError As ADODB.Error
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
RS.Open "名簿",CN,adOpenKeyset,adLockOptimistic
On Error GoTo ErrExit
RS.AddNew
RS("番号") = "100"
RS("商品") = "A"
RS("金額") = "1000"
RS.Update
Exit Sub
ErrExit:
For Each MyErr In CN.Errors
MsgBox "発生エラーは次の通り" & vbCrLf &_
MyError.Number & vbCrLf &_
MyError.Source & vbCrLf &_
MyError.Description
Next
End Sub
以上、本日は、ADOについてポイントと代表的なコードをまとめました。最後までお読み頂き、ありがとうございました。
コメント