Accessで伝票フォームを作ろうと思っても、「どんな形に仕上げればいいのか」イメージがつかめずに手が止まってしまう。
そんな経験はありませんか。
Access VBAを使った伝票入力フォームの設計では、まず“完成形の動きを明確にする”ことが重要です。
テーブル構造やVBAの書き方よりも先に悩むのは、「どんな画面で入力すれば使いやすいのか」「どこまで自動化できるのか」という完成イメージの不明確さです。
もくじ
今回は、前後編に分けて実務の現場を意識したAccessフォームによるデータ処理とVBAプログラミングを解説します。
前編にあたる本記事では、新規伝票を追加するフォームの動きから、取引先ごとの商品リストを起動するサブフォームの仕組みまでを取り上げます。
これらを順に構築していくことで、「取引先を選ぶと商品リストが自動で切り替わる」入力フォームの完成形が明確になります。
次回(後編)では、選択した商品を伝票明細に登録し、合計金額を自動計算・保存する処理をVBAで仕上げていきます。
本記事の対象読者は、Accessの基本操作とVBAの基礎を理解しており、業務で使える入力フォームを自作したい方です。
それでは、伝票入力をスムーズにするAccessフォームの設計を、基本構成から一緒に確認していきましょう。
なお、本記事で紹介する動作を実現させるためのプログラムコードも公開しています。
サンプルデータベースは以下のリンクからダウンロードしてください。
≫ サンプルデータベース 「Input_SlipData_01」
完成イメージを確認しよう
伝票フォームを作るときに最も大切なのは、最初に「どんな動きをする画面にしたいか」を具体的にイメージすることです。
ここで完成形の流れをつかんでおくと、これからの作業がスムーズに進みます。
前半部分は以下の3つに分かれた3つの動きを意識していきましょう。
- 新規入力モードで単票フォーム起動
- コンボボックスで取引先を選択し「明細追加」ボタンをクリック
- 対象取引先の商品追加フォームを起動
新規入力モードで単票フォーム起動
サンプルデータベースのフォーム「F02発注伝票M」を開きます。

サブフォーム下にある「新規作成」ボタンをクリックします。

すると、単票フォーム「F02発注伝票T」が開きました。

コンボボックスで取引先を選択し「明細追加」ボタンをクリック
発注先を選びます。
このツールでは、発注先を選んだ後に部品を選べる仕組みに仕上げました。
つまり、発注先を選ばない限り次のステップには進めません。

発注先を選んだら「明細追加」ボタンをクリックします。
ここでは「ホームサイド」を選択しています。

対象取引先の商品追加フォームを起動
「明細追加」ボタンをクリックすると、伝票データ追加用のフォームが起動します。

このフォーム内のサブフォームデータを確認すると、単票フォームで選択した発注先のみの商品が表示されています。

今回の動作確認はここまでです。
下に掲載しているGIF動画でも、同じ動きを確認できます。

続きは次回の後半部分で解説します。
発注先コンボボックス操作後に作動するコード
コンボボックス「発注先名」を操作した直後、テキストボックス「担当者名」を取得するようにします。
フォームのデザインビューを開き、対象コンボボックスのプロパティシートを表示させましょう。

イベントタブの「更新後処理」をイベントプロシージャに設定し、「…」をクリックすれば「発注先名_AfterUpdate()」が生成されます。

イベントプロシージャには以下のように記載してください。
Private Sub 発注先名_AfterUpdate()
Me.担当者名.Value = DLookup("[担当名]", "T01発注先マスタ", "[発注先名]='" & Me.発注先名.Value & "'")
End Sub
Dlookup関数を使って担当者名を取得しています。
担当者を取得しなくでも問題ないのですが、このフォームは担当者データも伝票フォームに反映されるように作っています。
明細追加ボタンのクリック後に作動するコード
明細追加ボタンをクリックすると以下の処理を一括で行います。
- 担当者が未入力なら中断
- 該当伝票の明細が 5件以上なら中断
- 条件を満たすと、親フォーム内のサブフォームに対象取引先でフィルタした商品リストを表示
- 枝番 は既存件数+1 で採番
処理内容は多いですが、実行するためのコードは以下のとおりです。
Private Sub 明細追加_Click()
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 T02発注伝票明細 Where 発注登録No=" & Me.発注登録No & "; "
RS.open SQL, CN, adOpenKeyset, adLockOptimistic
If IsNull(Me.発注先名) = True Then
MsgBox ("発注先名が入力されていません。")
ElseIf RS.RecordCount >= 5 Then
MsgBox ("明細数が5件を超えています。" & vbCrLf & "新しい伝票を作成してください。")
Else
DoCmd.OpenForm "F01部品マスタ明細追加M", acNormal
Forms![F01部品マスタ明細追加M]![発注登録No受渡用].Value = Me.発注登録No
Forms("F01部品マスタ明細追加M").Controls("F01部品マスタ明細追加DS").Form.RecordSource = _
"Select * From Q01部品マスタ明細追加用 where 発注先名= '" & Me.発注先名.Value & "';"
'データの反映
If RS.RecordCount = False Then
Forms![F01部品マスタ明細追加M]![枝番受渡用].Value = 1
Else
Forms![F01部品マスタ明細追加M]![枝番受渡用].Value = RS.RecordCount + 1
End If
End If
'終了
RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing
End Sub
このコードでは、「担当者が入力されているか」「明細が5件を超えていないか」を確認したうえで、サブフォームに商品リストを表示し、新しい枝番を設定します。
最初に担当者名や発注先名が空欄なら、メッセージを出して処理を止めます。
こうすることで、入力漏れや誤登録を防ぐことができます。
次に、発注登録Noをもとに現在の明細件数を調べます。
ここでは ADODB.Recordset を使って COUNT(*) の結果を取得しています。
ADO(ActiveX Data Objects)はAccessの内部データベースに高速でアクセスできる方法ですが、もしADOの設定が難しい場合は、Access標準の DAO(Data Access Objects)でも同じ処理が可能です。
たとえば、DCount("*","T02発注伝票明細","発注登録No=" & Me!発注登録No) のように書き換えれば、参照設定を変更せずに同じ結果が得られます。
件数が5件以上なら警告を表示し、処理を中止します。
条件を満たしていれば、親フォーム「F01部品マスタ明細追加M」を開き、サブフォーム「F01部品マスタ明細追加DS」に発注先で絞り込んだ商品リストを表示します。
このとき、RecordSource にSQL文を直接代入して対象データを切り替えます。
最後に、既存の明細数に1を足して枝番を付け、親フォームの「枝番受渡用」コントロールに設定します。
これで、新しく追加する明細の番号が自動的に決まり、管理が楽になります。
まとめ
今回の内容では、明細追加ボタンをクリックしたときに実行される一連の処理を紹介しました。
担当者や発注先の入力を確認し、明細数が5件を超える場合には警告を出して処理を止めることで、誤登録を防ぐ仕組みを作りました。
さらに、条件を満たした場合には親フォームを開き、サブフォームに発注先で絞り込んだ商品リストを表示する方法も確認しました。
既存件数をもとに枝番を自動で設定することで、入力作業の手間を減らし、整ったデータを簡単に作成できます。
この仕組みが完成すれば、伝票フォームの操作がよりスムーズになり、実務に近いデータ登録の流れを再現できるようになります。
次回の後編では、ここで選んだ商品を伝票明細に追加し、合計金額を自動計算・保存する仕組みを仕上げていきましょう。
