Visual Basic から VBA マクロを動的に追加し、実行する方法


概要


Visual Basic から Office 製品のオートメーションを行う場合、サーバーのプロセス空間で実行できる Microsoft Visual Basic for Applications (VBA) モジュールにコードの一部を移動すると便利な場合があります。これにより、アプリケーションの全体的な実行速度が向上することがあります。また、インプロセスで呼び出しが行われ、サーバーのみで処理が実行される場合、問題を低減するのに役立ちます。

この資料では、実行中の Office アプリケーションに Visual Basic から VBA モジュールを動的に追加し、ワークシートに入力を行うマクロをインプロセスで呼び出す方法について説明します。

詳細


以下の例では、Microsoft Excel にコード モジュールを挿入する方法について説明しますが、Word および PowerPoint には同じ VBA エンジンが組み込まれているため、これらのプログラムでも同様の手法を使用できます。



この例では、Excel に挿入するコード モジュールとして静的なテキスト ファイルを使用します。コードをリソース ファイルに移動し、コンパイルしてアプリケーションを生成し、実行時に必要に応じて一時ファイルに抽出することもできます。このようにすると、プロジェクトの再配布の管理に役立ちます。



Microsoft Office XP 以降、VBA を操作するために記述されたオートメーション コードを実行するには、VBA オブジェクト モデルに対するアクセスをユーザーが許可している必要があります。これは、Office XP の新しいセキュリティ機能です。関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。

282830 プログラムから Office VBA プロジェクトへのアクセスが拒否される

サンプル プロジェクトをビルドする

  1. まず、新しいテキスト ファイルを作成し、KbTest.bas という名前を付けます (.txt 拡張子は付けません)。これは、実行時に Excel に挿入するコード モジュールです。

  2. テキスト ファイルに、以下のコードを追加します。

       Attribute VB_Name = "KbTest"

    ' Your Microsoft Visual Basic for Applications macro function takes 1
    ' parameter, the sheet object that you are going to fill.

    Public Sub DoKbTest(oSheetToFill As Object)
    Dim i As Integer, j As Integer
    Dim sMsg As String
    For i = 1 To 100
    For j = 1 To 10

    sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
    oSheetToFill.Cells(i, j).Value = sMsg
    Next j
    Next i
    End Sub
  3. このテキスト ファイルを C:\KbTest.bas ディレクトリに保存し、ファイルを閉じます。

  4. Visual Basic を起動し、標準 EXE プロジェクトを作成します。デフォルトで Form1 が作成されます。

  5. [プロジェクト] メニューの [参照設定] をクリックし、適切なバージョンのタイプ ライブラリを選択します。これにより、Excel への事前バインディングを使用できるようになります。



    たとえば、以下のいずれかを選択します。

    • Microsoft Office Excel 2007 の場合、12.0 ライブラリを選択します。

    • Microsoft Office Excel 2003 の場合、11.0 ライブラリを選択します。

    • Microsoft Excel 2002 の場合、10.0 ライブラリを選択します。

    • Microsoft Excel 2000 の場合、9.0 ライブラリを選択します。

    • Microsoft Excel 97 の場合、8.0 ライブラリを選択します。

  6. Form1 にボタンを追加します。追加したボタンの Click イベントのハンドラに以下のコードを追加します。

       Private Sub Command1_Click()
    Dim oXL As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim i As Integer, j As Integer
    Dim sMsg As String

    ' Create a new instance of Excel and make it visible.
    Set oXL = CreateObject("Excel.Application")
    oXL.Visible = True

    ' Add a new workbook and set a reference to Sheet1.
    Set oBook = oXL.Workbooks.Add
    Set oSheet = oBook.Sheets(1)

    ' Demo standard Automation from out-of-process,
    ' this routine simply fills in values of cells.
    sMsg = "Fill the sheet from out-of-process"
    MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    For i = 1 To 100
    For j = 1 To 10
    sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
    oSheet.Cells(i, j).Value = sMsg
    Next j
    Next i

    ' You're done with the first test, now switch sheets
    ' and run the same routine via an inserted Microsoft Visual Basic
    ' for Applications macro.
    MsgBox "Done.", vbMsgBoxSetForeground
    Set oSheet = oBook.Sheets.Add
    oSheet.Activate

    sMsg = "Fill the sheet from in-process"
    MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    ' The Import method lets you add modules to VBA at
    ' run time. Change the file path to match the location
    ' of the text file you created in step 3.
    oXL.VBE.ActiveVBProject.VBComponents.Import "C:\KbTest.bas"

    ' Now run the macro, passing oSheet as the first parameter
    oXL.Run "DoKbTest", oSheet

    ' You're done with the second test
    MsgBox "Done.", vbMsgBoxSetForeground

    ' Turn instance of Excel over to end user and release
    ' any outstanding object references.
    oXL.UserControl = True
    Set oSheet = Nothing
    Set oBook = Nothing
    Set oXL = Nothing

    End Sub
  7. Excel 2002 およびそれ以降のバージョンの Excel では、VBA プロジェクトへのアクセスを有効にする必要があります。この設定を行うには、以下のいずれかの方法を使用します。

    • Excel 2007 の場合、Microsoft Office ボタンをクリックし、[Excel のオプション] をクリックします。[セキュリティ センター] をクリックし、[セキュリティ センターの設定] をクリックします。[マクロの設定] をクリックし、[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する] チェック ボックスをオンにし、[OK] を 2 度クリックします。
    • Excel 2003 およびそれ以前のバージョンの Excel の場合、[ツール] メニューの [マクロ] をポイントし、[セキュリティ] をクリックします。[セキュリティ] ダイアログ ボックスで、[信頼のおける発行元] タブをクリックし、[Visual Basic プロジェクトへのアクセスを信頼する] チェック ボックスをオンにします。

  8. Visual Basic プロジェクトを実行します。

関連情報


Visual Basic を使用した Office オートメーションの詳細については、次の Office Development サポート サイトを参照してください。