今までだったらFileMakerとかでちょちょいと済ませるのだけど、ちょうどいいネタだったのでVB.NET+VB-Reportでやってみた。
作成したのは合計請求書(請求書の表紙)を印刷する簡単なプログラム
・帳票レイアウトの作成
Excelを使って使う帳票レイアウトを作成する。
今回はこんな感じ
・Formを作成する
VisualStudioでプロジェクトを作ってFormを作成する。
・コードを書く
コード書く前に下準備として
「参照の追加」でをやっておく
を追加
- VBReport.dll
- VBReport.XlsCrt.dll
- VBReport.XlsPDF.dll
- VBReport.XlsReportCtrl.dll
「追加」-「既存の項目」で
を追加
- msvcr71.dll
「追加」-「既存の項目」で作成したExcelの帳票レイアウトファイルを追加する。
[ビルドアクション]を[埋め込まれたリソース]にする。
次のコードをFormに書く
Public Class FormMain
Private Sub FormMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'-----予期しない例外はトラップして継続実行させる-----
AddHandler Application.ThreadException, AddressOf CommonLib.ErrorTrap_ApplicationError_Resume
'----------------------------------------------------
AddHandler tb今回請求金額.Validating, AddressOf CommonLib.tb_Validating_Integer
AddHandler tb1行目.Enter, AddressOf CommonLib.tb_Enter
AddHandler tb2行目.Enter, AddressOf CommonLib.tb_Enter
AddHandler tb今回請求金額.Enter, AddressOf CommonLib.tb_Enter
AddHandler tb1行目.Leave, AddressOf CommonLib.tb_Leave
AddHandler tb2行目.Leave, AddressOf CommonLib.tb_Leave
AddHandler tb今回請求金額.Leave, AddressOf CommonLib.tb_Leave
Call FormClear()
End Sub
Private Sub FormMain_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
Me.KeyPreview = True
Call FormClear()
End Sub
Private Sub FormKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
'Enterキーで次のコントロールにフォーカスする
If e.KeyCode = Keys.Enter Then
Me.ProcessTabKey(True)
End If
End Sub
Private Sub btn発行_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn発行.Click
Call 出力_合計請求書()
End Sub
Private Sub btnクリア_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnクリア.Click
Call FormClear()
End Sub
Private Sub FormClear()
cb月限.SelectedIndex = 0
dtp発行日.Value = System.DateTime.Today
tb1行目.Text = ""
tb2行目.Text = ""
tb今回請求金額.Text = ""
tb1行目.Visible = False
tb2行目.Focus()
End Sub
Private Sub 出力_合計請求書()
'-----和暦の処理-----
Dim Japan As New System.Globalization.JapaneseCalendar
'--------------------
'-----ルート名前空間を取得する-----
'埋め込まれたリソース(印刷用レイアウトファイル)を利用するために必要
Dim AppNameSpace As String
Dim type As System.Type
type = Me.GetType()
AppNameSpace = type.Namespace
Dim EmbedFileName As String = AppNameSpace & ".PrintForm.xls"
'----------------------------------
Dim rptCtrl As New VBReport.XlsReportCtrl.XlsReportCtrl
Dim srmExcelFile As System.IO.Stream = Nothing
Dim str出力プリンタ As String = ""
Try
'印刷用Layout定義
rptCtrl.CtrlMode = VBReport.XlsReportCtrl.xlCtrlMode.cmHide
rptCtrl.Option.ExcelMode = True
rptCtrl.Printer.ColorMode = True
rptCtrl.Option.ProgressDialog = False
'埋め込まれたリソースの使用
Dim asmExcelFile As System.Reflection.Assembly
asmExcelFile = System.Reflection.Assembly.GetExecutingAssembly
srmExcelFile = asmExcelFile.GetManifestResourceStream(EmbedFileName)
'プリンタ設定
If rptCtrl.Option.SetPrinter(True, "") = False Then
Exit Sub
End If
'ページを開始
rptCtrl.Start.Embed(srmExcelFile)
rptCtrl.Page.Begin("合計請求書", "1")
If cb月限.Text.Length = 0 Then
'何もしない
Else
rptCtrl.Cell("D5").Value = " " & cb月限.Text & "月限"
End If
rptCtrl.Cell("AZ5").Value = "平成 " & Japan.GetYear(dtp発行日.Value) & " 年 " & dtp発行日.Value.Month.ToString.PadLeft(2) & " 月 " & dtp発行日.Value.Day.ToString.PadLeft(2) & " 日"
rptCtrl.Cell("D7").Value = tb1行目.Text & vbNewLine & tb2行目.Text
rptCtrl.Cell("P12").Value = "\" & CDec(tb今回請求金額.Text).ToString("#,##0") & "."
'印刷する
rptCtrl.Page.End()
rptCtrl.Out.DoPrint("合計請求書")
Catch ex As Exception
MsgBox(ex.Message)
Finally
rptCtrl.Dispose()
' 読み込んだリソースを閉じる
srmExcelFile.Close()
End Try
End Sub
Private Sub tb2行目_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles tb2行目.Validated
If tb2行目.Text.Length >= 14 Then
If MsgBox("印刷すると文字が切れてしまうかもしれません。" & "2行に分けますか?", DirectCast(MsgBoxStyle.Information + MsgBoxStyle.YesNo, MsgBoxStyle), "") = MsgBoxResult.Yes Then
tb1行目.Visible = True
tb1行目.Text = tb2行目.Text.Substring(0, 14)
tb2行目.Text = tb2行目.Text.Substring(13)
tb2行目.Focus()
End If
End If
End Sub
End Class
・ビルドして配布
あとはビルドして、プロジェクトのフォルダの中の\bin\Releaseをコピーして実行環境にコピーするだけ
Installerを書くまでもなし
・まとめ
慣れると意外と簡単(レイアウト作成も含めて約1時間)
少し手を入れたらmdbファイルか、XMLファイルに発行履歴も簡単に残せるんだけど、お金にならないのであまり手間をかけないのをモットーに