みなさん、こんにちはケンケンです。
エクセルを駆使して販売管理システムを作るシリーズをお送りしています。
前回は、登録済みのデータを削除する方法をご紹介しました。
フラグを立てる工夫は応用が効く論点なので覚えておきましょう。
みなさん、こんにちはケンケンです。 販売管理システムをエクセルを使い倒して作っちゃおうというシリーズをお伝えしています。 前回は、登録済みのデータを修正する方法をご紹介しました。 [sitecard s[…]
今回は、登録済みのデータにさらにデータを追加する方法をご紹介します。
前回までの知識でほとんどすべてをまかなえますので、難しく考えずに早速見ていきましょう。
追加登録機能を実装しよう
これから追加登録機能を実装しますが、コードを書く前に
まずは、今回必要になる処理の手順を確認しましょう。
手順を確認しよう
- フォームに追加ボタンを追加する
- 追加登録用のフォームを作る
- 追加ボタンと新しいフォームを連携させる
- 取り消しボタンをクリックすると閉じる
- 追加登録用フォームの初期値を設定する
- 商品コンボボックスが選択された時の処理
- 数量テキストボックスが入力された時の処理
- 追加実行ボタンをクリックしたときの処理
上記の順番で実装していきます。
では、今日もがんばっていきましょう。
フォームに追加ボタンを追加する
まずは、見積データ一覧フォーム(frmMitumoriDelete)にコマンドボタンを追加します。
ツールボックスからコマンドボタンを選択するかフォームにすでに配置済みのコマンドボタンをコピーして使ってください。
▶新しいコマンドボタン
- オブジェクト名・・・cmbTuika
- Caption・・・行追加
追加登録用のフォームを作る
続いて追加専用のフォームを作ります。
VBE画面から「挿入」から「ユーザーフォーム」を選択しフォームを作成してください。
▶新しいフォーム
- オブジェクト名・・・frmTuika
- Caption・・・見積データ追加
データの修正フォーム(frmSyusei2)をコピーして使います。
コピーできたら新しく作成したフォームに移動します。
張り付けられたら以下のようにコントロールの変更をお願いします。
▶修正実行ボタンの修正
- オブジェクト名・・・cmbTuika
- Caption・・・追加実行
追加ボタンと新しいフォームを連携させる
上記で作ったボタンを連携してみましょう。
見積データ一覧フォームの行追加ボタンをクリックすると見積データ追加フォームに飛ぶようにコードを書きます。
VBE画面で見積データ一覧フォームの行追加ボタンをダブルクリックしてクリックイベントプロシージャを作ります。
そこにコードを書きましょう。
Private Sub cmbTuika_Click() If lstMitumori.ListIndex = -1 Then MsgBox "データ一覧リストから選択してください。" Exit Sub End If frmTuika.txtMitumoriNo.Text = lstMitumori.List(lstMitumori.ListIndex, 0) frmTuika.txtMhiduke.Text = lstMitumori.List(lstMitumori.ListIndex, 1) frmTuika.txtTokuisaki.Text = lstMitumori.List(lstMitumori.ListIndex, 2) selectRow2 = lstMeisai.ListIndex frmTuika.Show End Sub
連携するコード自体は最後の行だけですが、それ以外はリストボックスで選択したデータのうち
見積もりNo等を次のフォーム(frmTuika)に転記するコードです。
コードの内容自体は以前に解説済みなので以下で復習しておきましょう。
みなさん、こんにちはケンケンです。 販売管理システムの作成を通してエクセルを学んでいくことを目指したシリーズです。 前回は、とうとう新規登録画面の完成までこぎつけました。 [sitecard subti[…]
取り消しボタンをクリックすると閉じる
新しいフォームの取り消しボタンをクリックすると閉じるコードを書きましょう。
もうだいぶ慣れてきたんじゃないでしょうか。
Private Sub cmbTorikesi_Click() Unload Me End Sub
追加登録用フォームの初期値を設定する
追加登録用フォームの商品コンボボックスについて初期値(Initialize)を設定します。
Initialize用のプロシージャを作成し、以下のようにコードを書きましょう。
Private Sub UserForm_Initialize() Dim Lrow Dim cnt Lrow = Sheets("商品一覧").Range("A" & Rows.Count).End(xlUp).Row '商品コンボボックス初期値 With cboSyouhin .ColumnCount = 2 .ColumnWidths = "30;150;0;0" .ListWidth = 180 For cnt = 2 To Lrow .AddItem Sheets("商品一覧").Range("A" & cnt).Value .List(.ListCount - 1, 1) = Sheets("商品一覧").Range("B" & cnt).Value .List(.ListCount - 1, 2) = Sheets("商品一覧").Range("C" & cnt).Value .List(.ListCount - 1, 3) = Sheets("商品一覧").Range("D" & cnt).Value Next End With End Sub
コンボボックスの活用方法は以下の記事にまとめてありますのでそちらを参考にしてください。
みなさん、こんにちはケンケンです。 販売管理システム作成をシリーズでお伝えしています。 前回は、見積データの新規登録用フォームを作り初期値を設定しました。 [sitecard subtitle=前回の復習 […]
商品コンボボックスが選択された時と数量テキストボックスが入力された時の処理
ここも復習です。
以下のコードを新しいフォームに追加しておきましょう。
復習は以下の記事でお願いします。
みなさん、こんにちはケンケンです。 販売管理システムを自前で作るシリーズをお伝えしています。 前回は、見積データ新規登録用フォームをコンボボックスを中心にご紹介しました。 [sitecard subti[…]
みなさん、こんにちはケンケンです。 販売管理システム作成をシリーズでお伝えしています。 前回は、見積データの新規登録用フォームを作り初期値を設定しました。 [sitecard subtitle=前回の復習 […]
Private Sub cboSyouhin_Change() With cboSyouhin If .ListIndex = -1 Then Exit Sub End If 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 With End Sub
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 cmbTuika.Enabled = True End Sub
Private Sub txtSuryou_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then KeyAscii = 0 End If End Sub
追加実行ボタンをクリックしたときの処理
最後に追加実行ボタンをクリックしたときの処理をまとめておきましょう。
先にコードの入力をお願いします。
Private Sub cmbTuika_Click() Dim res res = MsgBox("登録します。よろしいですか?", vbYesNo + vbInformation, "確認") If res = vbNo Then Exit Sub End If Dim Lrow Lrow = Sheets("見積データ一覧").Range("A" & Rows.Count).End(xlUp).Row + 1 Sheets("見積データ一覧").Range("A" & Lrow).Value = txtMitumoriNo.Text Sheets("見積データ一覧").Range("B" & Lrow).Value = Format(txtMhiduke, "yyyy/mm/dd") Sheets("見積データ一覧").Range("C" & Lrow).Value = txtTokuisaki Sheets("見積データ一覧").Range("D" & Lrow).Value = txtSyouhin.Text Sheets("見積データ一覧").Range("F" & Lrow).Value = txtSuryou.Text Sheets("見積データ一覧").Range("G" & Lrow).Value = tanni Sheets("見積データ一覧").Range("H" & Lrow).Value = txtTanka.Text Sheets("見積データ一覧").Range("I" & Lrow).Value = txtKingaku.Text Sheets("見積データ一覧").Range("J" & Lrow).Value = txtTax.Text Worksheets("見積データ一覧").Range("A1:N1").AutoFilter 'このタイミングでソートをかける ActiveWorkbook.Worksheets("見積データ一覧").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("見積データ一覧").AutoFilter.Sort.SortFields.Add Key:= _ Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("見積データ一覧").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Sheets("見積データ一覧").Range("A1:N1").AutoFilter Lrow = Sheets("見積データ一覧").Range("A" & Rows.Count).End(xlUp).Row 'フィルタオプションを実行する Sheets("見積データ一覧").Activate Range("Q2").Value = "" Range("Q2").Value = txtMitumoriNo.Text Sheets("見積データ一覧").Range("A1:N" & Lrow).AdvancedFilter Action:=xlFilterCopy, _ criteriarange:=Range("O1:Q2"), copytorange:=Range("O4:AB4") With frmMitumoriDelete.lstMeisai .Clear Lrow = Sheets("見積データ一覧").Range("O" & Rows.Count).End(xlUp).Row Dim cnt For cnt = 5 To Lrow If Range("AB" & cnt).Value <> "d" Then .AddItem Range("R" & cnt).Value .List(.ListCount - 1, 1) = Range("T" & cnt).Value .List(.ListCount - 1, 2) = Range("U" & cnt).Value .List(.ListCount - 1, 3) = Format(Range("V" & cnt).Value, "#,###") .List(.ListCount - 1, 4) = Format(Range("W" & cnt).Value, "#,###") .List(.ListCount - 1, 5) = Format(Range("X" & cnt).Value, "#,###") .List(.ListCount - 1, 6) = Format(Range("AA" & cnt).Value, "#,###") End If Next End With End Sub
すべて今まで書いてきたコードを使いまわしたものですが、ポイントがあります。
データを追加すると
エクセルシートに書き出した後にすぐシートのソートをしてフィルタオプションを実行しています。
こうすることで「追加」即リストボックスに反映が可能です。
コードを実行して確かめてみましょう。
上記のようにすべて連携されていれば成功です。
まとめ
以上となります。
これで、登録済みのデータに対する追加機能も実装できました。
次回は、まだ実装できていないコマンドボタンに機能を実装したり、細かい設定をしたりバグがないか確認して
見積機能については最終回となります。
大変長くなってしまってみなさんには負担をかけているかもしれません。
みなさんがVBAを使って業務中に何か作るときはもっとシンプルなものを作るほうが得策でしょう。
たくさん時間をかけられる方は、今回のシリーズのように機能を充実させた作品を作ってみてください。
いずれにせよたくさん書いてたくさん失敗して、そこから学んでください。
僕の記事で少しでもみなさんの手助けになっていれば幸いです。
それでは、また次回お会いしましょう。
販売管理システム作成記事一覧~見積編~
エクセルを駆使して販売管理システムを作ってみる【元データの取り扱い方】
【販売管理システム作成】見積書を期間指定して作成する方法①【コードのカスタマイズ】
【販売管理システム作成】見積書を期間指定して作成する方法②【リストボックス作成】
【販売管理システム作成】見積書を期間指定して作成する方法③【リストボックス作成その2】
【販売管理システム作成】見積データ登録用のフォームを作ろう①【フォームの設定】
【販売管理システム作成】見積データ登録用のフォームを作ろう②【コンボボックスの活用】
【販売管理システム作成】見積データ登録用のフォームを作ろう③【リストボックスの活用】
【販売管理システム作成】見積データ登録用のフォームを作ろう④【エクセルシートに登録】
【販売管理システム作成】見積データ登録用のフォームを作ろう⑤【修正削除機能の実装】
【販売管理システム作成】登録済みのデータを修正削除する方法【見積システム完成編】
【販売管理システム作成】登録済みのデータを削除する方法【削除フラグの立て方】
【販売管理システム作成】登録済みのデータにさらにデータを追加する方法【見積編ラス前】