VB ActiveX コンポーネントを使用して Internet Explorer から Word オートメーションを使用する方法

文書翻訳 文書翻訳
文書番号: 286023 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Internet Explorer に表示される Web ページから、Word のクライアントサイド オートメーションに ActiveX コンポーネントを使用する方法を説明します。Web ページ自体に埋め込んだスクリプトを使用する代わりに、Web ページから ActiveX コンポーネントを使用することには、いくつかの利点があります。
  • Microsoft Word のオートメーションを行う Visual Basic コードが既にある場合、Visual Basic プロジェクトを ActiveX EXE または ActiveX DLL に変換することで、そのコードをブラウザで再利用できます。
  • Word は、スクリプトを実行しても安全だとマークされていません。Internet Explorer のセキュリティ設定によっては、スクリプト内の Word オートメーションのコードが実行されないことや、ユーザーに対してセキュリティ警告が表示されることがあります。ActiveX コンポーネントがある一定のガイドラインを満たしている場合、スクリプトを実行しても安全だとマークされ、これらのセキュリティ上の問題は発生しません。
  • Visual Basic には、Web ページのスクリプトでは使用できない機能がいくつかあります。Visual Basic では使用できて Web ページのスクリプトでは使用できない機能の 1 つの例として、Windows API (アプリケーション プログラミング インターフェイス) の呼び出しがあります。
外部ソースからのデータやロジックを使用して、Word 文書を作成するためのインターフェイスとして Web ページをユーザーに表示するという方法は、よく用いられる開発手法です。サーバーサイドの Word オートメーションを使用して文書を生成し、クライアントにストリームとして送り返すことはできますが、Word オートメーションを利用したサーバーサイドの実装には多数の欠点があります。主な欠点はスケーラビリティです。Word は、リソース使用率の高いオートメーション サーバーであり、Web サーバーでのドキュメントの生成にはお勧めできません。

ActiveX コンポーネントを使用して、ドキュメントの生成をクライアント上で実行することで、リソース使用率の高い Word オートメーションを Web サーバーから切り離すことができます。これが、この資料で説明するサンプル ActiveX コンポーネントで使用しているソリューションです。このサンプルは Word オートメーションに特化されていますが、Microsoft Excel など、Word 以外の Microsoft Office アプリケーションでも基本的な原理は同じです。

詳細

サンプルのダウンロード

AutoWord.exe には、この資料で説明する Visual Basic の ActiveX DLL プロジェクト、Word 文書、および Web ページが含まれています。

下記のファイルは、「Microsoft ダウンロード センター」からダウンロードできます。
Autoword.exe
リリース日 : 2001 年 4 月 17 日

マイクロソフトのサポート ファイルのダウンロード方法を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
119591 オンライン サービスからマイクロソフトのサポート ファイルを入手する方法
マイクロソフトでは、アップロード時点の最新のウイルス検査プログラムを使用して、配布ファイルのウイルス チェックを行っています。配布ファイルはセキュリティで保護されたサーバー上に置かれており、権限のない第三者が無断でファイルを変更できないようになっています。

サンプルのセットアップ

Autoword.exe をダウンロードした後、次の手順を実行してサンプルをセットアップします。
  1. Web サーバーの仮想ルート ディレクトリに Invoice という名前でフォルダを作成します (デフォルトの仮想ルート ディレクトリは C:\Inetpub\Wwwroot です)。
  2. Autoword.exe 内のファイルを Invoice フォルダに解凍します。
  3. Autoword1.htm をテキスト エディタか HTML エディタで開き、すべての URL 内の YourWebServer への参照を、実際の Web サーバーの名前に置き換えます。同様に、接続文字列中の YourSQLServer を、ノースウィンド サンプル データベースがある SQL Server の名前に置き換えます。

    : ノースウィンド サンプル データベースがある SQL Server が利用できない場合は、その代わりに Microsoft Access のノースウィンド サンプル データベースを使用するように接続文字列を変更することができます。以下は、Access のノースウィンド サンプル データベースに対する接続文字列の一例です。
    sConn = "provider=microsoft.jet.oledb.4.0; data source=" & _
            "C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb"
    					
  4. Autoword2.htm をテキスト エディタか HTML エディタで開き、すべての URL 内の YourWebServer への参照を、実際の Web サーバーの名前に置き換えます。
  5. Internet Explorer を起動します。http://YourWebServer/invoice/AutoWord1.htm および http://YourWebServer/invoice/AutoWord2.htm を参照することでスクリプトをテストできます (YourWebServer は使用する Web サーバーの名前です)。これらのページを初めて表示するときに、ActiveX コンポーネントをダウンロードするかどうかを確認するメッセージが表示されます。
このサンプルの Visual Basic ActiveX コンポーネントとスクリプトについては、この資料の以下の部分で詳しく説明します。

Visual Basic ActiveX コンポーネント

このサンプルの Visual Basic ActiveX コンポーネントは、Web ページ スクリプトと連携して、ユーザーの要求に応じて注文書を生成します。Web アプリケーションでは、ActiveX コンポーネントを使用して指定された注文 ID に対応した注文情報を取得することや、注文情報を XML としてパッケージ化し、ActiveX コンポーネントに送信して処理を行うことができます。いずれの場合でも、コンポーネントによって注文情報が取得された後、Word のオートメーションが行われて、注文に対応する注文書の生成と表示が行われます。

ActiveX コンポーネント (AutomateWord) に含まれているクラスは 1 つのみで、この Invoice というクラスでは、3 つのメソッドが公開されています。
  • GetData メソッドでは、ActiveX データ オブジェクト (ADO) を使用して、ノースウィンド サンプル データベース内の注文に関する情報を抽出します。注文情報は、m_Data プライベート メンバ変数に格納されます。GetData メソッドを呼び出すことで、クライアント側でデータの抽出が実行されます。
  • SendData メソッドでは、Microsoft XML (MSXML) を使用して、呼び出し側から渡された注文情報を m_Data プライベート メンバ変数に格納します。SendData メソッドは、注文情報を示す DOMDocument オブジェクトをパラメータとして受け取ります。SendData メソッドを呼び出して、注文情報を Web ページからコンポーネントに送信できます。この方法を使用することで、ASP を使用してサーバー側でデータを抽出し、ドキュメント生成に利用できる XML データ群をクライアントに提供できます。
  • MakeInvoice メソッドでは、Word オートメーションを使用して、m_Data プライベート メンバ変数の注文情報が含まれる文書が作成されます。注文書は、Web サーバーに格納されている文書を基に作成されます。呼び出し側は、完成した Word 文書をブラウザの外部で表示するか、後で使用するためにディスク上に保存するかを選択できます。
Invoice.cls
Option Explicit

Private Type InvoiceData
    OrderID As String
    OrderDate As Date
    CustID As String
    CustInfo As String
    ProdInfo As Variant
End Type

Private m_Data As InvoiceData

Public Sub GetData(sOrderID As Variant, sConn As Variant)

    Dim oConn As Object, oRS As Object
    
    'Connect to the Northwind database.
    Set oConn = CreateObject("ADODB.Connection")
    oConn.Open sConn
    
    'Obtain the Customer ID and Order Date.
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Open "Select [OrderDate], [CustomerID] from Orders where " & _
             "[OrderID]=" & sOrderID, oConn, 3 'adOpenStatic=3
    m_Data.OrderID = sOrderID
    m_Data.OrderDate = CDate(oRS.Fields("OrderDate").Value)
    m_Data.CustID = oRS.Fields("CustomerID").Value
    oRS.Close
    
    'Obtain Customer information.
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Open "Select * from Customers Where CustomerID='" & _
             m_Data.CustID & "'", oConn, 3 'adOpenStatic=3
    m_Data.CustInfo = oRS.Fields("CompanyName").Value & vbCrLf & _
                      oRS.Fields("City") & " "
    If Not (IsNull(oRS.Fields("Region"))) Then
       m_Data.CustInfo = m_Data.CustInfo & oRS.Fields("Region").Value & " "
    End If
    m_Data.CustInfo = m_Data.CustInfo & oRS.Fields("PostalCode").Value & _
                      vbCrLf & oRS.Fields("Country").Value
    oRS.Close
    
    'Obtain Product information.
    Set oRS = CreateObject("ADODB.Recordset")
    oRS.Open "Select ProductName, Quantity, [Order Details].UnitPrice," & _
             "Discount from Products Inner Join [Order Details] on " & _
             "Products.ProductID = [Order Details].ProductID " & _
             "Where OrderID = " & sOrderID, oConn, 3 'adOpenStatic=3
    m_Data.ProdInfo = oRS.GetRows
    oRS.Close
    
    'Close the connection to the database.
    oConn.Close

End Sub

Public Sub SendData(oXML As Variant)

    'Extract the information from the DOMDocument object oXML and store
    'it in the private member variable m_Data.

    m_Data.OrderID = oXML.getElementsByTagName("OrderID").Item(0).Text
    m_Data.OrderDate = oXML.getElementsByTagName("OrderDate").Item(0).Text
    m_Data.CustID = oXML.getElementsByTagName("CustID").Item(0).Text
    m_Data.CustInfo = oXML.getElementsByTagName("CustInfo").Item(0).Text
    
    Dim oItems As Object, oItem As Object
    Set oItems = oXML.getElementsByTagName("Items").Item(0)
    ReDim vArray(0 To 3, 0 To oItems.childNodes.Length - 1) As Variant
    Dim i As Integer
    For i = 0 To UBound(vArray, 2)
        Set oItem = oItems.childNodes(i)
        vArray(0, i) = oItem.getAttribute("Desc")
        vArray(1, i) = oItem.getAttribute("Qty")
        vArray(2, i) = oItem.getAttribute("Price")
        vArray(3, i) = oItem.getAttribute("Disc")
    Next
    m_Data.ProdInfo = vArray

End Sub

Public Sub MakeInvoice(sTemplate As Variant, Optional bSave As Variant)
    
    Dim oWord As Object
    Dim oDoc As Object
    Dim oTable As Object
    
    If IsMissing(bSave) Then bSave = False

    'Open the document as read-only.
    Set oWord = CreateObject("Word.Application")
    Set oDoc = oWord.Documents.Open(sTemplate, , True)
    
    'Fill in the bookmarks.
    oDoc.Bookmarks("Customer_Info").Range.Text = m_Data.CustInfo
    oDoc.Bookmarks("Customer_ID").Range.Text = m_Data.CustID
    oDoc.Bookmarks("Order_ID").Range.Text = m_Data.OrderID
    oDoc.Bookmarks("Order_Date").Range.Text = m_Data.OrderDate
    
    'Fill in the table with the product information.
    '** Note that the table starts out with three rows -- the first row
    '   contains headers for the table, the second row is for
    '   the first set of product data, and the third row contains a total.
    '   New rows are added for additional products before the "total row".

    Set oTable = oDoc.Tables(1)
    Dim r As Integer, c As Integer
    For r = 1 To UBound(m_Data.ProdInfo, 2) + 1
        If r > 1 Then oTable.Rows.Add (oTable.Rows(oTable.Rows.Count))
        For c = 1 To 4
            oTable.Cell(r + 1, c).Range.Text = _
               m_Data.ProdInfo(c - 1, r - 1)
        Next
        oTable.Cell(r + 1, 5).Formula _
            "=(B" & r + 1 & "*C" & r + 1 & ")*(1-D" & r + 1 & ")", _
            "#,##0.00"
    Next

    'Update the field for the grand total and protect the document.
    oTable.Cell(oTable.Rows.Count, 5).Range.Fields.Update
    oDoc.Protect 1 'wdAllowOnlyComments=1
        
    If bSave Then
        'Save the document as "c:\invoice.doc" and quit Word.
        Dim nResult As Long
        nResult = MsgBox("Are you sure you wish to create the document" & _
             " ""c:\invoice.doc""? If this document already exists, " & _
             "it will be replaced", vbYesNo, "AutomateWord")
        If nResult = vbYes Then oDoc.SaveAs "c:\invoice.doc"
        oDoc.Close False
        oWord.Quit
    Else
        'Make Word visible.
        oWord.Visible = True
    End If
    
End Sub
				

Web ページからの ActiveX コンポーネントの使用

Autoword1.htm は、GetData メソッドを使用して、ActiveX コンポーネントからクライアント側で注文データを抽出して文書を作成する方法を示したものです。

Autoword1.htm
<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="http://YourWebServer/invoice/package/AutomateWord.CAB#version=1,0,0,0">
   </OBJECT>
</HEAD>
<BODY>
Enter an order id between 10248 and 11077 and click the button to view the invoice for the order:
<P/><INPUT TYPE="text" VALUE="10500" ID="OrderID">
<P/><BUTTON ID="InvoiceButton">Create Invoice</BUTTON>
</BODY>

<SCRIPT Language="VBScript">

   Function InvoiceButton_OnClick()
      Dim sConn
      sConn = "Provider=sqloledb;Data Source=YourSQLServer;Initial Catalog=Northwind;UID=sa;"
      AutoWord.GetData OrderID.Value, sConn
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>
				
Autoword1.htm のスクリプトでは、ActiveX コンポーネントを使用して、完成した文書をブラウザの外部で表示します。完成した文書を保存してブラウザで表示することもできますが、これを行うには、Word 文書をディスクに保存する必要があります。このコンポーネントでは、文書を C:\Invoice.doc としてクライアントのローカル ドライブに保存できます。ActiveX コンポーネントはスクリプトを実行しても安全だとマークされているため、クライアントでは保存するかどうかを確認するメッセージが表示されます。

完成した文書をブラウザ内で表示する場合は、Autoword1.htm にある MakeInvoice の呼び出しを次のように変更します。
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc", True
      window.navigate "c:\invoice.doc"
				
Autoword2.htm では、SendData メソッドを使用して注文情報を DOMDocument オブジェクトとして ActiveX コンポーネントに送信し、完成した文書を生成します。DOMDocument は、Web ページにある XML データ群から作成されます。呼び出し側によって送信された注文情報が ActiveX コンポーネントで正しく処理されるようにするには、コンポーネントで注文情報として解釈されるように、XML が整形式で構造化されている必要があります。

Autoword2.htm
<HTML>
<HEAD>
   <OBJECT ID="AutoWord"
    CLASSID="CLSID:32646EBA-0919-4C2F-94D6-599F46DC34F2"
    CODEBASE="http://YourWebServer/invoice/package/AutomateWord.CAB#version=1,0,0,0">
   </OBJECT>
</HEAD>
<BODY>
   <BUTTON ID="InvoiceButton">Create Invoice</BUTTON>
   <XML ID="DataXML">
     <Order>
        <OrderID>10700</OrderID>
        <OrderDate>10/10/2000</OrderDate>
        <CustID>SAVEA</CustID>
        <CustInfo>Save-a-lot
Markets Boise ID 83720
USA</CustInfo>
        <Items>
           <Product Desc="Chai" Qty="5" Price="18" Disc="0.2"/>
           <Product Desc="Sasquatch Ale" Qty="12" Price="14" Disc="0.2"/>
           <Product Desc="Scottish Longbreads" Qty="40" Price="12.5" Disc="0.2"/>
           <Product Desc="Flotemysost" Qty="60" Price="21.5" Disc="0.2"/>
        </Items>        
     </Order>
   </XML>
</BODY>

<SCRIPT Language="VBScript">
  
   Function InvoiceButton_OnClick()
      AutoWord.SendData DataXML.XMLDocument
      AutoWord.MakeInvoice "http://YourWebServer/invoice/invoice.doc"
   End Function

</SCRIPT>
</HTML>
				
Autoword1.htm と Autoword2.htm のいずれでも、CreateObject 関数ではなく <OBJECT> タグで ActiveX コンポーネントのインスタンスが生成されることに注意する必要があります。<OBJECT> タグを使用するのは、ActiveX コンポーネントをインストールしていないユーザーに対して、ActiveX コンポーネントの自動ダウンロードを有効にするためです。ユーザーがこれらのページのいずれかを参照したときにコンポーネントがインストールされていないと、CODEBASE 属性に指定されている URL のキャビネット (CAB) ファイルからコンポーネントがダウンロードされます。ユーザーの Internet Explorer でのセキュリティ設定によっては、最初に、ダウンロードするかどうかを確認するメッセージが表示される場合があります。

: Autoword.exe に含まれている CAB ファイルは、Visual Basic のディストリビューション ウィザードで作成されています。パッケージ内の ActiveX コンポーネントは、スクリプトを実行し初期化しても安全だとマークされていますが、デジタル署名はされていません。

インターネット コンポーネントのダウンロードの作成、デジタル署名、およびスクリプトの実行と初期化を行っても安全だとコンポーネントをマークする方法については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
Signing and Checking Code with Authenticode
http://msdn.microsoft.com/workshop/security/authcode/signing.asp

Safe Initialization and Scripting for ActiveX Controls
http://msdn.microsoft.com/workshop/components/activex/safety.asp

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
257757 Office のサーバーサイド オートメーションについて
270906 ASP を使用して RTF (Rich Text Format) ドキュメントを生成し、Microsoft Word にストリーム出力する方法
(c) Microsoft Corporation 2001, All Rights Reserved. Contributions by Lori B. Turner, Microsoft Corporation.

プロパティ

文書番号: 286023 - 最終更新日: 2006年8月1日 - リビジョン: 10.0
この資料は以下の製品について記述したものです。
  • Microsoft Word 2000 Standard Edition
  • Visual Basic, Scripting Edition 5.0
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Internet Explorer 5.0
  • Microsoft Internet Explorer 5.01
  • Microsoft Internet Explorer 5.5
  • Microsoft Word 2002 Standard Edition
  • Microsoft Office Word 2003
キーワード:?
kbdownload kbautomation kbhowto KB286023
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com