GUIの作成(2/2)
日付の取得
日付の取得は、日付コントロールを使用します。前回は、カレンダーで日付を取得しましたが、日付コントロールはこの簡易版のようなもので、エディット部分に直接入力してもかまいませんし、ドロップダウンボタンを押すとカレンダーが表示されるので、ここから選ぶこともできます。
個数と単価の入力設定
数量はVS標準のNumericUpDownコントロールで入力します。
単価は、InputMan for .NET 4.0Jの数値コントロールを使用します。このコントロールは、数値入力専用のコントロールで、エディット部分に直接数値を入力しますが、ドロップダウンボタンを押すと電卓が表示される、面白いコントロールです。
例えば、単価の割引率が設定されている場合などは、入力の手元で電卓が使えるため、意外と便利な使い方ができます。
納品書番号の入力設定
納品書番号の入力は、キャラクタボックスを使用します。
ここでは、納品書番号を「a000000000」と半角小文字の英字と数字を組み合わせるようにしているので、入力書式もこのスタイルになるように設定しています。
コードの実装
コードでは、納品書番号を入力し[新規入力]ボタンを押した時点で、あらかじめフォームを作成してあるワークシートをコピーし、この納品書番号をワークシートの名前にして作成するようにしています。
処理の流れ
簡単に処理の流れをまとめておきます。
- フォーム起動時にExcelのインスタンスを作成し、ブックを開きます。
- 納品書番号を入力し[新規入力]ボタンを押すと、あらかじめ納品書のフォームを作成してあるワークシート「原紙」をコピーし、ワークシート名を納品書番号に変更すると同時に、2つのコンテナの
Enabled
プロパティをTrueに変更し、各コントロールの入力を可能にします。 - [転送]ボタンを押すと、顧客情報と購入品目をワークシートに転送します。このとき、顧客情報は[転送]ボタンを最初に押した時だけしか転送しないようにし、納品書番号の2重入力を防ぐために納品書番号の入力をクリアしておきます。
- プログラム終了時に、Excelのブックを保存しExcelを終了します。
コードの作成
では、順番にコードを作成していきましょう。
名前空間のインポートと参照設定
コードの冒頭で、InputMan for .NET 4.0Jの各コントロールを使用するので、GrapeCity.Win.Input名前空間をインポートしてください。
Imports GrapeCity.Win.Input
また、Excelのインスタンスを作成しますので、Excelへの参照設定を行う必要があります。
参照設定は、次の方法で行います。
- メニューから[プロジェクト]-[参照の追加]を選びます。
- [COM]タブをクリックし、リストから[Microsoft Excel 5.0 Object Library]を選びます。
Excelの表示
モジュールレベルでExcelのインスタンスへの参照を格納する変数「ex」と、ワークシート作成の有無を判断する変数「flag」を宣言します。
Public Class Form1 Dim ex As Object Dim flag As Boolean = False
Dim ex As Excel.Application
WorkBooks
プロパティがメソッドになってしまい、Excelの各オブジェクトメンバが使えなくなってしまいました。そこで、この変数をオブジェクト型で宣言しています。オブジェクト型だと入力支援機能(メンバの表示機能)が使えなくなってしまいますが、各オブジェクトとプロパティ・メソッドは正しく動作します。そして、フォームのLoadイベントプロシージャで、Excelのインスタンスを作成し、データを保存するブック「納品書作成.xls」を開きます(データ用ブックはドライブCに置いてください)。
こおkは、前回と同じです。
ex = CreateObject("Excel.Application") With ex .Visible = True 'バックグラウンドで処理するならFalseに設定する .Workbooks.Open("c:\納品書作成.xls") End With
CreateObject
関数ではインスタンスは作成できませんでした。新規入力処理の作成
続いて[新規入力]ボタンの処理です。ここでは、納品書番号から新しいワークシートを作成します。
まず、納品書番号が入力されているのかどうかをチェックします。この番号はワークシート名になるので入力は必須条件です。入力されてなければワークシートは作成しません。
入力されていれば、ワークシート「原紙」をコピーし、シート名を納品書番号に変更します。
If Me.CharMask2.Value = "" Then MessageBox.Show("納品書番号を入力してください") Exit Sub Else .Sheets("原紙").Copy(Before:=.Sheets(1)) .ActiveSheet.Name = Me.CharMask2.Value flag = False End If
また、[転送]ボタンで宛先などを入力しますが、この入力はシート1枚に対して1回だけ行いますから、これを判断するために変数flag
にFalseを代入します。
そして、2つのコンテナコントロールを有効にし、各入力コントロールを空白にします。これは、2件目の納品書作成のためです。
With Me Container1.Enabled = True Container2.Enabled = True
顧客情報の入力
コンテナコントロールが有効になると、各入力が可能になります。そして、[転送]ボタンを押すと、これらの入力データをワークシートに転送します。
まず、変数flag
の値を調べ、この[転送]ボタンが最初に押されたものかどうかを調べます。初めてこのボタンが押されたときは、変数flag
は[新規入力]ボタンによってFalseに設定されています。
であれば、顧客情報をワークシートに転送します。
With ex With .ActiveSheet If flag = False Then '宛先入力 .Range("B3") = "〒 " & Me.Postal1.Value.ToString .Range("B4") = Me.TextBox4.Text .Range("B5") = "Tel: " & Me.CharMask1.Value.ToString .Range("B6") = Me.TextBox1.Text .range("I1") = Me.CharMask2.Value
また、2件目の納品書作成に備え、入力されている納品書番号を消去しておきます。
そして、最後に変数flag
の値をTrueにします。これで、次に[転送]ボタンが押されたときは、顧客情報は転送されず、購入品目だけがワークシートに追加されます。
'納品書番号の入力を消去 Me.CharMask2.Value = "" flag = True End If
購入品情報の入力
購入品情報を転送する際は、納品書の入力可能項目数が変化しないように、セルを1行挿入したら最下行の行を削除するようにします。これは、納品書のフォームがずれないための措置です。
If flag = True Then 'セルの準備 .Rows("25:25").Cut() .Rows("10:10").Insert() .Range("B10").Select()
後は、各入力項目をセルに転送します。このとき、VBのコードからセルに式を埋め込むことができます。これは、セルに入力した時の式をそのまま""で囲って代入するだけです。
.Range("H10") = "=F10*G10"
また、VBからExcelのWorksheetFunctionを使用することができないので、この場合もSum
などの関数をコードから設定したい場合は、式を""で囲って文字列で代入します。
.Range("H27") = "=Sum(H10:H25)"
特に、あらかじめセルにSum
関数を設定しておいて、行の削除や挿入を行うと、式が参照しているセル番地が変わってしまいます。これは絶対番地にしていても同じです。ですから、そのような場合は、コードからセルに関数の式を埋め込むといいでしょう。
一件の納品書が作成できたら、再度、納品書番号を入力して[新規入力]を押すことで、次のワークシートを作成し顧客と購入品の情報を入力することができます。
フォームの終了処理
フォームのFormClosed
イベントで、ブックの保存とExcelの終了を実行します。
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As [s:vb;] System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed ex.ActiveWorkbook.Save() ex.Application.Quit() End Sub
まとめ
前回に引き続き、InputMan for .NET 4.0Jのコントロールを使用して、Excelで納品書を作成するための入力フォームを作成してみました。
郵便番号コントロールやIMEコンポーネントなど、プロパティを設定するだけで入力・変換を自動的に行ってくれるのは、コードを書く側でなく、利用者にとっても大変助かりますね。
VBのコードからExcelのセルに式を設定できるので、計算が主体のプログラムや帳票印刷を行いたいプログラムなどは、Excelとのコラボレーションでプログラムを組み立てると開発が楽になると思います。