VB2005からVBAマクロの呼び出し方

Last-modified: 2012-03-12 (月) 12:24:28
amazon.gif

経緯

 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で制御する。
  •  VBA側のプログラムの作成に関して
    •  マクロは標準モジュール内にプログラムを書く。
    •  終了処理(エクセルを閉じる)は、VB2005側で書くこと。
  • ActiveXコントロールを有効にしておくこと。
    このアプリケーションは、安全でない可能性のある ActiveX コントロールを初期化しようとしています。
    このドキュメントの提供元が信頼できる場合は、[はい] をクリックしてください。コントロールはドキュメントの設定を使用して初期化されます。
    などのメッセージがでる時は、これがでないようにしておく。 -->> ActiveX コントロールを初期化しようとしています。 参照
  •  その他・課題。
    •  エクセルのOpneに失敗した時 や 
      OpenしたままCloseしないでプログラムを終えた時(VBAマクロ側のエラーなどでデバッグエラーとかでエクセルを終了した時)などは、
      デスクトップ上では一見エクセルが見えないがタスクマネージャのプロセスの中に、
      EXCEL.exeが残っている場合があるのでExcel.exeを選び「プロセスの終了」を押してExcel.exeを終了しないと。
      終了しないとPCが終了できない。 (T-T
  • 2個以上の印刷マクロを同時に実行すると・・・
     例えば、印刷マクロ1はのプリンタA、
         印刷マクロ2はのプリンタBに印刷しようとした時に。

マクロ1,2がそれぞれ別に動いている時は問題なく印刷できるのだが。同時に実行すると(印刷処理のタイミングが同じになると?)、
マクロ1がプリンタBから、マクロ2がプリンタAから印刷される現象が発生した。
私の単純のミスなのか?エクセルのそういう仕様なのか?この印刷マクロを2個以上を使う場合は考慮にいれておくべきかと。

 
amazon.gif

ソース

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

サイト内リンク