【vb.net】ひな型エクセルマクロファイル(.xlsm)を元に帳票出力する簡易サンプル

VB.NET

ひな型エクセルマクロファイル(.xlsm)を元に.xlsm形式で帳票出力を行うサンプルとなります。APIはMicrosoft.Office.Interop.Excelを使用します。

以下の設定がひな型ファイル側でされていても、出力ファイル側で引き継げていることを確認しています。

  • ズーム設定
  • 文字フォント
  • 文字サイズ
  • 文字の色
  • セルの書式設定(#,##0;[赤]-#,##0)
  • セルの計算式
  • コマンドボタン
  • シート裏に書いたVBAソース
  • 標準モジュールに書いたVBAソース

動作確認環境

確認環境

  • VisualStudio2022
  • Windows10(x64)
  • .NET Framework4.8
  • Windowsフォームアプリケーション

サンプルの完成イメージ

操作画面

テキストボックスのオブジェクト名はtxtOutFolder、ボタンの名前はButton1としています。

ひな型ファイルのイメージ

D:\TenmleteFiles\Template.xlsmをひな型ファイルとする
内容は省略するが、ひな型ファイル側で書式設定やズーム設定などもしている
VBAソースコードが書かれている

出力ファイルのイメージ

“D:¥OutPut”へ出力することにする。ファイル名には現在時刻の年月日時分秒を使用する。
ひな型の”テンプレート1”シートを”出力1”、”テンプレート2”シートを”出力2”、としたうえで出力する
VBAソースも反映されている

サンプルのソースコード

まず、Microsoft.Office.Interop.Excelをインストールする必要があります。NuGetなどを使ってまずインストールを行ってください。

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)

これでよいと思います。

タイトルとURLをコピーしました