ASP から ADO を使用して Excel データのクエリと更新を行う方法

概要

この記事では、Active Server Pages (ASP) ページから ActiveX データ オブジェクト (ADO) を使用して Excel スプレッドシートの情報を照会および更新する方法について説明します。 この記事では、この種類のアプリケーションに関連する制限事項についても説明します。

重要

ASP/ADO アプリケーションではマルチユーザー アクセスがサポートされていますが、Excel スプレッドシートではサポートされていません。 したがって、この情報の照会および更新方法では、マルチユーザーの同時アクセスはサポートされません。

詳細情報

このサンプルの Excel スプレッドシートのデータにアクセスするには、Microsoft ODBC Driver for Excel を使用します。 Excel スプレッドシートに名前付き範囲を作成して、データにアクセスするテーブルを作成します。

サンプル アプリケーションを作成する手順

  • シート 1 に次のデータを含む Excel ファイル ADOtest.xls を作成します。

    column1 column2 column3
    Rr これ 15
    Bb test 20
    ee 作品 25

    注:

    Excel スプレッドシートの列にテキストと数値の両方が含まれている場合、Excel ODBC ドライバーは、列のデータ型を正しく解釈できません。 列内のすべてのセルが同じデータ型であることを確認してください。 列の各セルが同じ型ではない場合、または "text" と "general" の間に型が混在している場合、次の 3 つのエラーが発生する可能性があります。

    1. Microsoft OLE DB Provider for ODBC Drivers エラー '80040e21' 要求プロパティは、この ODBC ドライバーでサポートできません。
    2. Microsoft OLE DB Provider for ODBC Drivers エラー '80004005' クエリには、希望に満ちたキーとして使用する検索可能な列がないため、更新できません。
    3. Microsoft OLE DB Provider for ODBC Drivers エラー '80004005' クエリ ベースの更新に失敗しました。 更新する行が見つかりませんでした。
  • スプレッドシートに名前付き範囲 myRange1 を作成します。

    1. データが存在する行と列の領域を強調表示します。
    2. [挿入] メニューの [名前] をポイントし、[定義] をクリックします。
    3. 名前付き範囲名に myRange1 という名前を入力します。
    4. [OK] をクリックします。

    名前付き範囲 myRange1 には、次のデータが含まれています。

    column1 column2 column3
    Rr これ 15
    Bb test 20
    ee 作品 25

    注:

    • ADO では、Excel クエリの最初の行に列見出しが含まれていることを前提としています。 したがって、名前付き範囲には列見出しを含める必要があります。 これは DAO とは異なる動作です。
    • 列見出しを数値にすることはできません。 Excel ドライバーはそれらを解釈できず、代わりにセル参照を返します。 たとえば、"F1" の列見出しが誤って解釈されます。
  • ADOTest.xls ファイルを指す ODBC システム データ ソース名 (DSN) を作成します。

    1. コントロール パネルから、ODBC 管理者を開きます。
    2. [システム DSN] タブで、[追加] をクリックします。
    3. [Microsoft Excel Driver (*.xls)] を選択し、[完了] をクリックします。 このオプションが存在しない場合は、Excel セットアップから Microsoft ODBC ドライバー for Excel をインストールする必要があります。
    4. [データ ソース名] に [ADOExcel] を選択します。
    5. [バージョン] が正しいバージョンの Excel に設定されていることを確認します。
    6. [ブックの選択...]をクリックし、ADOTest.xls ファイルを参照して、[OK] をクリックします。
    7. [オプション>>] ボタンをクリックし、[読み取り専用] チェックボックスをオフにします。
    8. [OK] をクリックし、もう一度 [OK] をクリックします。
  • ADOTest.xls ファイルに対するアクセス許可を設定します。

Active Server ページに匿名でアクセスする場合は、匿名アカウント (IUSR_<MachineName>) がスプレッドシートへの読み取り/書き込み (RW) 以上のアクセス権を持っていることを確認する必要があります。 スプレッドシートから情報を削除する場合は、それに応じてアクセス許可を付与する必要があります。

Active Server ページへのアクセスを認証する場合は、アプリケーションにアクセスするすべてのユーザーが適切なアクセス許可を持っていることを確認する必要があります。

スプレッドシートに適切なアクセス許可を設定しないと、次のようなエラー メッセージが表示されます。

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Microsoft][ODBC Excel Driver] The Microsoft Jet database engine cannot open the file '(unknown)'. It is already opened exclusively by another user, or you need permission to view its data.
  1. 新しい ASP ページを作成し、次のコードを貼り付けます。

       <!-- Begin ASP Source Code -->
       <%@ LANGUAGE="VBSCRIPT" %>
       <%
         Set objConn = Server.CreateObject("ADODB.Connection")
         objConn.Open "ADOExcel"
    
    Set objRS = Server.CreateObject("ADODB.Recordset")
         objRS.ActiveConnection = objConn
         objRS.CursorType = 3                    'Static cursor.
         objRS.LockType = 2                      'Pessimistic Lock.
         objRS.Source = "Select * from myRange1"
         objRS.Open
    %>
    <br>
    <%
       Response.Write("Original Data")
    
    'Printing out original spreadsheet headings and values.
    
    'Note that the first recordset does not have a "value" property
       'just a "name" property.  This will spit out the column headings.
    
    Response.Write("<TABLE><TR>")
       For X = 0 To objRS.Fields.Count - 1
          Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
       Next
       Response.Write("</TR>")
       objRS.MoveFirst
    
    While Not objRS.EOF
          Response.Write("<TR>")
          For X = 0 To objRS.Fields.Count - 1
             Response.write("<TD>" & objRS.Fields.Item(X).Value)
          Next
          objRS.MoveNext
          Response.Write("</TR>")
       Wend
       Response.Write("</TABLE>")
    
    'The update is made here
    
    objRS.MoveFirst
       objRS.Fields(0).Value = "change"
       objRS.Fields(1).Value = "look"
       objRS.Fields(2).Value = "30"
       objRS.Update
    
    'Printing out spreadsheet headings and values after update.
    
    Response.Write("<br>Data after the update")
       Response.Write("<TABLE><TR>")
       For X = 0 To objRS.Fields.Count - 1
          Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
       Next
       Response.Write("</TR>")
       objRS.MoveFirst
    
    While Not objRS.EOF
          Response.Write("<TR>")
          For X = 0 To objRS.Fields.Count - 1
             Response.write("<TD>" & objRS.Fields.Item(X).Value)
          Next
          objRS.MoveNext
          Response.Write("</TR>")
       Wend
       Response.Write("</TABLE>")
    
    'ADO Object clean up.
    
    objRS.Close
       Set objRS = Nothing
    
    objConn.Close
       Set objConn = Nothing
    %>
    <!-- End ASP Source Code -->
    
  2. Active Server ページに名前を付けて保存し、ブラウザーで表示します。 以下のように表示されます。

    Original Data:
    
    |column1|column2|column3|
    |------------|------------|------------|
    |rr|this|30|
    |bb|test|20|
    |tt|works|25|
    
    Data after the update:
    
    |column1|column2|column3|
    |------------|------------|------------|
    |change|look|30|
    |bb|test|20|
    |tt|works|25|
    

注:

名前付き範囲の最初の行 (見出しの後) に更新が実行されました。