経緯
VB2005でエクセルのマクロを呼出して印刷(バーコードつき)でやります。でもCrystalReportsは使いにくいし印刷専用コンポーネントは高いから・・・・とあくまで逃げの策ですので。本来はGrapeCity社などの専用の印刷コンポーネントを使ったほうが良いです。
開発環境
- VB2005 Pro SP1
- Office2003 ExcelVBA
注意点
- 環境の確認 - インストールの順番 ( Office → VS2005)
- Officeをインストール後にVS2005をインストールすること。ついでにSP1もあてておくこと。
- VS2005を入れてからOfficeのバージョンをあげるないほうが無難・・・(2002-->2003)
- COM オブジェクトの追加の際に、OfficeのバージョンアップをIDE側で反映しにくい。
- VB2005に関して
- COM オブジェクトの追加 (VB2005で開発モードで、プロジェクト → 参照の追加 → COMの追加)
Excel 2003の場合は「Microsoft Excel 11.0 Object Library」を選択する。
Excelファイルにアクセスするには? - Excelを開く・閉じる処理はVB2005で制御する。
- COM オブジェクトの追加 (VB2005で開発モードで、プロジェクト → 参照の追加 → COMの追加)
- VBA側のプログラムの作成に関して
- マクロは標準モジュール内にプログラムを書く。
- 終了処理(エクセルを閉じる)は、VB2005側で書くこと。
- ActiveXコントロールを有効にしておくこと。
このアプリケーションは、安全でない可能性のある ActiveX コントロールを初期化しようとしています。
このドキュメントの提供元が信頼できる場合は、[はい] をクリックしてください。コントロールはドキュメントの設定を使用して初期化されます。
などのメッセージがでる時は、これがでないようにしておく。 -->> ActiveX コントロールを初期化しようとしています。 参照
- その他・課題。
- エクセルのOpneに失敗した時 や
OpenしたままCloseしないでプログラムを終えた時(VBAマクロ側のエラーなどでデバッグエラーとかでエクセルを終了した時)などは、
デスクトップ上では一見エクセルが見えないがタスクマネージャのプロセスの中に、
EXCEL.exeが残っている場合があるのでExcel.exeを選び「プロセスの終了」を押してExcel.exeを終了しないと。
終了しないとPCが終了できない。
- エクセルのOpneに失敗した時 や
- 2個以上の印刷マクロを同時に実行すると・・・
例えば、印刷マクロ1はのプリンタA、
印刷マクロ2はのプリンタBに印刷しようとした時に。
マクロ1,2がそれぞれ別に動いている時は問題なく印刷できるのだが。同時に実行すると(印刷処理のタイミングが同じになると?)、
マクロ1がプリンタBから、マクロ2がプリンタAから印刷される現象が発生した。
私の単純のミスなのか?エクセルのそういう仕様なのか?この印刷マクロを2個以上を使う場合は考慮にいれておくべきかと。
ソース
VB2005からマクロを呼び出す
Imports Microsoft.Office.Interop ' Office2000ではニエラーだった。2003では問題なし。
Public Class Form1
Dim Fname As String = "C:\PrintBoxList.xls" 'マクロ
Dim ReadFname As String = "C:\Test.csv" '読み込むファイル
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
' Excel.Application の新しいインスタンスを生成する
Dim xlApplication As New Excel.Application()
Dim xlBooks As Excel.Workbooks
' xlApplication から WorkBooks を取得する
xlBooks = xlApplication.Workbooks
' 既存の Excel ブックを開く
xlBooks.Open(Fname)
' Excel を表示する
xlApplication.Visible = True
'*******************************************************************************************
' (VBA側のプログラムは、標準モジュールの中に書くべし、ThisWorkBook内では駄目だった)
'*******************************************************************************************
' マクロの実行
xlApplication.Run("'" & Fname & "'!module1.PG_RUN", ReadFname) '引数をもつ処理の呼び出し方法
' Excel を終了する
xlApplication.Quit()
' COM オブジェクトの参照カウントを解放する
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApplication)
End Sub
End Class
参考URL
- 基本的な部分は下記を参考にした (謝謝各位)
C#,VB.Net入門
Okwave
Excelファイルにアクセスするには?
- Office XP または Office 2003 ドキュメントを開くときに ActiveX コントロールにアクセス許可を設定するように求められる
http://support.microsoft.com/kb/827742/ja