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

Office 2003 のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Office 2003 のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

概要
この資料では、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 ダウンロード センター」からダウンロードできます。
リリース日 : 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 ExplicitPrivate Type InvoiceData    OrderID As String    OrderDate As Date    CustID As String    CustInfo As String    ProdInfo As VariantEnd TypePrivate m_Data As InvoiceDataPublic 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.CloseEnd SubPublic 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 = vArrayEnd SubPublic 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-lotMarkets Boise ID 83720USA</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.
automating automate automation createobject msword 2000 2002 xp ie
プロパティ

文書番号:286023 - 最終更新日: 08/01/2006 07:37:17 - リビジョン: 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
フィードバック