はじめに
「InputMan for .NET 4.0J Windows Forms Edition」(以降、InputMan for .NET 4.0J)は、VSに組み込まれている標準コントロールよりも、さらに進んだ機能を持ったコントロール群を提供するコントロールパックです。
今回は、この中からキャラクタボックス、日付、数値、郵便番号、エディット、コンテナの各コントロールとIMEコンポーネントを使い、Excelで納品書を作成するための入力フォームプログラムを作成してみました。
フォームから納品書番号や宛先、品名と数量・単価などを入力すると、その内容をExcelのワークシートに転送して納品書を作成します。
InputMan for .NET 4.0Jの使い方はとても簡単で、付属のインストーラでコンピュータにインストールすれば、後はツールボックスにコントロールを追加するだけですぐに使用できます。
対象読者
Visual Basic 2005を使ってプログラムを作ったことのある人、Excel VBAが使える人が対象です。
必要な環境
Visual Basic 2005またはVisual Studio 2005、およびExcel 2003が使用できる環境。
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。
- 納品書.exe
- GrapeCity.Win.Input.v40.dll
- Interop.Excel.dll
- GrapeCity.Win.Input.Postal.v40.dll
- 納品書作成.xls
1.から4.のファイルは、同じフォルダに格納します。4.は、郵便番号から住所を探して表示するために使用します。
これらは、本稿で扱っているInputMan for .NET 4.0Jのコンポーネントを格納しているランタイムライブラリです。
また、5.のファイルをドライブCのルートにおいてください。納品書を作成するExcelのブックです。
GUIの作成(1/2)
GUIのほとんどは、InputMan for .NET 4.0Jのコントロールを使用します。
コントロールの追加
InputMan for .NET 4.0Jをインストールしたら、ツールボックスに専用のタブを作成し、InputMan for .NET 4.0Jのコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「GrapeCity.Win.Input」のコンポーネントです。
データの入力部分は、まずコンテナコントロールを配置し、そこに郵便番号コントロール、テキストボックス、キャラクタボックス、IMEコンポーネントを配置していきます。
IMEコンポーネントは、各コントロールにフリガナの機能を追加するコンポーネントなので、フォームの外に配置されます。
コンテナの配置とキャプションの設定
前回同様、各コントロールは、コンテナコントロールの中に配置します。コンテナは顧客情報の入力と購入品の入力の2つにわけ、Enabled
プロパティをFalseに設定しておきます。これで、プログラム起動時は、コンテナ内のコントロールはすべて無効状態になります。
また、コンテナコントロールのキャプション設定機能を使って、各コントロールにキャプションを設定します。
各コントロールの「キャプションスタイルの設定」で、キャプションの配置位置やテキストのエフェクトを自由に設定してください。
氏名とフリガナの入力設定
氏名入力用テキストボックスに漢字を入力すると、自動的にフリガナ用のテキストボックスにフリガナが入るようにします。
この機能は、IMEコンポーネントのフリガナ自動変換機能を使用します。
設定はいたって簡単で、フォームにIMEコンポーネントを配置すると、テキストボックスに[Ime1のReadingStringOutput]というプロパティが追加されます。このプロパティを展開し、[TargetControl]でフリガナを挿入したいコントロールを選択するだけです。あとの仕事は全部IMEコンポーネントが行ってくれます。
郵便番号の入力設定
郵便番号コントロールは、郵便番号用のマスク入力とDB Entry .NETの住所検索エンジンによる住所データ取得機能を利用して、入力された郵便番号から住所を検索し表示します。
Format
プロパティで、入力の際に表示する書式文字列を選べます。
入力した郵便番号から変換した住所をどのコントロールに転送するのかは、BuddyKanji
プロパティで指定します。また、フリガナ変換も同時に行うことができ、BuddyKana
プロパティでフリガナを表示するコントロールを指定します。
電話番号の入力設定
電話番号の入力には、キャラクタボックスコントロールを使用します。このコントロールは、入力インターフェイスにマス目を表示し、矢印キーを押さなくても連続してマス目に数値や文字を入力することができます。
マス目の追加やサイズ、枠線の設定などは、コントロールのタスクリストから[マス目を設定]を選んで行います。
また、入力規則の設定もでき、コントロールのタスクリストから[書式を設定]を選んで行います。書式はリストから選ぶと単一の書式が設定され、[カスタム書式の設定]欄で複数の書式を組み合わせることができます。
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とのコラボレーションでプログラムを組み立てると開発が楽になると思います。