即効テクニック |
売上伝票などの入力フォームを作成する時、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コントロールを使う ・ワークシートを使用する(入力規則などを活用するとよいでしょう) 動的にコントロールを追加する方法の場合、イベント処理の有無によって処理が複雑になることも考えられます。また、クラスモジュールなどを使う必要も出てくるため、初心者向きでもありません。