トップ > スキル : アプリケーション > VBA for Access > 応用編(Accessで使える活用技)
ボタンを押して日付、数量を増減させる
日付や数量などの数字をボタンを押すたびに増減できると入力や修正の手間が省けます。プラスとマイナスのコマンドボタンを配置して、それぞれを押すごとに1ずつ増減するようにできます。
日付の増減
日付を増減させるには、DateAdd関数を使用します。
まず用意することは、プラスとマイナスのコマンドボタンをそれぞれ作成して名前と標題、自動繰り返しのプロパティを設定します。

※ 自動繰り返しのプロパティを「はい」に設定することにより、コマンドボタンを押し続けるとクリック時のイベントが繰り返し実行され、数字が連続的に増減されます。

① [プラス]コマンドボタンを作成して、[名前]プロパティに「プラス」、[標題]プロパティに「+」、[自動繰り返し]プロパティに「はい」を設定します。(※マイナスボタンも同じように作成します。)
② コマンドボタンの[クリック時]のイベントを「イベントプロシージャ」にして、ビルドボタンをクリックします。
③ 次のプロシージャを入力します。
Private Sub プラス_Click() Me!見積日 = DateAdd("d", 1, Me!見積日) Me.Repaint End Sub
④ マイナスのコマンドボタンのクリック時にも次のプロシージャを入力します。
Private Sub マイナス_Click() Me!見積日 = DateAdd("d", -1, Me!見積日) Me.Repaint End Sub
※ DateAdd関数は、日付や時刻に対して日にちや時間を増減できる関数です。
■ DateAdd関数
基準となる日付や時間を増減する値を単位として返します。
【書式】 DateAdd(単位,増減する値,基準となる日付や時間)
- 単位:間隔を決める単位で、"d"とすると日にち、"m"とすると月単位となります。
- 増減する値:増減させたい数値を指定します。
- 基準となる日付や時間:増減させたい日付や時刻を指定します。
※ RePaintメソッドを使うと、フォームが再表示される時の様子を確認できます。これは、コマンドボタンが押し続けられる間に日付の値が増減される様子を見るために利用しています。
数量の増減
数量を増減するには、数量のコントロールに1を足す、引くという処理を記述するだけです。しかし、その数量によって合計金額も帰るのであれば、フォームを更新する処理も加える必要があります。
ここでは、サブフォームの数量をプラス、マイナスのコマンドボタンで増減させると、フォームフッタの[合計金額]テキストボックスの数値を更新させていくことにします。

① [プラス]コマンドボタンを作成して、[名前]プロパティに「プラス」、[標題]プロパティに「+」、[自動繰り返し]プロパティに「はい」を設定します。(※マイナスボタンも同じように作成します。)
② コマンドボタンの[クリック時]のイベントを「イベントプロシージャ」にして、ビルドボタンをクリックします。
③ 次のプロシージャを入力します。
Private Sub プラス_Click() Me!数量 = Me!数量 + 1 Me.Repaint Me.Requery End Sub
④ マイナスのコマンドボタンのクリック時にも次のプロシージャを入力します。
Private Sub マイナス_Click() Me!数量 = Me!数量 - 1 Me.Repaint Me.Requery End Sub
※ 数値を増減させるには、現在の[数量]に1を加えて(減らして)、それを再び[数量]に代入する処理となります。
※ ただ単に数量を増減しても、下の[合計金額]の数値は変更されません。数量を増減した後に、フォームを更新する必要がありますので、Requeryメソッドを使用します。
■ Requery関数
指定したコントロールやオブジェクトの基になるクエリを再実行します。また、指定したコントロールがクエリやテーブルを基にしない場合は、そのコントロールの再計算がおこなわれます。
【書式】 recordset.Requery
動作を確認すると、プラスボタンをワンクリックすると数量が1増えて、合計金額もそれに応じて更新さえることが確認できます。


自動入力された住所データの末尾にカーソルを移動させる
住所入力支援ウィザードを使用すると、郵便番号を基に住所を自動入力することができます。しかし、郵便番号を入力後に、住所のコントロールに移動すると住所全体が選択され、末尾に番地を追加するには一旦マウスでクリックするか、F4キーを使ってカーソルを末尾に移動させる必要があります。
簡単なプロシージャで、自動入力された住所の末尾にカーソルを移動させて、続けて番地を入力できるようにできます。

① 設定する[郵便番号]テキストボックスのプロパティシートを表示させます。
② [郵便番号]の[イベント]タブを選択して、[更新処理後]プロパティをイベントプロシージャにして、ビルドボタンをクリックします。
③ 次のプロシージャを入力します。
Private Sub 郵便番号_AfterUpdate() Me!住所.SetFocus Me!住所.SelStart = Len(Me!住所) End Sub
※ テキストボックスのSelStartプロパティを使うと、入力データの先頭から指定した文字数分の位置にカーソルをセット(移動)することができます。
◆ SetStartプロパティ
現在のカーソル位置を求める、またはカーソルを任意の文字位置に移動する時に使用します。文字列は、先頭を0で数えます。
【書式】
テキストボックス名.SelStart [=文字数]
- 文字数:カーソルを置く位置を文字数で指定します。省略した場合は、カーソルが何文字目になるか、選択範囲の先頭が何文字目かを返します。
※ Len関数を用いて、指定した文字列に含まれる文字数を調べて、それをカーソルを移動させる位置に指定しています。この処理を行う時は、SetFocusメソッドを使って、あらかじめ同じコントロールにカーソルを移動しておく必要があります。
◆ SetFocusメソッド
任意のコントロールへフォーカスを移動します。但し、使用できないコントロールや非表示のコントロールでは使えません。
【書式】
コントロール名.SetFocus
動作を確認すると、郵便番号の下4桁を入力し終わると自動的に住所が表示され、タブキーで次の住所テキストボックスに移動すると、カーソルが末尾に移動していることが確認できます。


すべてのテキストボックスに値が入力されているかチェックする
フォームにあるテキストボックスすべてに入力が必要な場合に、未入力部分があるかどうかをチェックすることができます。
この場合、フォームの[更新前処理]プロパティにイベントプロシージャを作成します。また、Controlsコレクションの内容を参照することで、コントロールの値が入力されているかどうかを判定できます。

① 設定するフォームのプロパティシートを表示させます。
② [フォーム]の[イベント]タブを選択して、[更新前処理]プロパティをイベントプロシージャにして、ビルドボタンをクリックします。
③ 次のプロシージャを入力します。
Private Sub Form_BeforeUpdate(Cancel As Integer) Dim ctl As Control Dim strFld As String strFld = "" For Each ctl In Me.Controls If ctl.ControlType = acTextBox Then If IsNull(ctl) = True Then strFld = strFld & ctl.Name & " " End If End If Next If strFld <> "" Then Beep MsgBox strFld & vbCrLf & "が未入力です!", vbExclamation, "未入力チェック" Cancel = True End If End Sub
※ コントロールオブジェクト変数を「ctl」、未入力のテキストボックスを格納するための変数として「strFld」を使用します。
※ 「strFld = ""」では、変数の値を最初にクリアしています。
※ For EachからNextまでの繰り返し処理は、すべてのコントロールを1つずつ調べて行き、コントロールボックスがテキストボックスであれば、データが未入力かどうかを判定し、もし未入力があればコントロール名と入力値を連結します。
※ 「If strFld <> "" Then」は、未入力変数が空でなければという意味で、未入力の値があればメッセージボックスで未入力名を表示します。
動作を確認すると、レコードを次のレコードに進める際に未入力の箇所があれば、そのコントロールの名前が表示されて、未入力であることを表示します。
