ひな型エクセルマクロファイル(.xlsm)を元に.xlsm形式で帳票出力を行うサンプルとなります。APIはMicrosoft.Office.Interop.Excelを使用します。
以下の設定がひな型ファイル側でされていても、出力ファイル側で引き継げていることを確認しています。
- ズーム設定
- 文字フォント
- 文字サイズ
- 文字の色
- セルの書式設定(#,##0;[赤]-#,##0)
- セルの計算式
- コマンドボタン
- シート裏に書いたVBAソース
- 標準モジュールに書いたVBAソース
動作確認環境
確認環境
- VisualStudio2022
- Windows10(x64)
- .NET Framework4.8
- Windowsフォームアプリケーション
サンプルの完成イメージ
操作画面
テキストボックスのオブジェクト名はtxtOutFolder、ボタンの名前はButton1としています。
ひな型ファイルのイメージ
出力ファイルのイメージ
サンプルのソースコード
Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices
Public Class Form1
Public Const TEMPLATE = "D:\TenmleteFiles\Template.xlsm"
Public Const OUTFOLDER = "D:\OutPut"
''' <summary>
''' 画面読み込み時の処理を行います。
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
txtOutFolder.Text = OUTFOLDER
End Sub
''' <summary>
''' [出力]ボタンクリック時の処理を行います。
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim strOutFileName As String = ""
Dim xlsApplication As Excel.Application = Nothing
Dim xlsWorkbooks As Excel.Workbooks = Nothing
Dim xlsWorkbook As Excel.Workbook = Nothing
Dim xlsSheets As Excel.Sheets = Nothing
Dim xlsWorkSheet1 As Excel.Worksheet = Nothing
Dim xlsRange1 As Excel.Range = Nothing
Dim xlsWorkSheet2 As Excel.Worksheet = Nothing
Dim xlsRange2 As Excel.Range = Nothing
Try
strOutFileName = txtOutFolder.Text & "\" & DateTime.Now.ToString("yyyyMMdd-HHmmss") & ".xlsm"
'Excelアプリケーションを起動
xlsApplication = New Excel.Application
xlsApplication.Visible = False
xlsApplication.DisplayAlerts = False
'Workbooksオブジェクトを生成
xlsWorkbooks = xlsApplication.Workbooks
'ブック1への書き込み
xlsWorkbook = xlsWorkbooks.Open(TEMPLATE)
xlsSheets = xlsWorkbook.Sheets
'ブック1のシート1への書き込み
xlsWorkSheet1 = xlsSheets.Item("テンプレート1")
xlsWorkSheet1.Name = "出力1"
xlsRange1 = xlsWorkSheet1.Cells()
xlsRange1(1, 2) = "TEST PJ 1"
xlsRange1(4, 1) = 1
xlsRange1(4, 2) = "1111"
xlsRange1(5, 1) = 1234
xlsRange1(6, 1) = -1234
xlsRange1(7, 2) = -12
xlsRange1(7, 3) = -24
xlsRange1(7, 4) = 48
'ブック1のシート2への書き込み
xlsWorkSheet2 = xlsSheets.Item("テンプレート2")
xlsWorkSheet2.Name = "出力2"
xlsRange2 = xlsWorkSheet2.Cells()
xlsRange2(1, 2) = "TEST PJ 2"
xlsRange2(4, 1) = 2
xlsRange2(4, 2) = "2222"
'xksm形式で名前をつけて保存
xlsWorkbook.SaveAs(Filename:=strOutFileName, FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled)
MessageBox.Show("完了しました")
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
'Rangeオブジェクトの解放
Marshal.ReleaseComObject(xlsRange1)
Marshal.ReleaseComObject(xlsRange2)
'WorkSheetオブジェクトの解放
Marshal.ReleaseComObject(xlsWorkSheet1)
Marshal.ReleaseComObject(xlsWorkSheet2)
'Sheetsオブジェクトの解放
Marshal.ReleaseComObject(xlsSheets)
'Workbookオブジェクトを解放
Marshal.ReleaseComObject(xlsWorkbook)
'Workbooksオブジェクトを解放
Marshal.ReleaseComObject(xlsWorkbooks)
'保存時の問合せダイアログ表示を有りに戻す
xlsApplication.DisplayAlerts = True
'Excelアプリケーションを閉じる
xlsApplication.Quit()
'Excel.Applicationオブジェクトを解放
Marshal.ReleaseComObject(xlsApplication)
End Try
End Sub
End Class
xlsx形式のひな型を用いてxlsx形式の帳票を出力したい場合
今回は.xlsm形式での出力サンプルでしたが、もしxlsx形式で出力したい場合は下記の手順に沿えば良いと思います。
手順1:”テンプレート1”、”テンプレート2”という名前のシートがある.xlsxファイルを用意する
手順2:ファイル名を”Template.xlsx”とし、”D:\TenmleteFiles”フォルダーへ配置する
手順3:上記のソースコードを以下のように変更してください。
6行目を以下のように編集する
Public Const TEMPLATE = "D:\TenmleteFiles\Template.xlsx"
38行目を以下のように編集する
strOutFileName = txtOutFolder.Text & "\" & DateTime.Now.ToString("yyyyMMdd-HHmmss") & ".xlsx"
73行目、74行目を以下のように編集する
'.xlsx形式で名前を付けて保存
xlsWorkbook.SaveAs(Filename:=strOutFileName, FileFormat:=Excel.XlFileFormat.xlOpenXMLWorkbook)
これでよいと思います。