トップ > スキル : アプリケーション > VBA for Access > 応用編(Accessで使える活用技)
オリジナルのレコード移動ボタンを作成する
単票形式のフォームでは、レコードを移動して表示したい時下側の移動ボタンをクリックしますが、Accessの移動ボタンは小さく、扱いづらい点もあります。
これらレコード移動ボタンをオリジナルで作成して、現在のレコードの順番も表示することができます。
まず、フッタ領域に4つのコマンドボタンを作成して、それぞれ、「先頭へ」「前へ」「次へ」「末尾へ」という標題にします。また、真中にテキストボックスを作成して、現在のレコード番号と全体のレコード数を表示できるように配置します。
4つのコマンドボタンの[名前]プロパティは、[標題]プロパティと同じものにします。テキストボックスの[名前]プロパティには「件数」と設定します。その[件数]テキストボックスの[編集ロック]プロパティは「はい」を設定し、直接書き込みができないようにします。

まず、フォームを開いた時にレコード数を表示するためのプロシージャを作成します。
① フォームの[イベント]タブの[開く時]プロパティを「イベントプロシージャ」にして、ビルドボタンをクリックします。
② 次のプロシージャを入力します。
Private Sub Form_Open(Cancel As Integer) Me.Recordset.MoveLast Me.Recordset.MoveFirst End Sub
※ 開く時に、レコード総件数を取得するために、MoveLastメソッドで一旦末尾レコードまで移動して、件数を取得します。その後、レコードを先頭に戻します。
※ フォームを開いた時にMoveLastを実行して末尾レコードに移動するとレコードセットのレコード件数(Me.Recordset.RecordCount)が記録されます。
次にレコード移動時にカレントレコード番号と総レコード数を表示させるプロシージャを作成します。
③ フォームの[イベント]タブの[レコード移動時]プロパティを「イベントプロシージャ」にして、ビルドボタンをクリックします。
④ 次のプロシージャを入力します。
Private Sub Form_Current() Me!件数 = Me.CurrentRecord & "/" & Me.Recordset.RecordCount End Sub
※ 他の処理がすでに記述されていれば、最後の方に追加します。
※ 現在のレコード番号(Me.CurrentRecord)と総レコード件数(Me.Recordset.RecordCount)を「/」で区切って表示します。
動作を確認すると、テキストボックスに総レコード数と現在のレコード番号が表示されます。

次にコマンドボタンをクリックするとレコードが移動するプロシージャを作成します。
⑤ フォーム上に作成した4つのコマンドボタン(先頭へ、前へ、次へ、末尾へ)の[クリック時]プロパティに次のプロシージャを作成します。
[先頭へ]コマンドボタンのクリック時
Private Sub 先頭へ_Click() DoCmd.GoToRecord , , acFirst End Sub
[前へ]コマンドボタンのクリック時
Private Sub 前へ_Click() If Me.CurrentRecord = 1 Then MsgBox "このレコードが先頭です。" Else DoCmd.GoToRecord , , acPrevious End If End Sub
[次へ]コマンドボタンのクリック時
Private Sub 次へ_Click() If Me.CurrentRecord = Me.Recordset.RecordCount Then MsgBox "このレコードが末尾です。" Else DoCmd.GoToRecord , , acNext End If End Sub
[末尾へ]コマンドボタンのクリック時
Private Sub 末尾へ_Click() DoCmd.GoToRecord , , acLast End Sub
※ GoToRecordメソッドを使うことでオリジナルのレコード移動ボタンが作成できます。
◆ GoToRecordメソッド
DoCmdオブジェクトと一緒に使用し、フォームよりレコードを操作します。
【書式】
DoCmd.GoToRecord [,オブジェクトの種類][,オブジェクト名][,移動の種類][,移動量]
- オブジェクトの種類:対象となるオブジェクトを指定します。省略したらアクティブオブジェクト(現在使用中のオブジェクト)となります。フォームであればacDataForm、クエリであればacDataQueryとなる。
- オブジェクト名:対象となるオブジェクトの名前を指定します。省略したら現在使用中のオブジェクトになります。
- 移動の種類:レコードの移動の方向を指定します。次のレコードであればacNext、前のレコードであればacPrebious、先頭であればacFirstとなる。新規レコードであれば、acNewRecを指定します。
- 移動量:現在のレコードからの移動する量を指定します。
※ 先頭のレコードがカレントレコードの場合、「前へ」ボタンを押してしまうとエラーが発生します。これは、末尾のレコードがカレントレコードの時「次へ」ボタンを押しても同じ現象が出ます。これらを回避するために、先頭レコードまたは末尾のレコードかを判定して、それ以上のレコードがない場合にメッセージを表示させています。メッセージは表示しませんが、If文の代わりに「On Error Resume Next」をDoCmd.GoToRecordの上に記述する方法もエラーを回避できます。
フォームのカレントレコードを削除する
フォームに削除ボタンを作成して、それをクリックするとカレントレコードを削除することができます。カレントレコードを選択して削除するにはRunCommandメソッドを利用し、削除後には削除処理の結果を表示させるメッセージを表示させます。
用意としては、フッタに[削除]コマンドボタンを作成して配置しておきます。

① フッタの[削除]コマンドボタンのプロパティシートを表示させます。
② コマンドボタンの[イベント]タブの[クリック時]プロパティを「イベントプロシージャ」にして、ビルドボタンをクリックします。
③ 次のプロシージャを入力します。
Private Sub 削除_Click() On Error GoTo Click_Err If Me.NewRecord = True Then MsgBox "新規レコードは削除できません" Else DoCmd.RunCommand acCmdSelectRecord 'A DoCmd.RunCommand acCmdDeleteRecord 'B End If Click_Exit: Exit Sub Click_Err: If Err.Number = 2501 Then Resume Click_Exit End If End Sub
※ エラートラップを作成します。削除ボタンを押すと削除確認のダイアログボックスが表示されます。

「いいえ」を押して削除をキャンセルするとエラーが発生します。この時のエラーコードが「2501」です。よって、「いいえ」ボタンを押してもエラーが発生しないように、エラーコードが「2501」の場合は削除を中止させる処理を記述します。
※ 記述の中のA行の処理はカレントレコードを選択する処理で、B行の処理はカレントレコードを削除する処理になります。
次に削除後の処理のプロシージャを作成します。

④ フォームのプロパティシートを表示します。
⑤ フォームの[イベント]タブの[削除後確認]プロパティを「イベントプロシージャ」にして、ビルドボタンをクリックします。
⑥ 次のプロシージャを作成します。
Private Sub Form_AfterDelConfirm(Status As Integer) Select Case Status Case acDeleteOK MsgBox "選択したレコードを削除しました。" Case acDeleteUserCancel MsgBox "削除処理はキャンセルされました" End Select End Sub
※ レコードが本当に削除されたかを調べるには[削除後確認]イベントを使用します。このイベントでは、引数「Status」の値を調べることで、削除処理の結果を調べられます。
定数 | 説明 |
acDeleteOK | レコードが正常に削除されたことを示す |
acDeleteCancel | レコードの削除がVBコードによってキャンセルされたことを示す |
acDeleteUserCancel | レコードの削除がユーザによってキャンセルされたことを示す |
動作を確認します。任意のレコードを選択してカレントレコードにします。[削除]ボタンをクリックすると、削除のダイアログボックスが表示されます。
[はい]をクリックすると、削除されたメッセージが表示されます。


[いいえ]をクリックすると、キャンセルされたメッセージが表示されます。

条件に一致したレコードをフォームに抽出する
表形式のような一覧のフォームのレコードを抽出することができます。抽出条件を入力、または指定して[検索]ボタンをクリックすると。その条件に一致したレコードのみが抽出します。また、すべてのレコードを表示するための[解除]ボタンも作成します。

ヘッダ領域に抽出条件を指定するコンボボックスを作成します。そして、[検索]ボタンと[解除]ボタンを2つ作成して、それぞれ[名前]と[標題]プロパティに同じ名称を設定します。コンボボックスはの[名前]プロパティには「抽出担当者」と設定します。
※ 非連結のコンボボックスでは、一覧表示するものはテーブルの社員情報マスターの「氏名」を[値集合ソース]に指定します。

① フォームヘッダの[検索]コマンドボタンのプロパティシートを表示させます。
② コマンドボタンの[イベント]タブの[クリック時]プロパティを「イベントプロシージャ」にして、ビルドボタンをクリックします。
③ 次のプロシージャを入力します。
Private Sub 検索_Click() If IsNull(Me!抽出担当者) = True Then Beep MsgBox "抽出する担当者を指定していください。", _ vbOKOnly + vbInformation, "抽出担当者チェック" Me!抽出担当者.SetFocus Exit Sub End If Me.Filter = "氏名='" & Me!抽出担当者 & "'" Me.FilterOn = True If Me.Recordset.RecordCount = 0 Then Beep MsgBox "抽出担当者と一致するレコードがありませんでした。", _ vbOKOnly + vbInformation, "レコードなし" Me!抽出担当者.SetFocus End If End Sub
※ [抽出担当者]コンボボックスに何も表示されていなくて[検索]ボタンをクリックした場合は、担当者を指定する旨のメッセージを表示させます。
※ [抽出担当者]コンボボックスの指定された氏名と[詳細]セクションの[氏名]でフィルタの実行を行います。
※ もし、1件もレコードがない場合は、レコードがなかった旨のメッセージを表示させます。
次にフィルタの実行を解除するプロシージャを作成します。
④ フォームヘッダの[解除]コマンドボタンのプロパティシートを表示させます。
⑤ コマンドボタンの[イベント]タブの[クリック時]プロパティを「イベントプロシージャ」にして、ビルドボタンをクリックします。
⑥ 次のプロシージャを作成します。
Private Sub 解除_Click() Me.FilterOn = False End Sub
※ FilteOnプロパティをFalseにすることでフィルタは解除されます。
動作を確認します。
担当者のコンボボックスの一覧を表示させて、任意の名前を選択します。

[検索]ボタンをクリックすると、条件の名前と一致したレコードが表示されます。

[解除]ボタンをクリックすると、すべてのレコードが表示されます。
