SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(InputMan)

Excel形式の納品書を作成する入力支援フォーム

InputMan for .NET 4.0Jを使ったExcel入力フォームの作成:その2

  • このエントリーをはてなブックマークに追加

 前回に引き続き、InputMan for .NET 4.0J Windows Forms Editionのコントロール群から、キャラクタボックス、日付、数値、郵便番号、エディット、コンテナの各コントロールとIMEコンポーネントを使い、Excelで納品書を作成するための入力フォームプログラムを作成してみました。

  • このエントリーをはてなブックマークに追加
入力内容をExcelに転送。郵便番号から住所とフリガナを自動入力
入力内容をExcelに転送。郵便番号から住所とフリガナを自動入力
Excelではワークシートをコピー・追加して納品書を作成
Excelではワークシートをコピー・追加して納品書を作成

はじめに

 「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ファイルに同梱してある以下のファイルが必要になります。

  1. 納品書.exe
  2. GrapeCity.Win.Input.v40.dll
  3. Interop.Excel.dll
  4. GrapeCity.Win.Input.Postal.v40.dll
  5. 納品書作成.xls

 1.から4.のファイルは、同じフォルダに格納します。4.は、郵便番号から住所を探して表示するために使用します。

 これらは、本稿で扱っているInputMan for .NET 4.0Jのコンポーネントを格納しているランタイムライブラリです。

 また、5.のファイルをドライブCのルートにおいてください。納品書を作成するExcelのブックです。

GUIの作成(1/2)

 GUIのほとんどは、InputMan for .NET 4.0Jのコントロールを使用します。

GUIの使用コントロール
 GUIの使用コントロール

コントロールの追加

 InputMan for .NET 4.0Jをインストールしたら、ツールボックスに専用のタブを作成し、InputMan for .NET 4.0Jのコンポーネントを追加します。追加するコンポーネントは、「.NET Frameworkコンポーネント」の「名前空間」が「GrapeCity.Win.Input」のコンポーネントです。

GrapeCity.Win.Input名前空間のコンポーネントを追加する
 GrapeCity.Win.Input名前空間のコンポーネントを追加する

 データの入力部分は、まずコンテナコントロールを配置し、そこに郵便番号コントロール、テキストボックス、キャラクタボックス、IMEコンポーネントを配置していきます。

 IMEコンポーネントは、各コントロールにフリガナの機能を追加するコンポーネントなので、フォームの外に配置されます。

コンテナの配置とキャプションの設定

 前回同様、各コントロールは、コンテナコントロールの中に配置します。コンテナは顧客情報の入力と購入品の入力の2つにわけ、EnabledプロパティをFalseに設定しておきます。これで、プログラム起動時は、コンテナ内のコントロールはすべて無効状態になります。

 また、コンテナコントロールのキャプション設定機能を使って、各コントロールにキャプションを設定します。

 各コントロールの「キャプションスタイルの設定」で、キャプションの配置位置やテキストのエフェクトを自由に設定してください。

氏名とフリガナの入力設定

 氏名入力用テキストボックスに漢字を入力すると、自動的にフリガナ用のテキストボックスにフリガナが入るようにします。

 この機能は、IMEコンポーネントのフリガナ自動変換機能を使用します。

 設定はいたって簡単で、フォームにIMEコンポーネントを配置すると、テキストボックスに[Ime1のReadingStringOutput]というプロパティが追加されます。このプロパティを展開し、[TargetControl]でフリガナを挿入したいコントロールを選択するだけです。あとの仕事は全部IMEコンポーネントが行ってくれます。

テキストボックスのReadingStringOutputプロパティ設定
テキストボックスのReadingStringOutputプロパティ設定
漢字のフリガナを自動的に変換して入力する
漢字のフリガナを自動的に変換して入力する

郵便番号の入力設定

 郵便番号コントロールは、郵便番号用のマスク入力とDB Entry .NETの住所検索エンジンによる住所データ取得機能を利用して、入力された郵便番号から住所を検索し表示します。

 Formatプロパティで、入力の際に表示する書式文字列を選べます。

書式選択ダイアログ
書式選択ダイアログ

 入力した郵便番号から変換した住所をどのコントロールに転送するのかは、BuddyKanjiプロパティで指定します。また、フリガナ変換も同時に行うことができ、BuddyKanaプロパティでフリガナを表示するコントロールを指定します。

郵便番号から住所とフリガナを自動入力できる
郵便番号から住所とフリガナを自動入力できる

電話番号の入力設定

 電話番号の入力には、キャラクタボックスコントロールを使用します。このコントロールは、入力インターフェイスにマス目を表示し、矢印キーを押さなくても連続してマス目に数値や文字を入力することができます。

 マス目の追加やサイズ、枠線の設定などは、コントロールのタスクリストから[マス目を設定]を選んで行います。

[マス目を設定]ダイアログでマス目の数や形状を設定する
[マス目を設定]ダイアログでマス目の数や形状を設定する

 また、入力規則の設定もでき、コントロールのタスクリストから[書式を設定]を選んで行います。書式はリストから選ぶと単一の書式が設定され、[カスタム書式の設定]欄で複数の書式を組み合わせることができます。

入力規則の書式を設定する
入力規則の書式を設定する

GUIの作成(2/2)

日付の取得

 日付の取得は、日付コントロールを使用します。前回は、カレンダーで日付を取得しましたが、日付コントロールはこの簡易版のようなもので、エディット部分に直接入力してもかまいませんし、ドロップダウンボタンを押すとカレンダーが表示されるので、ここから選ぶこともできます。

ドロップダウンボタンでカレンダーが表示される
ドロップダウンボタンでカレンダーが表示される

個数と単価の入力設定

 数量はVS標準のNumericUpDownコントロールで入力します。

 単価は、InputMan for .NET 4.0Jの数値コントロールを使用します。このコントロールは、数値入力専用のコントロールで、エディット部分に直接数値を入力しますが、ドロップダウンボタンを押すと電卓が表示される、面白いコントロールです。

 例えば、単価の割引率が設定されている場合などは、入力の手元で電卓が使えるため、意外と便利な使い方ができます。

入力の際に電卓で計算を行う場合などは便利
入力の際に電卓で計算を行う場合などは便利

納品書番号の入力設定

 納品書番号の入力は、キャラクタボックスを使用します。

 ここでは、納品書番号を「a000000000」と半角小文字の英字と数字を組み合わせるようにしているので、入力書式もこのスタイルになるように設定しています。

半角小文字の英字と数字のみ入力可能
半角小文字の英字と数字のみ入力可能

コードの実装

 コードでは、納品書番号を入力し[新規入力]ボタンを押した時点で、あらかじめフォームを作成してあるワークシートをコピーし、この納品書番号をワークシートの名前にして作成するようにしています。

処理の流れ

 簡単に処理の流れをまとめておきます。

  1. フォーム起動時にExcelのインスタンスを作成し、ブックを開きます。
  2.  
  3. 納品書番号を入力し[新規入力]ボタンを押すと、あらかじめ納品書のフォームを作成してあるワークシート「原紙」をコピーし、ワークシート名を納品書番号に変更すると同時に、2つのコンテナのEnabledプロパティをTrueに変更し、各コントロールの入力を可能にします。
  4.  
  5. [転送]ボタンを押すと、顧客情報と購入品目をワークシートに転送します。このとき、顧客情報は[転送]ボタンを最初に押した時だけしか転送しないようにし、納品書番号の2重入力を防ぐために納品書番号の入力をクリアしておきます。
  6. そして、2回目から[転送]ボタンを押したときは、購入品目だけを転送するようにします。
     
  7. プログラム終了時に、Excelのブックを保存しExcelを終了します。

コードの作成

 では、順番にコードを作成していきましょう。

名前空間のインポートと参照設定

 コードの冒頭で、InputMan for .NET 4.0Jの各コントロールを使用するので、GrapeCity.Win.Input名前空間をインポートしてください。

Imports GrapeCity.Win.Input

 また、Excelのインスタンスを作成しますので、Excelへの参照設定を行う必要があります。

 参照設定は、次の方法で行います。

  1. メニューから[プロジェクト]-[参照の追加]を選びます。
  2. [COM]タブをクリックし、リストから[Microsoft Excel 5.0 Object Library]を選びます。

Excelの表示

 モジュールレベルでExcelのインスタンスへの参照を格納する変数「ex」と、ワークシート作成の有無を判断する変数「flag」を宣言します。

Public Class Form1
    Dim ex As Object
    Dim flag As Boolean = False
コラム
 前回はこの変数「ex」を、「Excel.Application」というデータ型で宣言しました。
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
 ※この操作は、Excel 2003までです。Excel 2007(ベータ2)では、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とのコラボレーションでプログラムを組み立てると開発が楽になると思います。

 

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/498 2009/03/17 11:51

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング