演習36 「ADO」 の解説 その3
演習35 と同様、ADO を使用するために、最初に Excel VBA の VBエディタ に
おいて、次の設定を行う。 ここのコードによるファイル kakcho14.xls では、
どの PC 上でも動作するように、ADO のバージョン 2.1 を設定してある。
各モジュールに、以下のプロシージャを記述し実行すると、Excel のフォーム
モジュールから Access のテーブル上のデータを検索し、それを編集加工して
Excel のシート上に転記することができる。
VBE - ツール - 参照設定 -
(レ)Microsoft ActiveX Data Objects 2.1 Library
Access の既存のデータベースファイル名を 'acctest4.mdb' とし、その中に
次の二つのテーブルの '氏名テーブル, 住所テーブル' を事前に作成してある
ものとしている。 二つのファイル 'kakcho14.xls' と 'acctest4.mdb' は、
同じフォルダに置くこと。

'-------- [ThisWorkbook] ---------
Private Sub Workbook_Open()
UserForm1.Show False
End Sub
'---------- [UserForm1] ----------
Dim Dbs As New ADODB.Connection 'ADOコネクション
Dim Rcsa As New ADODB.Recordset 'ADOレコードセット1
Dim Rcsb As New ADODB.Recordset 'ADOレコードセット2
Dim RcQ As New ADODB.Recordset 'SQLレコードセット
Dim Rcd As Integer 'エクセルのレコード表示行
Dim mydbF As String 'アクセス ファイル
Private Sub UserForm_Initialize()
'例として acctest4.mdb の テーブル から読み込む
mydbF = "acctest4.mdb" 'アクセス ファイル
'アクセスデータベース接続設定
Dbs.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & _
"\" & mydbF & ";"
'アクセスデータベース接続
Dbs.Open
'住所コンボボックスを SQL文で設定
'(行末の半角スペースに注意)
Rcsb.Open _
"Select 住所コード,住所 " & _
"From 住所テーブル " & _
"Order by 住所コード asc;", Dbs
Do Until Rcsb.EOF
ComboBox2.AddItem _
Rcsb!住所コード & " " & _
Rcsb!住所
Rcsb.MoveNext
Loop
ComboBox2.ListIndex = -1 '初期設定
'所属コンボボックスを SQL文で設定
Rcsa.Open _
"Select 所属 " & _
"From 氏名テーブル;", Dbs
Do Until Rcsa.EOF
ComboBox3.AddItem _
Rcsa!所属
Rcsa.MoveNext
Loop
ComboBox3.ListIndex = -1 '初期設定
'合計コンボボックスの以上未満の設定
With ComboBox4
.AddItem "以上"
.AddItem "未満"
.ListIndex = -1 '初期設定
End With
'表示順序コンボボックスの設定
With ComboBox5
.AddItem "番号の昇順"
.AddItem "番号の降順"
.AddItem "住所の昇順"
.AddItem "住所の降順"
.AddItem "合計の昇順"
.AddItem "合計の降順"
.ListIndex = 0 '初期設定
End With
'検索条件を すべて に初期設定
OptionButton1.Value = True
CheckBox1.Enabled = False
CheckBox2.Enabled = False
CheckBox3.Enabled = False
CheckBox4.Enabled = False
End Sub
'---------------------------------
Private Sub UserForm_QueryClose _
(Cancel As Integer, CloseMode As Integer)
'終了
Rcsa.Close
Rcsb.Close
Dbs.Close
Set Rcsa = Nothing
Set Rcsb = Nothing
Set Dbs = Nothing
End Sub
'---------------------------------
Private Sub OptionButton1_Click()
'すべてを選択なら チェックボックス無効
If OptionButton1 = True Then
CheckBox1.Enabled = False
CheckBox2.Enabled = False
CheckBox3.Enabled = False
CheckBox4.Enabled = False
End If
End Sub
'---------------------------------
Private Sub OptionButton2_Click()
'条件付きを選択なら チェックボックス有効
If OptionButton2 = True Then
CheckBox1.Enabled = True
CheckBox2.Enabled = True
CheckBox3.Enabled = True
CheckBox4.Enabled = True
End If
End Sub
'---------------------------------
Private Sub CommandButton1_Click()
'指定した条件を SQL文で設定
Dim slc As String 'Selection句
Dim frm As String 'From句
Dim whr As String 'Where句
Dim ord As String 'Order by句
'SQL変数の初期設定
slc = "Select 番号,氏名,住所,所属,合計 "
frm = "From 氏名テーブル S, 住所テーブル T "
whr = "Where S.住所コード = T.住所コード"
ord = ";"
'条件付きを選択の時
If OptionButton2 = True Then
'氏名の選択条件
If CheckBox1 = True Then
If Len(TextBox1.Text) = 0 Then
Beep
MsgBox "検索文字を入力せよ."
Exit Sub
End If
whr = whr & " and 氏名 like '%" _
& TextBox1.Text & "%'"
End If
'住所の選択条件
If CheckBox2 = True Then
If ComboBox2.Value = "" Then
Beep
MsgBox "住所を選択せよ."
Exit Sub
End If
whr = whr & " and T.住所コード = " _
& Left(ComboBox2.Value, 2)
End If
'所属の選択条件( "'" に注意)
If CheckBox3 = True Then
If ComboBox3.Value = "" Then
Beep
MsgBox "所属を選択せよ."
Exit Sub
End If
whr = whr & " and 所属 = " & _
"'" & ComboBox3.Value & "'"
End If
'合計の選択条件
If CheckBox4 = True Then
If ComboBox4.Value = "" Then
Beep
MsgBox "合計を入力せよ."
Exit Sub
End If
Select Case ComboBox4.ListIndex
Case 0
whr = whr & " and 合計 >= "
Case 1
whr = whr & " and 合計 < "
End Select
'点数設定
whr = whr & TextBox4.Value
End If
End If
'表示順序の指定
If CheckBox5 = True Then
Select Case ComboBox5.ListIndex
Case 0
ord = " Order by 番号 asc;"
Case 1
ord = " Order by 番号 desc;"
Case 2
ord = " Order by T.住所コード asc;"
Case 3
ord = " Order by T.住所コード desc;"
Case 4
ord = " Order by 合計 asc;"
Case 5
ord = " Order by 合計 desc;"
End Select
Else
ord = " Order by 番号 asc;"
End If
'検索を実行しエクセルシートに転記
'SQLを実行
RcQ.Open slc & frm & whr & ord, Dbs
'セルのクリア
Cells.Clear
'エクセル1行目にヘッダーを表示
Cells(1, 1) = "番号"
Cells(1, 2) = "氏名"
Cells(1, 3) = "住所"
Cells(1, 4) = "所属"
Cells(1, 5) = "合計"
'検索結果をシートに転記
Rcd = 2 'エクセルのレコード表示行
Do Until RcQ.EOF
Cells(Rcd, 1) = RcQ!番号
Cells(Rcd, 2) = RcQ!氏名
Cells(Rcd, 3) = RcQ!住所
Cells(Rcd, 4) = RcQ!所属
Cells(Rcd, 5) = RcQ!合計
Rcd = Rcd + 1
RcQ.MoveNext
Loop
Worksheets(1).Columns("A:E").AutoFit
'RcQレコードセットを閉じる
RcQ.Close
End Sub
'---------------------------------
Private Sub CommandButton2_Click()
'セルとボックス内のクリア
Cells.Clear
TextBox1.Text = ""
TextBox4.Text = ""
ComboBox2.ListIndex = -1
ComboBox3.ListIndex = -1
ComboBox4.ListIndex = -1
ComboBox5.ListIndex = 0
OptionButton1.Value = True
CheckBox1.Enabled = False
CheckBox2.Enabled = False
CheckBox3.Enabled = False
CheckBox4.Enabled = False
End Sub
'---------------------------------
Private Sub CommandButton3_Click()
'終了
Unload Me
End Sub
'---------------------------------
ADO その2 へ戻る. back top