文書番号: 257819 - 最終更新日: 2004年10月1日 - リビジョン: 4.3 [HOWTO] Visual Basic または VBA から ADO を Excel データで使用するこの記事は、以前は次の ID で公開されていました: JP257819 目次概要
この資料では、Excel ワークシートをデータ ソースとして ActiveX データ オブジェクト (ADO) を使用する方法について説明します。また、Excel 固有の構文上の問題や制限事項についても解説します。この資料では、OLAP やピボットテーブル テクノロジ、Excel データのその他の特殊な使用法については扱いません。
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。 303814?
(http://support.microsoft.com/kb/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 Jet OLE DB Provider (以下 "Jet プロバイダ") を使用して Excel データ ソースに接続するには、ファイル名を含むパスと Excel ファイル バージョンの 2 つの情報のみが必要です。接続文字列を使用する Jet プロバイダ 組み込み可能な ISAM ドライバは見つかりませんでした。 [データ リンク プロパティ] ダイアログ ボックスを使用する Jet プロバイダ アプリケーションで ADO データ コントロールまたは Data Environment を使用する場合は、必要な接続設定を収集するための [データ リンク プロパティ] ダイアログ ボックスが表示されます。
列見出し : デフォルトでは、Excel データ ソースの最初の行は列見出しと見なされ、フィールド名として使用されます。最初の行を列見出しとして使用しない場合は、この設定を無効にする必要があります。無効にしないと、データの最初の行がフィールド名として使用され、データとして使用できません。最初の行を列見出しとして使用するかどうかを設定するには、接続文字列 Extended Properties に HDR= の設定を追加します。HDR= の設定を追加しない場合、またはデフォルトの HDR=Yes を追加した場合は、最初の行が列見出しとして使用されます。Excel データ ソースに列見出しがない場合は、HDR=No を追加する必要があります。その場合、フィールドにはプロバイダによって F1、F2、などの名前が付けられます。Extended Properties 文字列に複数の値が含まれることになるため、Extended Properties を二重引用符で囲み、さらにもう 1 組の二重引用符で囲むことで、内側の二重引用符をリテラル値として使用するように指定します。次の例を参照してください (見やすくするため余分なスペースを追加しています)。 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 に設定しないと次のエラー メッセージが表示されます。 更新可能なクエリであることが必要です。 アプリケーションで ADO データ コントロールまたは Data Environment を使用する場合は、必要な接続設定を収集するための [データ リンク プロパティ] ダイアログ ボックスが表示されます。
列見出し : デフォルトでは、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?
(http://support.microsoft.com/kb/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?
(http://support.microsoft.com/kb/189897/
)
[XL97] Excel ODBC ドライブでデータが 255 文字に切り捨てられる
その他の設定 : [データ リンク プロパティ] ダイアログ ボックスを使用して接続文字列を作成した場合、次のように必須ではない Extended Properties の設定が接続文字列に追加されることがあります。
ある特定のバージョンの MDAC を使用する Visual Basic デザイン環境で、プログラムがデザイン時に初めて Excel データ ソースに接続する際に次のエラー メッセージが表示されることがあります。 選択された CollatingSequence は OS でサポートされていません。 246167?
(http://support.microsoft.com/kb/246167/
)
[PRB] Excel ブックをデータ ソースとして ADODB レコードセットを初めて開くときに Collating Sequence エラーが発生する
両方の OLE DB プロバイダに適用される考慮事項データ型の混在についての注意「スキャンする行数」で説明したとおり、ADO は Excel のワークシートまたは範囲に含まれる各列のデータ型を推測する必要があります (これは Excel のセル書式設定には影響されません)。同じ列に数値と文字列値が混在していると重大な問題が発生することがあります。Jet プロバイダと ODBC プロバイダはどちらも、最も数が多い型についてはそのデータを返し、その他の数が少ないデータ型については NULL (空) 値を返します。2 つの型が列内で同数の場合、文字列ではなく数値が返されます。 以下に例を示します。
この問題を回避するには、接続文字列の Extended Properties に IMEX=1 を追加してインポート モードを有効にします。これにより、強制的にレジストリ値 ImportMixedTypes=Text が設定されます。ただし、このモードで更新操作を実行すると、予期しない結果になる場合があります。 この設定の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。 194124?
(http://support.microsoft.com/kb/194124/
)
[PRB] DAO の OpenRecordset を使用すると Excel の値として NULL が返される
パスワードで保護されたブックを開くことはできないExcel ブックがパスワードで保護されている場合、ブック ファイルが既に Excel で開かれている場合以外は、接続設定で正しいパスワードを指定しても、そのブックを開いてデータにアクセスすることはできません。開こうとすると次のエラー メッセージが表示されます。 ファイルを解読できませんでした。 211378?
(http://support.microsoft.com/kb/211378/
)
[XL2000] パスワードで保護されたファイルを使用するときのエラー メッセージ "ファイルを解読できませんでした"
ADO を使用して Excel データの取得と編集を行うここでは、Excel データの操作方法について、次の 2 つの項目に分けて説明します。
データを選択する方法データを選択するには、次のいくつかの方法があります。
コードを使用して Excel データを選択するExcel データは、ブックの次のいずれかの領域に含まれます。
ワークシートをレコードソースとして指定するには、ワークシート名の後にドル記号を付け、角かっこで囲みます。次に例を示します。 ドル記号と角かっこ、またはドル記号のみを省略すると、次のエラー メッセージが表示されます。 オブジェクト 'Sheet1' が見つかりませんでした。 FROM 句の構文エラーです。 クエリの構文エラーです。クエリの句が不完全です。 名前付きセル範囲をレコードソースとして指定するには、単に定義済みの名前を使用します。次に例を示します。 名前なしセル範囲をレコードソースとして指定するには、Excel の行および列の標準的な表記を角かっこ内のシート名の後ろに追加します。次に例を示します。 範囲の指定についての注意 : ワークシートをレコードソースとして指定すると、プロバイダによってワークシートの既存のレコードの下に、スペースが許す限り新しいレコードが追加されます。範囲 (名前付き、または名前なし) を指定する場合も、Jet によって範囲の既存のレコードの下に、スペースが許す限り新しいレコードが追加されます。ただし、元の範囲で再クエリを実行すると、結果のレコードセットには新しく追加された範囲外のレコードは含まれません。 MDAC 2.5 より前のバージョンでは、名前付き範囲をレコードソースとして指定するとき、定義済み範囲の限界を超えて新しいレコードを追加することはできません。範囲を超えてレコードを追加しようとすると、次のエラー メッセージが表示されます。 指定範囲を広げることはできません。 ADO データ コントロールを使用して Excel データを選択するADO データ コントロールの [プロパティ ページ] ダイアログ ボックスの [全般] タブで Excel データ ソースへの接続設定を指定した後、[レコードソース] タブをクリックします。[コマンド タイプ] ボックスの一覧で [1 - adCmdText] をクリックすると、[コマンド テキスト (SQL)] ボックスに上記の構文の SELECT クエリを入力できます。Jet プロバイダを使用している場合、[コマンド タイプ] ボックスの一覧で [2 - adCmdTable] をクリックすると、[テーブル名またはストアド プロシージャ名] ボックスの一覧に、指定のブックで利用可能な名前付き範囲とワークシート名の両方が、名前付き範囲から先に表示されます。[テーブル名またはストアド プロシージャ名] ボックスの一覧では、ワークシート名にドル記号が適切に追加されますが、必要な角かっこは追加されません。その結果、ワークシート名を選択して [OK] をクリックしただけでは、後で次のエラー メッセージが表示されます。
FROM 句の構文エラーです。
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?
(http://support.microsoft.com/kb/314763/
)
[FIX] ADO により Excel の誤った列にデータが挿入される
削除Excel データの削除に関しては、リレーショナル データ ソースのデータより多くの制約があります。リレーショナル データベースでは、"レコード" と関連のない "行" は意味を持ちませんが、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" プロパティ以外に取得できる、より有用なテーブル情報はありません。ブックに含まれるテーブルのリストを要求するには、次のコードを使用します。
ODBC プロバイダも 9 つのフィールドを含むレコードセットを返します。そのうち次の 3 つのフィールドにのみ値が入力されています。
フィールド情報のクエリExcel データ ソースの各フィールド (列) のデータ型は次のいずれかです。
テーブルおよびフィールドとそれらのプロパティの列挙たとえば次のサンプルのような Visual Basic コードを使用して、Excel データ ソース内のテーブルと列、およびそれぞれについての情報を列挙することができます。次のサンプルでは結果が同じフォーム上のリストボックス、List1 に出力されます。データ ビュー ウィンドウの使用Visual Basic データ ビュー ウィンドウで Excel データ ソースへのデータ リンクを作成すると、上のサンプル コードから取得できる情報がデータ ビュー ウィンドウに表示されます。特に、Jet プロバイダではワークシートと名前付き範囲の両方が "テーブル" の一覧に表示されますが、ODBC プロバイダでは名前付き範囲のみが表示されることに注意してください。名前付き範囲を定義せずに ODBC プロバイダを使用した場合、"テーブル" の一覧は空になります。Excel の制限事項Excel をデータ ソースとして使用する場合は、Excel のブックおよびワークシートの内部の制約を受けます。制限事項には次のようなものがありますが、これらに限定されません。
関連情報
Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
316934?
(http://support.microsoft.com/kb/316934/
)
[HOWTO] Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
295646?
(http://support.microsoft.com/kb/295646/
)
ADO を使用して ADO データ ソースから Excel にデータを転送する方法
246335?
(http://support.microsoft.com/kb/246335/
)
[XL2003] [HOWTO] オートメーションを使用して ADO レコードセットのデータを Excel に転送する方法 247412?
(http://support.microsoft.com/kb/247412/
)
[XL2003] [INFO] Visual Basic から Excel にデータを転送する方法 278973?
(http://support.microsoft.com/kb/278973/
)
[SAMPLE] ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO) 318373?
(http://support.microsoft.com/kb/318373/
)
Visual Basic .NET で GetOleDbSchemaTable メソッドを使用して Excel からメタデータを取得する方法
詳細については、次のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/japan/partners/mtc/
(http://www.microsoft.com/japan/partners/mtc/)
関連情報この資料は以下の製品について記述したものです。
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。" | サポート技術情報の翻訳
|
先頭へ戻る
