発注入力システムのプログラミング
これからは、最初に参考で紹介いたしました「発注入力」システムのプログラムに沿って説明を進めたいと思います。
1.入力日時の書き込みプログラム:
前に説明しました入力日時は、入力フォームを立ち上げた時刻(パソコンの時刻)を読み込ませます。
現在の時刻を表す「Now()」関数を使
用します。
エクセルシート上の「発注入力」ボタンを右クリックし、メニューから「マクロの登録」をクリックします。
マクロの登録画面が表示されますので右側の「編集」をクリックします。
「発注入力」ボタン1のプロシージャが表示されますので、入力日時のテキストボックス1にNow()関数による時刻を書き込むようにプログラムします。
次のように書きます。
エクセル上の「発注入力」ボタンをクリックし、発注入力フォームを表示させてみてください。
【参考】
TextBox1の前の「UserForm1.」の指定がないと下図のようなデ
バッグが表示されます。
「デバッグ」をクリックすると下図のように黄色に反転して表示されます。
画面上部にこのプロシージャが収納されている場所が表示されています。
コードウィンドウの画面左列の「プロジェクト」に「フォーム」と「標準モジュール」のフォルダーがあります。「Module1」はこの標準モジュールフォ
ルダー内の「Module1」を表しています。
こ
の標準モジュールのプログラム内でUserForm1のコントロールなどを指示する場合には、どのユーザーフォームのコントロールか指示しなければなりま
せん。
現在
はユーザーフォームは一個ですがここに多数のユーザーフォームを挿入することができますのでどのユーザーフォームのコントロールかわからないため、デバッ
グが表示されたのです。
そのためユーザーフォーム(UseForm1)のテキストボックス1ですよと指示いたします。
UserForm1.TextBox1.Value=Now()
と書きますが、このドット(.)を「の」と読み替えるとプログラムを翻訳しやすいかと思います。
「ユーザーフォーム1のテキストボックス1のValueに
Now()(今の時刻)を代入(=)しなさい」とこのプログラムを訳すことができます。
修正後、忘れずに「リセット」ボタンをクリックしてプログラムの
「中断」を解除する必要があります。
2.発注日:
発注日が入力日と同じ場合が多々あるのであれば、入力作業を省くために入力日と同じ日にちを書き込んでおけば入力作業が一手間省けます。
但し入力日時には
時刻まで表示していますが、発注日はそこまでの表示は必要ないので、見た目が良いように年月日までの表記にしたい場合には「Format」関数を使用します。
入力フォーム内での見た目は気にしないと言うことであれば、エクセルシートに書込み後、「セルの書式設定」で年月日に設定してもよい。
今回はFormat関数を使用した状態で続けます。
発注日が異なる場合は、書き込まれている日付を消して「西暦/月/日」と書き込みます。
3)発注番号:
ここでは前述しましたように「Change」プロシージャにアルファベットを大文字に変換(Ucase)する関数を使ってアルファベットを大文字に変換
するプログラムを組み込んでおきます。
4)発注先の商品名(コンボボックス2~コンボボックス6)の「Rowsource」の設定:
発注先が定まれば、商品名のプロパティの「RowSource」が決定されますので、RowSourceに書き込ませます。
発注先とその会社の商品名の表との関係は次のようになっていましたよね。
発注先が確定したところでその隣の列「商品名範囲名前」の名前をコンボボックス2~6の「RowSource」に書き込ませるようにプログラムします。
思い出して頂きたいのは、発注先会社名コンボボックスのプロパティ設定で「Text」に「発注先会社名」、「Value」に「商品名範囲名前」を設定して
おりましたよね。
従っ
て、発注先が確定すると言うことは、発注先のコンボボックス1からカーソルが次に移動(Exit)したときですので「Exit」のプロシージャに商品名の
コンボボックス(2~6)のプロパティ「RowSouce」に「ComboBox1.Vaue」を代入すれば良いことになります。
最初に「If ComboBox1.Text <> ""
Then」(コンボボックス1が空白でないならば)と条件を付けています。
発注先を指定せずに(コンボボックスが空白の状態で)カーソルが次に移動した場
合、商品名のRowSourceを設定できずに、次のようなデバッグが発生するのを防止するためです。
「Null」は”空白”を意味します。
発注先に応じた商品名がリスト表示されるか確認してみましょう。
「発注入力」ボタンをクリックし、「発注入力フォーム」を表示させます。
発注先を選択した場合、その発注先の商品名のリストが表示されるか確認してみてください。
【参考】
前述の「発注入力(ボタン1)」のClickのプロシージャではどのユーザーフォームのコントロールか識別するために「UserForm1」を頭に付け
る必要があると言い
ましたが、ここでは発注先のコンボボックス1のプロシージャはUserForm1の中に作成されているため、「UserForm1」を頭につけ識別させる
必要はありません。
5)単価の書き込み:
単価のテキストボックスの識別番号は、4、7、10、13、16で配置しており、コンボボックスとの関係は下図ようになっているかと思います。
「商品名」のコンボボックスのプロパティの設定で「Value」の値に商品名の一覧表の2列目の「単価」にしていますので、商品名が確定したら、
その商品名のコンボボックスの「Value」の値を単価のテキストボックスに代入すればよいことになります。
コンボボックス2の場合、コンボボックス2の「Exit」(商品が確定)のプロシー
ジャに次のように書きます。
コンボボックス3~6については、上図の赤下線の数値を書き換えるだけです。
コンボボックスで指定した商品の単価がテキストボックスに書き込まれるか確認してみましょう。
【注意】
確認のために「発注入力フォーム」を立ち上げた場合に、以前の発注先名が残っていても改めて発注先名を選択してください。(「Exit」のイベントを実
行させる。)
一度「発注入力フォーム」を非表示とするとプログラム中で設定した商品の「RawSource」はリセットされるため、前の発注先名が表示されているから
そのまま商品名を選択しようとしても商品のリストが表示されません。(ComboBox1のExitのイベントが行なわれないため)
確認手順
①発注先を指定する。
②商品名を指定。
③登録台帳で登録された商品名の単価が単価のテキストボックスに書き込まれるのを確認。
6)数量の書き込み、及び金額算出:
事前に単価が読み込まれているので、数量を書き込んだら金額及び合計金額までを算出させるようプログラムします。
単価、数量、金額、合計金額のテキストボックスの配置は次の通りです。
計算させる場合の四則演算子は、エクセルの関数と同じです。
足し算:+
引き算:-
掛け算:*
割り算:/
ここで注意して頂きたいのはテキストボックス、またはコンボボックス内に書き込まれている数値は文字としてしか認識されませんので数値に変換させる必要が
あります。
文字を数値に変換させる「Val」関数を使用します。
金額、及び合計金額を計算させる式をどの時点のプロシージャに書き込むかです。
数量を書き込み確定(Exit)したプロシージャに書けばよい。
では最初の「TextBox5」の「Exit」のプロシージャに書いてみましょう。
残りのテキストボックス8、11、14、17の「Exit」のプロシージャに同様なプログラムを書き込みます。
金額の計算式のテキストボックスの識別番号の書き換えのみでよいので、このプロシージャをコピーしてほかのテキストボックスの「Exit」プロシージャに
貼り付けて番号のみの書き換えを行なうのも良いでしょう。
コピーは、次のように行ないます。
テキストボックス5のプログラムをコピーする。
テキストボックス8の「Exit」のプロシージャに貼り付ける。テキストボックスの番号のみ書き換える。
金額の計算のテキストボックス6→9、テキストボックス4→7、テキストボックス5→8に書き換えます。
同様にしてテキストボックス11、14、17に行ってください。
発注先、商品名を選択して計算結果を確認してみましょう。
単価は登録台帳より読み込んで書き換えなしの前提で行っておりますので、数量が書かれた場合にのみ金額、合計金額を算出するようにしています。
【参考】
単価を書き換える可能性があれば、単価のテキストボックスにも数量のテキストボックスで作成したプログラムを単価のテキストボックスにもコピーしておけ
ば、単価を変更しても同様に対応することができます。
ここでは単価は登録された単価で数量のみ書き込む(単価は変更されない)流れであとの説明を進めます。
8)担当者名の読み込み:
プログラムの練習のために担当者(テキストボックス21)に担当者のコード番号(T01,T02,・・・,T10)を書込み、設定シートの担当者のコード
表から読み込むようにします。
テキストボックス21のプロパティのIMEModeをすでに半角英数に設定していました。
ここではコードの頭の「T」は大文字にしていますので、すでに説明していますように、「Change」プロシージャに大文字変換関数「Ucase」で大文
字に変換させましょう。
プログラムの流れは、担当者(テキストボックス21)のコードを書き込んだら(Exit)、設定シートの担当者の表の「コード」の列を探しにゆき、書き込
まれた
コードと同じコードが見つかれば、その隣の列の担当者名をテキストボックス21に読み込ませます。
その後の繰り返し作業は、必要ないので停止(Exit
For)させます。
このプログラムを担当者のテキストボックスの「Exit」のプロシージャに書き込みます。
「記録一覧」シート上の「発注入力」ボタンクリックして発注入力フォームを立ち上げて作業を行っているため「記録一覧」シートの画面が表示された状態でプ
ログラムを実行しています。
この「記録一覧」シートが表示された状態から他のシート(設定、注文書、各発注先シート、登録台帳など)の操作を行おうとした場合には、シート名の指定が
必要となります。
そのため「設定」シートの「コード&担当者名」の
表で検索をおこなわせるためには、「WorkSheet("設定").Cells・・・・・」のようにシート名の指定が必要となります。
次ページで発注入力フォームに書き込んだデータを「注文書」シート、「一括記録」、及び「各発注先」シートに書き込みを行うことといたしましょう。