[HOWTO] Visual Basic または VBA から ADO を Excel データで使用する

文書翻訳 文書翻訳
文書番号: 257819 - 対象製品
この記事は、以前は次の ID で公開されていました: JP257819
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Excel ワークシートをデータ ソースとして ActiveX データ オブジェクト (ADO) を使用する方法について説明します。また、Excel 固有の構文上の問題や制限事項についても解説します。この資料では、OLAP やピボットテーブル テクノロジ、Excel データのその他の特殊な使用法については扱いません。

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
303814 [HOWTO] VB または VBA から ADOX を Excel データで使用する

詳細

はじめに

Excel ワークシートの行および列はデータベース テーブルの行および列とよく似ています。Excel はリレーショナル データベース管理システムではないこと、およびそれによってもたらされる制限事項を認識していれば、Excel とそのツールを利用してデータを格納または分析することが有効な場合は少なくありません。

マイクロソフトの ActiveX データ オブジェクトでは Excel ブックをデータベースとして扱うことができます。この資料では、その方法について、以下の 3 つの項目に分けて説明します。 : この資料は、Microsoft Windows 2000 上で Visual Basic 6.0 Service Pack 3 および Excel 2000 を使用し、Microsoft Data Access Components (MDAC) 2.5 でテストしたものです。異なるバージョンの MDAC、Microsoft Windows、Visual Basic、または Excel では、この資料とは動作が異なる場合があります。

ADO を使用して Excel に接続する

ADO は、MDAC で提供される次のいずれかの OLE DB プロバイダを使用して Excel データ ファイルに接続できます。
  • Microsoft Jet OLE DB Provider
  • Microsoft OLE DB Provider for ODBC Drivers

Microsoft Jet OLE DB Provider の使用方法

Microsoft Jet OLE DB Provider (以下 "Jet プロバイダ") を使用して Excel データ ソースに接続するには、ファイル名を含むパスと Excel ファイル バージョンの 2 つの情報のみが必要です。

接続文字列を使用する Jet プロバイダ
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
	.Provider = "Microsoft.Jet.OLEDB.4.0"
	.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _
	 "Extended Properties=Excel 8.0;"
	.Open
End With
				
プロバイダのバージョン : Jet 4.0 プロバイダを使用する必要があります。Jet 3.51 プロバイダは Jet ISAM ドライバをサポートしていません。Jet 3.51 プロバイダを指定すると実行時に次のエラー メッセージが表示されます。
組み込み可能な ISAM ドライバは見つかりませんでした。
Excel のバージョン : データ ソースとして Excel 95 ブック (Excel Version 7.0) を使用する場合は、Excel 5.0 を指定します。Excel 97、Excel 2000、または Excel 2002 (XP) ブック (Excel Version 8.0、9.0、および 10.0) を使用する場合は、Excel 8.0 を指定します。

[データ リンク プロパティ] ダイアログ ボックスを使用する Jet プロバイダ

アプリケーションで ADO データ コントロールまたは Data Environment を使用する場合は、必要な接続設定を収集するための [データ リンク プロパティ] ダイアログ ボックスが表示されます。
  1. [プロバイダ] タブで [Microsoft Jet 4.0 OLE DB Provider] をクリックします。Jet 3.51 プロバイダは Jet ISAM ドライバをサポートしていません。Jet 3.51 プロバイダを指定すると実行時に次のエラー メッセージが表示されます。
    組み込み可能な ISAM ドライバは見つかりませんでした。
  2. [接続] タブで、使用するブック ファイルを参照します。[ユーザー名] ボックスと [パスワード] ボックスは Excel 接続には適用されないため無視します (パスワードで保護された Excel ファイルをデータ ソースとして開くことはできません。詳細については、この資料の「パスワードで保護されたブックを開くことはできない」を参照してください)。
  3. [すべて] タブで、一覧の [Extended Properties] をクリックし、[値の編集] をクリックします。[プロパティの値] ボックスに Excel 8.0; と入力し、[OK] をクリックします。セミコロン (;) は他のエントリとの区切り文字として使用します。Jet プロバイダは特に指定がなければ Microsoft Access データベースを想定するため、この手順を省略すると接続テストのときにエラー メッセージが表示されます。
  4. [接続] タブに戻り、[接続テスト] をクリックします。テストに成功したことを示すメッセージが表示されます。
Jet プロバイダのその他の接続設定

列見出し : デフォルトでは、Excel データ ソースの最初の行は列見出しと見なされ、フィールド名として使用されます。最初の行を列見出しとして使用しない場合は、この設定を無効にする必要があります。無効にしないと、データの最初の行がフィールド名として使用され、データとして使用できません。最初の行を列見出しとして使用するかどうかを設定するには、接続文字列 Extended Properties に HDR= の設定を追加します。HDR= の設定を追加しない場合、またはデフォルトの HDR=Yes を追加した場合は、最初の行が列見出しとして使用されます。Excel データ ソースに列見出しがない場合は、HDR=No を追加する必要があります。その場合、フィールドにはプロバイダによって F1、F2、などの名前が付けられます。Extended Properties 文字列に複数の値が含まれることになるため、Extended Properties を二重引用符で囲み、さらにもう 1 組の二重引用符で囲むことで、内側の二重引用符をリテラル値として使用するように指定します。次の例を参照してください (見やすくするため余分なスペースを追加しています)。
.ConnectionString = "Data Source=C:\MyFolder\MyWorkbook.xls;" & _
"Extended Properties=" " Excel 8.0; HDR=No;" " "
				

Microsoft OLE DB Provider for ODBC Drivers の使用方法

Microsoft OLE DB Provider for ODBC Drivers (以下 "ODBC プロバイダ") でも、Excel データ ソースに接続するには 2 つの情報のみが必要です。それらはドライバ名と、ブックのパスおよびファイル名です。

重要 : Excel への ODBC 接続はデフォルトでは読み取り専用です。使用する ADO レコードセットの LockType プロパティの設定値でもこの接続レベルの設定は上書きされません。データを編集するには、接続文字列または DSN 構成の ReadOnly を False に設定する必要があります。ReadOnly を False に設定しないと次のエラー メッセージが表示されます。
更新可能なクエリであることが必要です。
DSN を指定しない接続文字列を使用する ODBC プロバイダ
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
	.Provider = "MSDASQL"
	.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=C:\MyFolder\MyWorkbook.xls; ReadOnly=False;"
	.Open
End With
				
DSN を含む接続文字列を使用する ODBC プロバイダ
Dim cn as ADODB.Connection
Set cn = New ADODB.Connection
With cn
	.Provider = "MSDASQL"
	.ConnectionString = "DSN=MyExcelDSN;"
	.Open
End With
				
[データ リンク プロパティ] ダイアログ ボックスを使用する ODBC プロバイダ

アプリケーションで ADO データ コントロールまたは Data Environment を使用する場合は、必要な接続設定を収集するための [データ リンク プロパティ] ダイアログ ボックスが表示されます。
  1. [プロバイダ] タブで、[Microsoft OLE DB Provider for ODBC Drivers] をクリックします。
  2. [接続] タブの [データベース名を使用する] ボックスの一覧で、使用する既存の DSN をクリックするか、[接続文字列を使用する] をクリックします。必要な接続設定を収集するための標準 DSN 構成ダイアログ ボックスが表示されます。この資料の「Microsoft OLE DB Provider for ODBC Drivers の使用方法」で説明したとおり、必要な場合はデフォルトの読み取り専用設定を解除してください。
  3. [接続] タブに戻り、[接続テスト] をクリックします。テストに成功したことを示すメッセージが表示されます。
ODBC プロバイダのその他の接続設定

列見出し : デフォルトでは、Excel データ ソースの最初の行は列見出しと見なされ、フィールド名として使用されます。最初の行を列見出しとして使用しない場合は、この設定を無効にする必要があります。無効にしないと、データの最初の行がフィールド名として使用され、データとして使用できません。最初の行を列見出しとして使用するかどうかを設定するには、接続文字列に FirstRowHasNames = の設定を追加します。FirstRowHasNames = の設定を追加しない場合、またはデフォルトの FirstRowHasNames = 1 を追加した場合は、最初の行が列見出しとして使用されます。ここで 1 = True です。Excel データ ソースに列見出しがない場合は、FirstRowHasNames = 0 を追加する必要があります。ここで 0 = False です。フィールドにはドライバによって F1、F2、などの名前が付けられます。このオプションは DSN 構成ダイアログ ボックスでは利用できません。

ただし、ODBC ドライバの不具合のため、現時点では FirstRowHasNames を指定しても無効です。つまり、Excel ODBC ドライバ (MDAC 2.1 以降) は指定のデータ ソースの最初の行を常にフィールド名と見なします。 列見出しの不具合の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
288343 [BUG] Excel ODBC Driver で FirstRowHasNames による見出しの設定が無視される
スキャンする行数 : Excel はリレーショナル データベースと異なり、それに含まれるデータについての詳細なスキーマ情報を ADO に提供しません。したがって、ドライバは少なくとも数行のデータをスキャンして各列のデータ型を推測する必要があります。"スキャンする行数" のデフォルト値は 8 行です。行数には 1 から 16 までの整数値を指定できます。0 を指定すると既存のすべての行がスキャンされます。スキャンする行数を指定するには接続文字列に MaxScanRows= の設定を追加するか、DSN 構成ダイアログ ボックスの [スキャンする行数] の設定を変更します。

ただし、ODBC ドライバの不具合のため、現時点ではスキャンする行数 (MaxScanRows) を指定しても効果がありません。つまり、Excel ODBC ドライバ (MDAC 2.1 以降) は常に、指定されたデータ ソースの最初の 8 行をスキャンして、各列のデータ型を判断します。

スキャンする行数の不具合の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
189897 [XL97] Excel ODBC ドライブでデータが 255 文字に切り捨てられる
その他の設定 : [データ リンク プロパティ] ダイアログ ボックスを使用して接続文字列を作成した場合、次のように必須ではない Extended Properties の設定が接続文字列に追加されることがあります。
... DefaultDir=C:\WorkbookPath;DriverId=790;FIL=excel 8.0;MaxBufferSize=2048;PageTimeout=5;
				
Visual Basic Editor での "Collating Sequence" エラー

ある特定のバージョンの MDAC を使用する Visual Basic デザイン環境で、プログラムがデザイン時に初めて Excel データ ソースに接続する際に次のエラー メッセージが表示されることがあります。
選択された CollatingSequence は OS でサポートされていません。
このメッセージは IDE でのみ表示され、コンパイル済みのプログラムでは表示されません。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
246167 [PRB] Excel ブックをデータ ソースとして ADODB レコードセットを初めて開くときに Collating Sequence エラーが発生する

両方の OLE DB プロバイダに適用される考慮事項

データ型の混在についての注意

「スキャンする行数」で説明したとおり、ADO は Excel のワークシートまたは範囲に含まれる各列のデータ型を推測する必要があります (これは Excel のセル書式設定には影響されません)。同じ列に数値と文字列値が混在していると重大な問題が発生することがあります。Jet プロバイダと ODBC プロバイダはどちらも、最も数が多い型についてはそのデータを返し、その他の数が少ないデータ型については NULL (空) 値を返します。2 つの型が列内で同数の場合、文字列ではなく数値が返されます。

以下に例を示します。
  • 8 行をスキャンし、列に 5 個の数値と 3 個の文字列値が含まれる場合、5 個の数字と 3 個の NULL 値が返されます。
  • 8 行をスキャンし、列に 3 個の数値と 5 個の文字列値が含まれる場合、3 個の NULL 値と 5 個の文字列値が返されます。
  • 8 行をスキャンし、列に 4 個の数値と 4 個の文字列値が含まれる場合、4 個の数字と 4 個の NULL 値が返されます。
結果として、列に値の型が混在する場合は、数値を文字列としてその列に格納し、必要なときにクライアント アプリケーションで Visual Basic の VAL 関数または同等の関数を使用して数字に戻すようにします。

この問題を回避するには、接続文字列の Extended Properties に IMEX=1 を追加してインポート モードを有効にします。これにより、強制的にレジストリ値 ImportMixedTypes=Text が設定されます。ただし、このモードで更新操作を実行すると、予期しない結果になる場合があります。 この設定の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
194124 [PRB] DAO の OpenRecordset を使用すると Excel の値として NULL が返される
パスワードで保護されたブックを開くことはできない

Excel ブックがパスワードで保護されている場合、ブック ファイルが既に Excel で開かれている場合以外は、接続設定で正しいパスワードを指定しても、そのブックを開いてデータにアクセスすることはできません。開こうとすると次のエラー メッセージが表示されます。
ファイルを解読できませんでした。
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
211378 [XL2000] パスワードで保護されたファイルを使用するときのエラー メッセージ "ファイルを解読できませんでした"

ADO を使用して Excel データの取得と編集を行う

ここでは、Excel データの操作方法について、次の 2 つの項目に分けて説明します。
  • データを選択する方法
  • データを変更する方法

データを選択する方法

データを選択するには、次のいくつかの方法があります。

  • コードを使用して Excel データを選択する。
  • ADO データ コントロールを使用して Excel データを選択する。
  • Data Environment のコマンドを使用して Excel データを選択する。

コードを使用して Excel データを選択する

Excel データは、ブックの次のいずれかの領域に含まれます。

  • ワークシート全体
  • ワークシート上の名前付きセル範囲
  • ワークシート上の名前なしセル範囲
ワークシートの指定

ワークシートをレコードソースとして指定するには、ワークシート名の後にドル記号を付け、角かっこで囲みます。次に例を示します。
	strQuery = "SELECT * FROM [Sheet1$]"
				
キーボードのチルダ (~) の下にある (日本語キーボードの場合は P キーの右横にある) 斜めの単一引用符を使用してワークシート名を区切ることもできます。次に例を示します。
	strQuery = "SELECT * FROM `Sheet1$`"
				
マイクロソフトでは、角かっこの使用をお勧めします。角かっこは不確定なデータベース オブジェクト名に対する現在有効な表記方法です。

ドル記号と角かっこ、またはドル記号のみを省略すると、次のエラー メッセージが表示されます。
オブジェクト 'Sheet1' が見つかりませんでした。
ドル記号を使用して角かっこを省略すると、次のエラー メッセージが表示されます。
FROM 句の構文エラーです。
通常の単一引用符を使用すると、次のエラー メッセージが表示されます。
クエリの構文エラーです。クエリの句が不完全です。
名前付き範囲の指定

名前付きセル範囲をレコードソースとして指定するには、単に定義済みの名前を使用します。次に例を示します。
	strQuery = "SELECT * FROM MyRange"
				
名前なし範囲の指定

名前なしセル範囲をレコードソースとして指定するには、Excel の行および列の標準的な表記を角かっこ内のシート名の後ろに追加します。次に例を示します。
	strQuery = "SELECT * FROM [Sheet1$A1:B10]"
				
ワークシートの指定についての注意 : データのテーブルは、指定したワークシートの左上に最も近い、空白でないセルから始まると想定されます。つまり、行 3、列 C からもデータのテーブルは問題なく開始できます。ただし、ワークシートのタイトルなどをセル A1 のデータの上や左側に入力することはできません。

範囲の指定についての注意 : ワークシートをレコードソースとして指定すると、プロバイダによってワークシートの既存のレコードの下に、スペースが許す限り新しいレコードが追加されます。範囲 (名前付き、または名前なし) を指定する場合も、Jet によって範囲の既存のレコードの下に、スペースが許す限り新しいレコードが追加されます。ただし、元の範囲で再クエリを実行すると、結果のレコードセットには新しく追加された範囲外のレコードは含まれません。

MDAC 2.5 より前のバージョンでは、名前付き範囲をレコードソースとして指定するとき、定義済み範囲の限界を超えて新しいレコードを追加することはできません。範囲を超えてレコードを追加しようとすると、次のエラー メッセージが表示されます。
指定範囲を広げることはできません。

ADO データ コントロールを使用して Excel データを選択する

ADO データ コントロールの [プロパティ ページ] ダイアログ ボックスの [全般] タブで Excel データ ソースへの接続設定を指定した後、[レコードソース] タブをクリックします。[コマンド タイプ] ボックスの一覧で [1 - adCmdText] をクリックすると、[コマンド テキスト (SQL)] ボックスに上記の構文の SELECT クエリを入力できます。Jet プロバイダを使用している場合、[コマンド タイプ] ボックスの一覧で [2 - adCmdTable] をクリックすると、[テーブル名またはストアド プロシージャ名] ボックスの一覧に、指定のブックで利用可能な名前付き範囲とワークシート名の両方が、名前付き範囲から先に表示されます。

[テーブル名またはストアド プロシージャ名] ボックスの一覧では、ワークシート名にドル記号が適切に追加されますが、必要な角かっこは追加されません。その結果、ワークシート名を選択して [OK] をクリックしただけでは、後で次のエラー メッセージが表示されます。
FROM 句の構文エラーです。
手作業で、ワークシート名を角かっこで囲む必要があります (このコンボ ボックスは編集可能です)。ODBC プロバイダを使用している場合、このボックスの一覧には名前付き範囲のみが表示されます。ただし、ワークシート名を適切な区切り文字と共に手作業で入力できます。

Data Environment のコマンドを使用して Excel データを選択する

Data Environment で Excel データ ソースへの接続を設定したら、接続を右クリックし、[コマンドの追加] をクリックして、コマンドを追加します。新しく追加されたコマンドを右クリックし、[プロパティ] をクリックします。コマンドのプロパティ ボックスの [全般] タブで、[データベース] の [SQL ステートメント] をクリックし、テキスト ボックスに上記の構文のクエリを入力できます。[データ ソース] の [データベース オブジェクト] をクリックし、[データベース オブジェクト] ボックスの一覧の [テーブル] をクリックします。Jet プロバイダを使用している場合は、[オブジェクト名] ボックスの一覧に、選択したブックで利用可能な名前付き範囲とワークシート名の両方が、名前付き範囲から先に表示されます (ここでワークシート名を選択する場合、ADO データ コントロールの場合のように手作業でワークシート名を角かっこで囲む必要はありません)。ODBC プロバイダを使用している場合、[オブジェクト名] ボックスの一覧には名前付き範囲のみが表示されます。ただし、ワークシート名を手作業で入力することができます。

Excel データを変更する方法 : 編集、追加、および削除

編集

Excel データは ADO の通常のメソッドで編集できます。Excel 数式 ("=" で始まる) を含んでいる Excel ワークシートのセルに対応するレコードセット フィールドは、読み取り専用で編集できません。また、Excel への ODBC 接続は、接続設定で ReadOnly=False を指定しない限り、デフォルトで読み取り専用です。この資料の「Microsoft OLE DB Provider for ODBC Drivers の使用方法」を参照してください。

追加

Excel レコードソースにスペースの許す限りレコードを追加することができます。ただし、元の指定範囲外に新しいレコードを追加すると、元の範囲指定で再クエリを実行した場合にこれらのレコードは含まれません。この資料の「範囲の指定についての注意」を参照してください。

特定の状況では、ADO Recordset オブジェクトの AddNew メソッドおよび Update メソッドを使用して Excel のテーブルに新しい行を挿入すると、Excel の誤った列にデータ値が挿入される場合があります。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
314763 [FIX] ADO により Excel の誤った列にデータが挿入される
削除

Excel データの削除に関しては、リレーショナル データ ソースのデータより多くの制約があります。リレーショナル データベースでは、"レコード" と関連のない "行" は意味を持ちませんが、Excel ワークシートに当てはまりません。フィールド (セル) の値は削除することができますが、次のことはできません。
  1. レコード全体を一度に削除すると、次のエラー メッセージが表示されます。
    この ISAM では、リンク テーブル内のデータを削除することはできません。
    レコードを削除するには、各フィールドの内容を個別に削除する必要があります。
  2. Excel の数式を含むセルの値を削除すると、次のエラー メッセージが表示されます。
    このコンテキストで操作は許可されていません。
  3. データが削除された空のワークシート行は削除できません。レコードセットには、空の行に対応する空のレコードが含まれます。
Excel データを ADO で編集する際の注意 : ADO を使用して Excel にテキスト データを挿入すると、テキストの前に単一引用符が付きます。このため、後で新しいデータを操作する際に問題が発生することがあります。

Excel のデータ ソース構造 (メタデータ) を取得する

ADO を使用して Excel データ ソース構造 (テーブルおよびフィールド) に関するデータを取得できます。2 つの OLE DB プロバイダ間で結果がやや異なりますが、両方のプロバイダで有用な情報を持つ最小限のフィールドが返されます。このメタデータは ADO Connection オブジェクトの OpenSchema メソッドで取得できます。OpenSchema メソッドは ADO Recordset オブジェクトを返します。この目的には、さらに強力な Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) ライブラリも利用できます。ただし、"テーブル" がワークシートまたは名前付き範囲のいずれかで、"フィールド" が限られた数の汎用データ型の 1 つであるような Excel データ ソースの場合、この拡張機能はあまり役に立ちません。

テーブル情報のクエリ

リレーショナル データベースで利用できるさまざまなオブジェクト (テーブル、ビュー、ストアド プロシージャなど) の中で、Excel データ ソースは、指定されたブックで定義されるワークシートと名前付き範囲を含むテーブル オブジェクトのみを公開します。名前付き範囲は "TABLE" として、ワークシートは "SYSTEM TABLE" として扱われます。この "table_type" プロパティ以外に取得できる、より有用なテーブル情報はありません。ブックに含まれるテーブルのリストを要求するには、次のコードを使用します。
Set rs = cn.OpenSchema(adSchemaTables)
				
Jet プロバイダは 9 つのフィールドを含むレコードセットを返します。そのうち次の 4 つのフィールドにのみ値が入力されています。

  • table_name
  • table_type - "TABLE" または "SYSTEM TABLE"
  • date_created
  • date_modified
特定のテーブルの 2 つの日付フィールドには常に同じ値が表示されます。この値は "最終更新日" です。つまり、"date_created" は作成日を示していない場合があります。

ODBC プロバイダも 9 つのフィールドを含むレコードセットを返します。そのうち次の 3 つのフィールドにのみ値が入力されています。

  • table_catalog - ブックが存在するフォルダ
  • table_name
  • table_type - Jet プロバイダと同じ
ADO のドキュメントに従えば、OpenSchema メソッドにたとえば次のような追加条件を指定すると、ワークシートのリストのみを取得できます。
Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "System Table"))
				
残念ながら、このコードは MDAC 2.0 以降の Excel データ ソースに対してはいずれのプロバイダを使用した場合も無効です。

フィールド情報のクエリ

Excel データ ソースの各フィールド (列) のデータ型は次のいずれかです。

  • 数値型 (ADO データ型 5 - adDouble)
  • 通貨型 (ADO データ型 6 - adCurrency)
  • 論理型またはブール型 (ADO データ型 11 - adBoolean)
  • 日付型 (ADO データ型 7 - adDate (Jet を使用した場合) または ADO データ型 135 - adDBTimestamp (ODBC を使用した場合))
  • テキスト型 (ADO データ型 202 - adVarChar、ADO データ型 200 - adVarWChar など、ADO の ad .. Char 型)
数値型列の numeric_precision には常に 15 が返されます (これは Excel の最大有効桁数です)。文字列型列の character_maximum_length には常に 255 が返されます (これは Excel 列内の文字列の最大表示幅であり、最大長ではありません)。data_type プロパティ以外に取得できる、より有用なフィールド情報はありません。テーブル内のフィールドのリストを要求するには、次のコードを使用します。
Set rs = cn.OpenSchema(adSchemaTables, Array(Empty, Empty, "TableName", Empty))
				
Jet プロバイダは 28 フィールドのレコードセットを返します。そのうち、8 個の数値フィールドと 9 個の文字列フィールドに値が入力されています。有用なフィールドは次のとおりです。

  • table_name
  • column_name
  • ordinal_position
  • data_type
ODBC プロバイダは 29 フィールドのレコードセットを返します。そのうち、10 個の数値フィールドと 11 個の文字列フィールドに値が入力されています。有用なフィールドは Jet プロバイダの場合と同じです。

テーブルおよびフィールドとそれらのプロパティの列挙

たとえば次のサンプルのような Visual Basic コードを使用して、Excel データ ソース内のテーブルと列、およびそれぞれについての情報を列挙することができます。次のサンプルでは結果が同じフォーム上のリストボックス、List1 に出力されます。
Dim cn As ADODB.Connection
Dim rsT As ADODB.Recordset
Dim intTblCnt As Integer, intTblFlds As Integer
Dim strTbl As String
Dim rsC As ADODB.Recordset
Dim intColCnt As Integer, intColFlds As Integer
Dim strCol As String
Dim t As Integer, c As Integer, f As Integer
Set cn = New ADODB.Connection
With cn
	.Provider = "Microsoft.Jet.OLEDB.4.0"
	.ConnectionString = "Data Source=" & App.Path & _
"\ExcelSrc.xls;Extended Properties=Excel 8.0;"
	'.Provider = "MSDASQL"
	'.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & App.Path & "\ExcelSrc.xls; "
	.CursorLocation = adUseClient
	.Open
End With
Set rsT = cn.OpenSchema(adSchemaTables)
intTblCnt = rsT.RecordCount
intTblFlds = rsT.Fields.Count
List1.AddItem "Tables:	" & intTblCnt
List1.AddItem "--------------------"
For t = 1 To intTblCnt
	strTbl = rsT.Fields("TABLE_NAME").Value
	List1.AddItem vbTab & "Table #" & t & ":	" & strTbl
	List1.AddItem vbTab & "--------------------"
	For f = 0 To intTblFlds - 1
		List1.AddItem vbTab & rsT.Fields(f).Name & _
vbTab & rsT.Fields(f).Value
	Next
	List1.AddItem "--------------------"
	Set rsC = cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, strTbl, Empty))
	intColCnt = rsC.RecordCount
	intColFlds = rsC.Fields.Count
	For c = 1 To intColCnt
		strCol = rsC.Fields("COLUMN_NAME").Value
		List1.AddItem vbTab & vbTab & "Column #" & c & ": " & strCol
		List1.AddItem vbTab & vbTab & "--------------------"
		For f = 0 To intColFlds - 1
			List1.AddItem vbTab & vbTab & rsC.Fields(f).Name & _
vbTab & rsC.Fields(f).Value
		Next
		List1.AddItem vbTab & vbTab & "--------------------"
		rsC.MoveNext
		Next
		rsC.Close
		List1.AddItem "--------------------"
		rsT.MoveNext
Next
rsT.Close
cn.Close
				

データ ビュー ウィンドウの使用

Visual Basic データ ビュー ウィンドウで Excel データ ソースへのデータ リンクを作成すると、上のサンプル コードから取得できる情報がデータ ビュー ウィンドウに表示されます。特に、Jet プロバイダではワークシートと名前付き範囲の両方が "テーブル" の一覧に表示されますが、ODBC プロバイダでは名前付き範囲のみが表示されることに注意してください。名前付き範囲を定義せずに ODBC プロバイダを使用した場合、"テーブル" の一覧は空になります。

Excel の制限事項

Excel をデータ ソースとして使用する場合は、Excel のブックおよびワークシートの内部の制約を受けます。制限事項には次のようなものがありますが、これらに限定されません。

  • ワークシート サイズ : 65,536 行 x 256 列
  • セル内容 (文字列) : 32,767 文字
  • ブックあたりのシート数 : 利用可能メモリにより制限される
  • ブックあたりの名前の数 : 利用可能メモリにより制限される

関連情報

Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
316934 [HOWTO] Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
295646 ADO を使用して ADO データ ソースから Excel にデータを転送する方法
246335 [XL2003] [HOWTO] オートメーションを使用して ADO レコードセットのデータを Excel に転送する方法
247412 [XL2003] [INFO] Visual Basic から Excel にデータを転送する方法
278973 [SAMPLE] ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
318373 Visual Basic .NET で GetOleDbSchemaTable メソッドを使用して Excel からメタデータを取得する方法
詳細については、次のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/japan/partners/mtc/

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 257819 (最終更新日 2004-07-15) を基に作成したものです。

この資料に含まれているサンプル コード/プログラムは英語版を前提に書かれたものをありのままに記述しており、日本語環境での動作は確認されておりません。

プロパティ

文書番号: 257819 - 最終更新日: 2004年10月1日 - リビジョン: 4.3
この資料は以下の製品について記述したものです。
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 3
  • Microsoft Visual Basic for Applications 6.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft Data Access Components 2.1
  • Microsoft Data Access Components 2.1 Service Pack 1
  • Microsoft Data Access Components 2.1 Service Pack 2
  • Microsoft Data Access Components 2.5
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 95 Standard Edition
キーワード:?
kbhowto kbiisam KB257819
"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