SHOEISHA iD

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

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

ComponentZine(InputMan)

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

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

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

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とのコラボレーションでプログラムを組み立てると開発が楽になると思います。

 

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

  • このエントリーをはてなブックマークに追加
ComponentZine(InputMan)連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング