みなさん、こんにちはケンケンです。
販売管理システムを自前で作るシリーズをお伝えしています。
前回は、見積データ新規登録用フォームをコンボボックスを中心にご紹介しました。
みなさん、こんにちはケンケンです。 販売管理システム作成をシリーズでお伝えしています。 前回は、見積データの新規登録用フォームを作り初期値を設定しました。 [sitecard subtitle=前回の復習 […]
今回は、新規登録用フォームのリストボックスのアクションを設定する方法をご紹介します。
前回の復習
前回作ったフォームとコードを以下に表示しておきます。
フォーム上でコンボボックスを選択するとボックス内に存在するデータをテキストボックスに転記することができました。
また、テキストボックスにデータを入力することをトリガーにして、金額欄など他のテキストボックスに任意のデータを記述することに成功しました。
得意先コンボボックスのコード
1 2 3 4 |
Private Sub cboTokuisaki_Change() txtTokuisaki.Text = cboTokuisaki.List(cboTokuisaki.ListIndex, 1) txtTokuisaki.BackColor = &H80000005 End Sub |
商品Noコンボボックスのコード
1 2 3 4 5 6 7 8 |
Dim tanni Private Sub cboSyouhin_Change() txtSyouhin.Text = cboSyouhin.List(cboSyouhin.ListIndex, 1) txtSyouhin.BackColor = &H80000005 txtTanka.Text = Format(cboSyouhin.List(cboSyouhin.ListIndex, 2), "#,###") txtTanka.BackColor = &H80000005 tanni = cboSyouhin.List(cboSyouhin.ListIndex, 3) End Sub |
数量テキストボックスを更新する度に起こるアクションを記載したコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Private Sub txtSuryou_AfterUpdate() If txtSyouhin.Text = "" Then Exit Sub End If txtKingaku.Text = Format(txtSuryou.Text * txtTanka, "#,###") If txtKingaku.Text = "" Then txtTax.Text = "" txtZeikomi.Text = "" Exit Sub End If txtTax.Text = Format(txtKingaku.Text * 0.08, "#,###") txtZeikomi.Text = Format(txtKingaku.Text * 1.08, "#,###") txtKingaku.BackColor = &H80000005 txtTax.BackColor = &H80000005 txtZeikomi.BackColor = &H80000005 End Sub |
数量テキストボックスには数字のみ入力できるようにする
テキストボックスに入力できる文字列を限定したほうが良い時があります。
例えば、数量(txtSuryou)に数字以外の文字列が入力されると困りますね。
エラーが生じないよう事前に穴はつぶしておきましょう。方法はいろいろあるかと思いますが、今回はKeyPressイベントプロシージャを使って対応します。
1 2 3 4 5 |
Private Sub txtSuryou_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then KeyAscii = 0 End If End Sub |
KeyPressイベントはキーが押下された瞬間に起こるイベントと考えて良いでしょう。
Chr(KeyAscii) < “0” Or Chr(KeyAscii) > “9”は入力した文字コードをChr関数で変換して0から9までの間だったら有効とするコードです。
0から9以外だったらKeyAscii = 0として存在しない文字コード(0)を代入し、空白とします。※文字コード0は空白を表します
前回作成したままだと数量(txtSuryou)に漢字を入力することもできました。
当然、エラーになるためよろしくありません。そこで今回のように対策をとると良いですね。
文字コードの考え方は別途お伝えする機会があればご紹介しますが、ここでは「それぞれの文字に割り当てられた数字」くらいに考えておいてください。
それでは、フォームを起動して数量を入力してみましょう。
すると、0から9までの数字しか認識しなくなります。これで、エラーを回避できます。
データ追加ボタンをクリックしリストボックスにデータを表示させる
データ追加ボタンをクリックしたときの処理を設定します。
商品から税込金額まで確定した後にクリックすることでリストボックスに転記します。
ボタンクリック時の処理をまとめよう
- 商品名から税込金額までの値をリストボックスに転記する
- 転記後は商品名から税込金額までの値を消去する
- 次のデータを入力しやすいように商品Noコンボボックスにフォーカスを移動する
- データ追加ボタンをクリック不能にする
- 見積Noから得意先コンボボックスまで使用不能にする
- 合計金額テキストボックスに合計額を計算し表示する
以上のようなアクションをコードで表現していきます。ちょっとやることが多いですが、がんばっていきましょう。
商品名から税込金額までの値をリストボックスに転記する
データ追加ボタンをクリックするとリストボックスに商品名から税込金額まで表示されるように仕掛けを作ります。
フォーム画面からデータ追加ボタンをダブルクリックしてClickイベントプロシージャにコードを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Private Sub cmbTuika_Click() With lstMeisai .AddItem txtMitumoriNo.Text'① .List(.ListCount - 1, 1) = txtMhiduke.Text'② .List(.ListCount - 1, 2) = txtTokuisaki.Text .List(.ListCount - 1, 3) = txtSyouhin.Text .List(.ListCount - 1, 4) = txtSuryou.Text .List(.ListCount - 1, 5) = tanni'③ .List(.ListCount - 1, 6) = txtTanka.Text .List(.ListCount - 1, 7) = txtKingaku.Text .List(.ListCount - 1, 8) = txtTax.Text .List(.ListCount - 1, 9) = txtZeikomi.Text End With End Sub |
コード解説
まず、リストボックス(lstMeisai)をWithステートメントを使って括ってしまいましょう。
①AddItemでリストボックスに1行追加し、1列目に見積Noを付します。
②から最後の行まででリストボックスの2列目から10列目までデータを代入しています。途中の③は前回作った変数tanniを代入しています。
この変数には商品の単位が格納されていましたね。
それでは、フォームを起動して挙動を確認してみましょう。
上記のように転記されていれば成功ですが、気づきましたか。
そうです、コードで転記したデータの数(7個)と転記されたデータの数(10個)が一致しません。
これの答えはリストボックスのInitializeイベントに隠されていましたね。
コードを確認すると
1 2 3 4 5 |
With lstMeisai 'リストボックスの初期値 .ColumnCount = 10 .ColumnWidths = "0;0;0;60;36;40;60;60;60;60" .TextAlign = fmTextAlignCenter End With |
ColumnWidths = “0;0;0;60;36;40;60;60;60;60″
カラム設定で最初から3列目まで0で設定しています。
具体的に言うと
- 見積No(txtMitumoriNo)
- 見積日(txtMhiduke)
- 得意先名(txtTokuisaki)
上記3つです。
この3つはデータ共通のものなので明細を追加するときには必要のない情報です。
カットすることでユーザーに余計な負担をかけないように配慮しています。
転記後は商品名から税込金額までの値を消去する
無事リストボックスに転記できたら、テキストボックスの値は消去した方が次の入力がしやすいですね。
そこで、各値を消去するコードをcmbTuika_Clickプロシージャに追記しましょう。
1 2 3 4 5 6 |
txtSyouhin.Text = "" txtSuryou.Text = "" txtTanka.Text = "" txtKingaku.Text = "" txtTax.Text = "" txtZeikomi.Text = "" |
左辺にテキストボックス名をもってきて、右辺にダブルクォーテーションで囲むと空欄にすることができます。
実行して確認しておきましょう。
さらに空欄になったテキストボックスの色をグレーに戻しておきましょう。
コードは以下になります。
1 2 3 4 5 |
txtSyouhin.BackColor = &H8000000F txtTanka.BackColor = &H8000000F txtKingaku.BackColor = &H8000000F txtTax.BackColor = &H8000000F txtZeikomi.BackColor = &H8000000F |
次のデータを入力しやすいように商品Noコンボボックスにフォーカスを移動する
データをリストボックスに転記したら次のデータを入力しやすくする工夫をしておきましょう。
SetFocusメソッドを使いフォーカスを移動することでスムーズに次の入力を行えます。
今回は、商品Noコンボボックスにフォーカスを移動しましょう。
コードは以下のように書き実行しましょう。
1 |
cboSyouhin.SetFocus |
データ追加ボタンをクリック不能にする
リストボックスに転記したらデータ追加ボタンを連続でクリックできないように、クリック不能にしましょう。
1 |
cmbTuika.Enabled = False |
見積Noから得意先コンボボックスまで使用不能にする
リストボックスに1行データを追加したタイミングで見積Noから得意先名まで確定させたいですね。
そのために、各コントロールの編集を不可にします。
1 2 3 |
txtMitumoriNo.Enabled = False txtMhiduke.Enabled = False cboTokuisaki.Enabled = False |
合計金額テキストボックスに合計額を計算し表示する
見積データをリストボックスに追加していくたびに合計金額テキストボックスの金額が変化するように設定します。
先にコードを書きましょう。
1 2 3 4 5 6 7 8 9 |
Dim Lrow Dim goukei Dim cnt Lrow = lstMeisai.ListCount - 1'① goukei = 0'② For cnt = 0 To Lrow'③ goukei = goukei + lstMeisai.List(cnt, 9)'④ Next txtGoukei.Text = Format(goukei, "#,###")'⑤ |
イメージとしては、リストボックスの税込金額の部分を1行ずつピックアップして順次変数に追加していく感じです。
コードの解説
①リストボックスの最終行を取得して変数Lrowに格納しています。
リストボックスの行と列は0から始まるので、取得した値からマイナス1しています。
②合計金額を格納する変数goukeiの初期値を0にしています。
③リストボックスの最初の行(0行目)から最終行LrowまでをForNext構文で回します。
④ lstMeisai.List(cnt, 9)はリストボックスのcnt行目の10列目(値は9)を取得し変数goukeiに追加しています。
リストボックスの10列目は税込金額が格納されています。
⑤変数goukeiに格納された合計金額をFormat関数で表示形式を整えてテキストボックスに転記します。
ここまでできたらフォームを実行しましょう。
合計が集計されていれば成功です。
まとめ
いかがですか。
今回は、リストボックスにデータを表示する方法を中心にお伝えしました。
細かい設定が続きますが、システムを作る上では重要な要素になるのでご自分で作るときも意識しておいていただきたいです。
次回は、リストボックスに表示した情報をエクセルシートに転記する方法をご紹介しますのでお楽しみに。
それでは、また次回お会いしましょう。
今回書いたコード
1 2 3 4 5 |
Private Sub txtSuryou_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then KeyAscii = 0 End If End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Private Sub cmbTuika_Click() With lstMeisai .AddItem txtMitumoriNo.Text .List(.ListCount - 1, 1) = txtMhiduke.Text .List(.ListCount - 1, 2) = txtTokuisaki.Text .List(.ListCount - 1, 3) = txtSyouhin.Text .List(.ListCount - 1, 4) = txtSuryou.Text .List(.ListCount - 1, 5) = tanni .List(.ListCount - 1, 6) = txtTanka.Text .List(.ListCount - 1, 7) = txtKingaku.Text .List(.ListCount - 1, 8) = txtTax.Text .List(.ListCount - 1, 9) = txtZeikomi.Text End With txtSyouhin.Text = "" txtSuryou.Text = "" txtTanka.Text = "" txtKingaku.Text = "" txtTax.Text = "" txtZeikomi.Text = "" txtGoukei.BackColor = &H80000005 txtSyouhin.BackColor = &H8000000F txtTanka.BackColor = &H8000000F txtKingaku.BackColor = &H8000000F txtTax.BackColor = &H8000000F txtZeikomi.BackColor = &H8000000F cboSyouhin.SetFocus cmbTuika.Enabled = False txtMitumoriNo.Enabled = False txtMhiduke.Enabled = False cboTokuisaki.Enabled = False Dim Lrow Dim goukei Dim cnt Lrow = lstMeisai.ListCount - 1 goukei = 0 For cnt = 0 To Lrow goukei = goukei + lstMeisai.List(cnt, 9) Next txtGoukei.Text = Format(goukei, "#,###") End Sub |
販売管理システム作成記事一覧~見積編~
エクセルを駆使して販売管理システムを作ってみる【元データの取り扱い方】
【販売管理システム作成】見積書を期間指定して作成する方法①【コードのカスタマイズ】
【販売管理システム作成】見積書を期間指定して作成する方法②【リストボックス作成】
【販売管理システム作成】見積書を期間指定して作成する方法③【リストボックス作成その2】
【販売管理システム作成】見積データ登録用のフォームを作ろう①【フォームの設定】
【販売管理システム作成】見積データ登録用のフォームを作ろう②【コンボボックスの活用】
【販売管理システム作成】見積データ登録用のフォームを作ろう③【リストボックスの活用】
【販売管理システム作成】見積データ登録用のフォームを作ろう④【エクセルシートに登録】