売上伝票などの入力フォームを作成する時、1伝票1明細の場合にはコンボボックスやテキ
ストボックスなどを普通に使っていて問題はありません。しかし、明細が複数行に渡り、し
かもその行数が不定の場合には、ユーザフォームを使用して入力フォームを作成するにはど
のようにすればいいでしょうか?
まず、伝票の構成を考えます。伝票には通常、マスター情報(ヘッダー)と詳細情報(明細)
とがあります。マスター情報とは、例えば得意先コードや伝票番号など、何件の明細を入力
するにせよ、必ず基本データとして保持する必要があるデータのことをいいます。一方、詳
細データに属するものとしては、商品ID、個数、商品単価などがあげられるでしょう。
ここでは、リストボックスの使用について検討します。リストボックスは複数列の表示が可能
であり、行を追加し、リストを保持することができますので、擬似的なグリッドのように使用
することも可能です。ただ、リストボックスへの直接入力はできませんので、この点について
は何らかの工夫をすることが必要です。
以下のサンプルではリストボックスへのレコード追加には、列数分のテキストボックスを用意し、
最後のテキストボックスへの入力を終えた段階で入力チェックを行い、リストボックスの各列へ
データを格納するという手法をとっています。
(フォームの構成)
下記のようにコントロールを配置、オブジェクト名を変更してください。
・マスター情報:cboCD:得意先コード、txtName:得意先名表示,txtDate:伝票日付
※cboはコンボボックス、txtはテキストボックス
・詳細情報 :txtShohinID:商品コード,txtShohinName:商品名,txtNumber:個数,
txtTanka:単価
LstMeisai:レコード追加用のリストボックス(擬似グリッド)
得意先コードコンボボックスと得意先名表示用のテキストボックスについてはテクニック集
”コントロール活用 − 複数列コンボボックスの活用”を参考にしてください。以下のサ
ンプル中の商品コード、商品名についても同様の考え方を適用してコンボボックスに変更す
るとより実用的になります。
LstMeisaiはWidthが400〜、Heightは200〜、格納するデータにしたがって適宜変更し
てください。その他のプロパティー設定はフォームのInitializeイベント中で行います。
■サンプル:リストボックスへのレコード追加に焦点を絞って解説します■
'=====================================================================
'ユーザフォーム初期化イベント
Private Sub UserForm_Initialize()
With LstMeisai
.ColumnCount = 4 '4列表示を指定
.ColumnWidths = "100;100;100;100" '各列の幅を指定(適宜変更)
.TabStop = False 'リストボックスをタブ移動の対象からはずす
End With
End Sub
'=====================================================================
'詳細セクションの4つのテキストボックスのうち、最後のテキストボックスで
'入力チェック&リストボックスへの転記
Private Sub txtTanka_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim LstCnt As Integer
'入力チェック(ここでは空欄がないかどうかだけをチェックしています)
If txtShohinID <> "" And txtShohinName <> "" _
And txtNumber <> "" And txtTanka <> "" Then
With LstMeisai
LstCnt = .ListCount
.AddItem '空白行の挿入
.List(LstCnt, 0) = txtShohinID
'Listプロパティーで行列を指定してデータを格納
.List(LstCnt, 1) = txtShohinName
.List(LstCnt, 2) = txtNumber
.List(LstCnt, 3) = txtTanka
End With
'明細用テキストボックスのデータクリア
txtShohinID = "": txtShohinName = "": txtNumber = "":txtTanka = ""
txtShohinID.SetFocus
End If
End Sub
このほか、擬似的にマスター詳細フォームを作成するこの問題を解決する手段として考えら
れるのは・・・
・Frameなどをコンテナにして動的にコントロールを追加する
・オフィスWEBコンポーネントのSpreadSheetコントロールを使う
・ワークシートを使用する(入力規則などを活用するとよいでしょう)
動的にコントロールを追加する方法の場合、イベント処理の有無によって処理が複雑になる
ことも考えられます。また、クラスモジュールなどを使う必要も出てくるため、初心者向き
でもありません。
|