Excelデータソースの接続文字列パラメータ
前回の記事では、ExcelとテキストファイルをDAOを使用してデータベースであるかのように扱う方法と、リンクせずに開く方法について説明しました。それらはODBCドライバーを使用しないため、それらの接続文字列は、ODBC接続文字列で見慣れているものとはまったく異なる形式になります。 Excel接続文字列パラメータに関するドキュメントが不足しています。これは、いくつかのギャップを埋め、パラメータの影響について話し合うための最善の努力です。
Excel接続文字列パラメータ
3つの異なるデータソースの「タイプ」がありますが:
-
Excel 8.0
:97-2003xlsファイル -
Excel 12.0
:xlsbファイル -
Excel 12.0 Xml
:xlsxファイル
それらはすべて同じパラメータを使用します。
パラメータのリストは次のとおりです。
HDR
パラメータ:ヘッダー行
はいコード> :最初の行はヘッダーであり、「テーブル」/「レコードセット」の列名になる必要があります
NO
:最初の行は同じように扱われ、単なるデータです。すべての列名には「FN」という名前が付けられます。「N」は1で始まる数字です
IMEX
パラメータ:インポート/エクスポート動作
これは、内容に基づいて列のデータ型を定義する方法を管理します:
1
:列に異なるデータ型が含まれている場合は、文字列として扱います。それ以外の場合は、列を最適なデータ型に一致させます。
2
:サンプルに基づいて、列を常に特定のデータ型に一致させます。予想されるデータ型と一致しないデータを含む行を読み取るときに、読み取りエラーが発生する可能性があります。
ACCDB
パラメータ:AccessがACCDBファイル形式を使用していることを示しますか?
デフォルトでは、これは常にaccdbファイル形式でACCDB=YESに設定されます。ただし、省略したり、NOに設定したりしても何も起こらないようです。少し謎です。このパラメータの影響を誰かが共有できる場合は、コメントで投稿してください。ブログを更新します。
データベース:Excelワークブックへのパス
パラメータには、ブックの名前を含む完全修飾パスが含まれている必要があります。
最小動作接続文字列
DATABASEは、データ型sourceキーワードに加えて、唯一の必須パラメーターであることに注意してください。したがって、最小の有効な接続文字列は次のようになります。
Excel 8.0; DATABASE =C:\ Links \ Products.xls
接続文字列でシートまたは範囲を指定する
前のサンプルでは、シートが「 DAO.TableDef
」を表していることがわかりました。 「。ただし、「 Tabledef
」になることができるのはワークシートだけではありません。 「。 Excelスプレッドシートに名前付き範囲が含まれている場合、名前付き範囲は「 Tabledef
」として報告されます。 " 同じように。さらに、セルアドレスを使用してシート内の任意のブロックを「クエリ」できます。例:
Dim db As DAO.Database Dim rs As DAO.Recordset Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Set rs = db.OpenRecordsset("Sheet$1A1:A3") Debug.Print rs.Name, rs.Fields.Count
セルアドレスはシートの使用範囲を超えることはできないことに注意することが重要です。たとえば、 Products.xlsx
実際にはA1:B3にのみコンテンツがあります。つまり、Sheet1 $ A1:D5を使用してレコードセットを開いた場合でも、フィールド数は2つ、レコード数は3つしか得られません。余分な空白の列/行は単に無視されます。反対に、 A1:B3
の外側のどこかでセルを汚した場合 、シートの UsedRange
これで、より大きくなり、クエリには空白の列と行が含まれるようになります。
したがって、これらはExcelの「データベース」でのクエリで使用する有効な名前です。
-
Sheet1 $
–ワークシートの使用範囲全体。 -
Sheet1 $ A1:B4
–内容が入力されている場合、2列と3行(ヘッダーは含まない)のみ。そうしないと、列または行が要求よりも少なくなる可能性があります。 -
ProductsRange
–その名前の名前付き範囲。
ユーザーが新しい列または行を挿入したが名前付き範囲の内容を変更しなかったために範囲が移動した場合は特に、コード内のアドレスをハードコーディングしないようにするため、実用的な名前付き範囲を使用する方がはるかに良いと思います。 。ただし、特にサードパーティからスプレッドシートを受け取っているため、その内容や形式を制御できない場合は、必ずしも実用的とは限りません。この場合、SQLクエリの記述も機能します。
Excelデータソースのクエリ
形式を制御できず、特定の列と行が実際に存在すると確信している場合でも、絶対アドレスに依存したくないとします。そのような状況では、最善の方法はクエリを実行することです。行を1つだけ選択する例を次に示します。
Dim db As DAO.Database Set db = DBEngine.OpenDatabase(vbNullString, False, False, "Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\Links\Products.xlsx") Dim rs As DAO.Recordset Set rs = db.OpenRecordset("SELECT d.[Count] FROM [Sheet1$] AS d WHERE d.[Products] = 'Bananas';") Debug.Print rs.Fields(0).Value
うまくいけば、これは、各行を繰り返して「バナナ」が含まれている行を見つけ、列を右に読んでカウントを取得するよりもはるかに簡単であることがわかります。この場合、クエリはExcelの自動化よりも優れています。
結論
DAOを使用すると、Excelデータソースを操作して、リレーショナルデータソースであるかのように見せかけ、Excelを自動化する一連のVBAコードを記述して、必要なデータ。接続文字列のパラメータは非常に単純で、パスがあれば、Excelスプレッドシートをリンクしたり開いたりするのに適しています。
次の記事では、テキストファイルの接続パラメータについて説明します。