「プロジェクト」内の「UserForm1」を選択し、マウスの右クリックで表示されるメニューから「コード」の表示を選択する。コードエディター画面が表示されるので、まずは、フォームがアクティブになったときの処理を記述する。フォームがアクティブになったときのプロシージャを作成するには、図9の手順に従う。
これに、リスト3のコードを記述する。
Private Sub UserForm_Activate() Dim myCon As New ADODB.Connection Dim myRecordSet As New ADODB.Recordset Dim mySQL As String Dim dbFile As Variant dbFile = "K:\Access_Excel VBA Tips\商品管理データベース.accdb" myCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & dbFile & "" myCon.Open mySQL = "SELECT 商品NO FROM 商品管理テーブル" myRecordSet.Open mySQL, myCon, adOpenDynamic Do Until myRecordSet.EOF 商品NOリストボックス.AddItem (myRecordSet!商品NO) myRecordSet.MoveNext Loop myRecordSet.Close Set myRecordSet = Nothing myCon.Close Set myCon = Nothing End Sub
処理の詳細については、リスト1やリスト2の説明通りなので、省略する。これで、フォームがアクティブになったときに「リストボックス」内に「商品NO」の一覧が表示される。
次に、図9の方法で、「削除ボタン」がクリックされたときのプロシージャを作成し、リスト4のコードを記述する。
Private Sub 削除ボタン_Click() Dim myCon As New ADODB.Connection Dim myRecordSet As New ADODB.Recordset Dim dbFile As Variant dbFile = "K:\Access_Excel VBA Tips\商品管理データベース.accdb" myCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & dbFile & "" myCon.Open myRecordSet.Open Source:="商品管理テーブル", ActiveConnection:=myCon, CursorType:=adOpenKeyset, LockType:=adLockOptimistic With myRecordSet .Find Criteria:="商品NO='" &商品NOリストボックス.Text & "'" If .EOF = True Then MsgBox ("該当レコードはありません。") Exit Sub End If .Delete End With MsgBox (商品NOリストボックス.Text & "のレコードを削除しました。") myRecordSet.Close Set myRecordSet = Nothing myCon.Close Set myCon = Nothing ListBox1.Clear Call UserForm_Activate End Sub
最初の方は、リスト1とほとんど同じなので、解説は省略する。以下、コードについては、リスト1〜3と異なる部分のみ解説する。
指定した条件と一致するレコードを検索するには、下記の書式を使用する。
Recordset.Find Criteria:={検索条件}
{検索条件}には今回は、「商品NO」が「商品NOリストボックス」から選択された値に合致するレコードを指定している(13行目)。
レコードの最後まで検索して、合致する条件のレコードがなかった場合は、警告メッセージを表示して処理を抜ける。該当するレコードがあった場合は、Deleteメソッドで削除し、削除した旨のメッセージを表示する(18行目)。
「商品NOリストボックス」内を一度クリアし(28行目)、再度削除された「商品管理テーブル」から「商品NO」を読み込むために、UserForm1_Activateプロシージャを再実行する(29行目)。
このUserForm1を開くためのコードを記述する。このコードはModule内に記述する必要がある。プロジェクトからModule1を選択して、リスト5のコードを記述する。
Sub レコード削除フォーム() UserForm1.Show End Sub
図5の「商品NO読み込みフォーム」ボタンに、リスト5の「レコード削除フォーム」を関連付けて実行してみよう。図10のようになる。
今回はこれで終わりだ。Excelのシート上にAccessの商品管理テーブルのデータを読み込み、Excel上で編集して、再度Accessに書き戻す。わざわざ、Accessを起動することなく、Excelだけで、ExcelとAccessのデータが操作できるのは、実際の業務において大変に便利だと思う。
また、Excelでフォームを使用すると、シート上で「商品管理テーブル」を処理するよりも、もっと容易に、柔軟性を持ってデータの処理が実現できるのも便利ではないだろうか。
今まで解説してきたTipsを組み合わせると、十分に日常の業務で利用できるAccess+Excelのシステムが作成できるのではないだろうか。これらのサンプルを各自がアレンジして、ぜひ日常の業務で利用していただきたい。
次回からは、WordとExcelを連携するVBAテクニックを解説するので、お楽しみに。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms - Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.