この資料では、ASP (Active Server Pages) ページから ADO (ActiveX データ オブジェクト) を使用して、Excel ワークシートの情報に対するクエリを実行し、情報を更新する方法について説明します。また、このようなアプリケーションに関する制限事項についても説明します。
重要 : ASP アプリケーションと ADO アプリケーションではマルチユーザー アクセスがサポートされていますが、Excel ワークシートではサポートされていません。そのため、この方法でデータのクエリおよび更新を行う場合、複数のユーザーによる同時アクセスはサポートされません。
このサンプルで Excel ワークシートのデータにアクセスするには、Excel 用の Microsoft ODBC ドライバを使用します。Excel ワークシートで名前の範囲を作成し、データにアクセスするテーブルを作成します。
サンプル アプリケーションを作成する手順
-
ADOtest.xls という Excel ファイルを作成し、Sheet1 に以下のようにデータを設定します。
元に戻す全体を表示する
|
column1
|
column2
|
column3
|
|---|
|
rr
|
this
|
15
|
|
bb
|
test
|
20
|
|
ee
|
works
|
25
|
注 : Excel ワークシートの列に文字列と数値の両方が含まれている場合、Excel ODBC ドライバでは列のデータ型が正しく解釈されません。1 つの列内のセルはすべて同じデータ型になっていることを確認してください。1 つの列内にデータ型の異なるセルが存在する場合、または "テキスト" と "標準" のデータ型が混在している場合、以下の 3 つのエラーメッセージが表示されることがあります。
-
Microsoft OLE DB Provider for ODBC Drivers エラー '80040e21'
この ODBC ドライバは要求プロパティをサポートしません。
-
Microsoft OLE DB Provider for ODBC Drivers エラー '80004005'
キーとして使用する検索可能な列がクエリに含まれていないため、クエリを更新できません。
-
Microsoft OLE DB Provider for ODBC Drivers エラー '80004005'
クエリ ベースの更新に失敗しました。更新する行が見つかりません。
-
ワークシートに myRange1 という名前の範囲を作成します。
-
データが設定されている行と列を強調表示します。
- [挿入] メニューの [名前] をポイントし、[定義] をクリックします。
-
名前の範囲名として「myRange1」と入力します。
-
[OK] をクリックします。
名前の範囲 myRange1 には以下のデータが格納されます。
元に戻す全体を表示する
|
column1
|
column2
|
column3
|
|---|
|
rr
|
this
|
15
|
|
bb
|
test
|
20
|
|
ee
|
works
|
25
|
注 : ADO では、Excel クエリの最初の行に列見出しが含まれていることが想定されています。そのため、名前の範囲には列見出しが含まれている必要があります。この点は DAO の動作と異なります。
注 : 列見出しのデータ型を数値にすることはできません。Excel ドライバでは数値型の列見出しを解釈できないため、セル参照が返されます。たとえば、"F1" という列見出しは正しく解釈されません。
-
ADOTest.xls ファイルを指す ODBC システム データ ソース名 (DSN) を作成します。
- コントロール パネルで [データ ソース (ODBC)] をダブルクリックします。
-
[システム DSN] タブをクリックし、[追加] をクリックします。
-
[Microsoft Excel Driver (*.xls)] をクリックし、[完了] をクリックします。このオプションが表示されない場合は、Excel 用の Microsoft ODBC ドライバを Excel セットアップからインストールする必要があります。
-
[データ ソース名] ボックスに「ADOExcel」と入力します。
-
[バージョン] ボックスに Excel のバージョンが正しく設定されていることを確認します。
-
[ブックの選択...] をクリックし、ADOTest.xls ファイルを参照して [OK] をクリックします。
-
[オプション>>] をクリックし、[読み取り専用] チェック ボックスをオフにします。
-
[OK] をクリックし、もう一度 [OK] をクリックします。
-
ADOTest.xls ファイルのアクセス許可を設定します。
Active Server Page に匿名でアクセスする設定になっている場合は、匿名アカウント (IUSR_<MachineName>) に少なくとも、ワークシートに対する読み取りと書き込み (RW) のアクセス許可が付与されていることを確認する必要があります。ワークシートから情報を削除するには、削除に必要なアクセス許可を与える必要があります。
Active Server Page へのアクセスに対して認証を行う場合は、アプリケーションにアクセスするすべてのユーザーに対して適切なアクセス許可を設定する必要があります。
注 : ワークシートに適切なアクセス許可を設定していない場合、次のようなエラー メッセージが表示されます。
Microsoft OLE DB Provider for ODBC Drivers エラー '80004005'
[Microsoft][ODBC Excel Driver] ファイル '(不明)' を開くことができませんでした。ほかのユーザーが排他的に開いているか、データを読み取る権限がありません。
-
新しい 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 -->
-
作成した ASP ページに名前を付けて保存し、ブラウザで参照します。以下のように表示されます。
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
注 : 名前の範囲の、列見出しの次の行が変更されています。
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
190195
(http://support.microsoft.com/kb/190195/
)
DAO を使用して Excel シートから情報を抽出する方法
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
195951
(http://support.microsoft.com/kb/195951/EN-US/
)
(最終更新日 2004-07-01) を基に作成したものです。
この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。
文書番号: 195951 - 最終更新日: 2004年7月21日 - リビジョン: 5.1
この資料は以下の製品について記述したものです。
- Microsoft ActiveX Data Objects 1.0
- Microsoft ActiveX Data Objects 1.5
- Microsoft ActiveX Data Objects 2.0
- Microsoft ActiveX Data Objects 2.1 Service Pack 2
- Microsoft ActiveX Data Objects 2.5
- Microsoft Active Server Pages 4.0
- Microsoft Data Access Components 2.5
| kbhowto kbmdacnosweep kbcode KB195951 |
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"