【VBAマクロ】AccessからExcel出力して請求書を作成する方法その2(フォーム編)
Accessから請求書出力をExcelで行うシリーズ第2弾ということで、前回のデータベース(テーブル)構築に引き続きフォーム編です。
顧客IDで連携させるテーブル構築が完成したら、後はデータ格納するためのフォームギミックが必要。
今回は、メインフテーブルとサブテーブルを連携させながら請求内訳データを格納させるユーザインタフェースとなる入力フォームについて紹介していきます。
メインフォームとサブフォームの作成
テーブルがメインとサブに別れているのと同じように、フォームもメインとサブで作成します。
まずはフォームを2つ作っていきましょう。
フォームは、mainの中にsubを帳票形式のサブフォームとして作っていきます。
帳票形式は通常のフォームとは異なり、複数のレコードが一気に確認できるので請求内訳のようにデータを蓄積するタイプには最適です。
サブフォームを設定して顧客IDでリンクさせる
Accessデータベースでテーブル連携を行うには、リレーションシップが必要と認識している方が多いのではないでしょうか?
確かにリレーションシップはテーブル間を連携させるのに便利な仕組みですが、複数人によるフォームからのデータ入力には向いてません。
今回のケースでは、テーブルで連携させずフォームのオブジェクト間で顧客IDをキーに連携させます。
それ以外にもサブフォームにはいくつかのプロパティ変更が発生するので、最低限必要な分だけ以下の図で紹介しましょう。
・リンク親(子)フィールドの設定:コントロール内のプロパティ
・規定のビューを帳票フォームにする
・追加の許可をいいえに設定(場合による)
メインフォームの中にサブフォームを設定した場合、サブフォーム自体のプロパティの他にメインフォームにおけるコントロールとしてのプロパティが存在します。
顧客IDのリンクは、フォームプロパティではなくコントロールプロパティで設定するので注意しておきましょう。
サブフォームの作成で詳細を知りたい方は、以下のページを参考にしてみてください。
引用:ACCESSとVBAとシステム開発
レコード追加のギミックを作成する
デザインが完成したら、サブテーブルへレコードを追加する仕組みを作成していきます。
以下のようなフォームが完成したら、コマンドボタンを追加してクリックのイベントプロシージャにVBAを書いていきましょう。
サブフォームのプロパティで「追加の許可」を「いいえ」に設定すると、上記の図右側のようにテキストボックスすら出ない状態になります。
非連結の入力用テキストボックスを作って、ボタンクリックでデータを追加するケースもあるので覚えておきましょう。
今回は、ボタンのクリックで空のレコード(厳密には顧客IDのみ)を追加する仕組みを作っていきます。
Private Sub cmdButton_recordAdd_Click()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("t_sub")
With rs
.AddNew
!顧客ID.Value = Me.顧客ID.Value
.Update
.Close
End With
Me.Requery
Set rs = Nothing
End Sub
今回の場合は顧客IDさえ追加できればOKなので、メインフォームで表示されている顧客IDをレコード追加と同時にt_subへ追加しました。
注意点としては『Requery』を忘れないこと。
これを忘れるとテーブルのデータがフォームへ反映しないので、見た目はそのままなのにレコードだけが追加されます。
正しく追加されれば、サブフォーム上にテキストボックが表示されるはずです。(↓こんな感じに)
色んな状況を想定しておく
今回は、請求書内訳の入力に必要なフォーム上のギミック例を紹介しました。
実際の一体多のレコード追加では、削除機能や編集を制御するような機能を付けることも多いです。
例えば前述のコードだと、ボタンを押すたびに空のテキストボックスが無限に作成されるので(↓こんな感じに)、メッセージアラートや削除機能が必要になるでしょう。
非連結テキストボックスを使って、下書きしてから確定(レコード追加)される方法もあります。
この辺については、また別の記事で述べることするので、今回は請求書出力で最低限必要なノウハウとして覚えておいてください。
DeepBlueでは、VBAに関する質問や要件定義の相談を受け付けています。
今回、この記事を読んで登録してくれた方には初回のみ無料でVBAマクロに関する相談を承りますよ。
興味ある方は、是非チェックしてみてくださいね。
この記事が気に入ったらサポートをしてみませんか?