前編では、伝票明細にデータを追加するための追加用フォームを起動させたところまでを解説しました。
今回の後編は、前編の続きとして、選択したデータを伝票に反映させるVBAコードを解説します。
今回も実務で使っているコードをそのまま掲載しました。
実務で使えるようにするためにも、多少コードが複雑にはなってしまいます。
しかしながら、実務でUPDATEやINSERTなどのアクションクエリを動かす大事なところで、使い慣れるとAccessを使ったいろんないろんなデータ加工が可能になります。
かなり深く踏み込まないと習得できない内容ですが、ぜひ挑戦していただきたいです。
完成品の動作
明細追加用のフォーム「F01部品マスタ明細追加DS」が開いています。
サブフォームに表示されている特定の部品を選択し、「明細追加」ボタンをクリックします。
個数を入力するダイアログが起動するので、個数を入力しOKをクリックします。
伝票明細にデータが追記されました。
同じように別の部品を登録します。
数量を修正した後に「総計算出」ボタンをクリックすると「合計金額」が再計算されます。
伝票フォームを閉じて発注履歴を確認すると、新しく追加した伝票データが反映されているのが確認できました。
追加ボタンをクリックした後に作動するコード
明細追加ボタンのクリック後に作動するコードです。
Private Sub 明細追加_Click()
Dim stSQL As String
Dim SUBId As Long '部品登録ID
Dim SUBNm As String '品名
Dim SUBTp As String '型式
Dim SUBPc As Long '単価
Dim SUBCnt As Integer '個数
Dim SUBIpt As Variant 'INPUTBOX
Dim MAINTm As Long '発注金額
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String
'伝票明細テーブルに追記する型式などを選定
SUBId = Me.F01部品マスタ明細追加DS!部品登録ID.Value
SUBNm = Me.F01部品マスタ明細追加DS!品名.Value
SUBPc = Me.F01部品マスタ明細追加DS!価格.Value
Select Case Me.F01部品マスタ明細追加DS!伝票表示.Value
Case "型式"
SUBTp = Me.F01部品マスタ明細追加DS!型式.Value
Case "規格"
SUBTp = Me.F01部品マスタ明細追加DS!規格.Value
Case "サイズ"
SUBTp = Me.F01部品マスタ明細追加DS!サイズ.Value
End Select
'個数入力用InputBoxの起動
SUBIpt = InputBox(Prompt:="何個購入しますか?", Title:="個数の入力", Default:=1)
If SUBIpt = "" Or IsNumeric(SUBIpt) = False Then
Exit Sub
End If
DoCmd.SetWarnings False
'明細テーブルへのデータ追加
stSQL = "INSERT INTO T02発注伝票明細 (発注登録No,枝番,部品登録ID,品名,規格,単価,数量,大分類名,中分類名,小分類名)" & _
" VALUES (" & Me.発注登録No受渡用.Value & "," & Me.枝番受渡用.Value & "," & SUBId & ",'" & SUBNm & "','" & SUBTp & "'," & _
SUBPc & "," & CInt(SUBIpt) & ",'" & Me.F01部品マスタ明細追加DS!大分類名.Value & "','" & Me.F01部品マスタ明細追加DS!中分類名.Value & _
"','" & Me.F01部品マスタ明細追加DS!小分類名.Value & "');"
DoCmd.RunSQL stSQL
'ADO接続で合計金額を計算
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
SQL = "SELECT Sum(金額) AS 金額計 FROM Q02発注伝票明細表示用 GROUP BY 発注登録No HAVING 発注登録No=" & Me.発注登録No受渡用.Value & ";"
RS.open SQL, CN, adOpenKeyset, adLockOptimistic
'合計金額を変数に入れる
MAINTm = RS!金額計
RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing
'伝票テーブルの総金額と件数を更新
stSQL = "UPDATE T02発注伝票 SET 発注金額 =" & MAINTm & ", 明細件数 =" & Me.枝番受渡用.Value & " WHERE 発注登録No = " & Me.発注登録No受渡用.Value & ";"
DoCmd.RunSQL stSQL
'伝票フォームへのデータ反映と追加フォームを閉じる処理
DoCmd.Close acForm, "F02発注伝票T"
DoCmd.OpenForm "F02発注伝票T", acNormal, , "発注登録No=" & Me.発注登録No受渡用.Value, acFormEdit
DoCmd.Close acForm, Me.Name
DoCmd.SetWarnings True
End Sub
行数が長めややこしいですが、デバッグ機能をフル活用してどんな動きをしているか見ていけば把握できるでしょう。
念のため、プログラムコードの大まかな流れを下にまとめておきます。
- 伝票明細に反映する規格の反映(16~27行目)
- 個数を入力するInputBoxの起動(29~30行目)
- 明細テーブルへのデータ追加(36~41行目)
- 伝票テーブルの合計金額と明細件数を更新(42~53行目)
- 伝票フォームへのデータ反映と追加フォームを閉じる処理(54~57行目)
ADO接続のSQL文を使って合計金額を取得しています。
Access VBA開発をする人は、DAOやADOを使った集計もぜひマスターしておきたいですね。
計算ボタンをクリックした後に作動するコード
計算ボタンをクリックした後に作動するコードです。
Private Sub 総計算出_Click()
Dim CN As ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String
Dim stSQL As String
Dim MAINTm As Long '発注金額
DoCmd.SetWarnings False
'ADO接続で合計金額を計算
Set CN = CurrentProject.Connection
Set RS = New ADODB.Recordset
SQL = "SELECT Sum(金額) AS 金額計 FROM Q02発注伝票明細表示用 GROUP BY 発注登録No HAVING 発注登録No=" & 発注登録No.Value & ";"
RS.open SQL, CN, adOpenKeyset, adLockOptimistic
MAINTm = RS!金額計
RS.Close: Set RS = Nothing
CN.Close: Set CN = Nothing
'合計金額の更新
stSQL = "Update T02発注伝票 SET 発注金額 =" & MAINTm & " Where 発注登録No = " & Me.発注登録No.Value & ";"
DoCmd.RunSQL stSQL
DoCmd.SetWarnings True
Me.Recalc
End Sub
追加フォームからデータを追加した処理と同じように、ADO接続を使って合計金額を計算しています。
まとめ
以上、伝票フォームに効率よくデータを入力するためのAccess VBAプログラミングについて解説しました。
Accessは、ポップアップ式の追加フォームをうまく使うことで、データ入力の手間を減らせます。
特に明細データについては顕著に効果があらわれます。
一方で、自分以外の他人がAccessシステムを使った場合、想定しえない操作で不具合を引き起こすこともあります。
入力ミスが起きにくいような対策もあらかじめ打っておく必要もあるでしょう。
また、DAO接続やADO接続も便利な機能で、Accessシステムの開発ではよく使われるので、とにかく慣れておくことをおすすめします。