web-dev-qa-db-ja.com

ExcelをODBCデータベースとして使用する

ODBCで使用できるように、Excelでデータベーステーブルを作成する方法を知りたい

ODBCを使用したいのですが、MS AccessまたはExcelの2つのオプションがあります。

おそらくご存じのように、一部のMS AccessファイルまたはExcelファイルをODBCソースとして示すには、以下に従う必要があります。

管理ツール->データソース(ODBC)->ユーザーDSNの選択->リストから「Excelファイル」または「MS Accessデータベース」のいずれかを選択->「設定」を押して->最後にファイル(MS AccessまたはExcel)を選択ODBCソース

まあ、それはMS Accessで正常に動作します。ファイルに接続して、内部で作成したすべてのテーブルを表示できます

しかし、Excelに関しては、ファイルに接続できますが、内部で作成したテーブルが表示されません。

「挿入」タブの「テーブル」を使用し、いくつかのヘッダーを列名として追加し、テーブルに意味のある名前を付けました。それはそれを行う方法ですか?

7
mangusta

Excelブックで「テーブル」データを参照する方法はいくつかあります。

  • ワークシート全体。
  • ワークシート上の名前付きセル範囲。
  • ワークシート上の名前のないセル範囲。

これらについては、Microsoftサポート技術情報の記事 257819 の「コードでExcelデータを選択する」セクションで詳しく説明されています。

最も簡単な方法は、データを別のシートに保持し、列名を最初の行(セルA1から開始)に配置してから、次のように実際のデータを行2から開始することです。

Excel

テストするために、そのワークブックを指す「odbcFromExcel」という名前のユーザーDSNを作成しました...

ODBC

...次に、次のVBScriptを実行して接続をテストします。

Option Explicit
Dim con, rst, rowCount
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT * FROM [Sheet1$]", con
rowCount = 0
Do While Not rst.EOF
    rowCount = rowCount + 1
    If rowCount = 1 Then
        Wscript.Echo "Data row 1, rst(""LastName"").Value=""" &  rst("LastName").Value & """"
    End If
    rst.MoveNext
Loop
Wscript.Echo rowCount & " data rows found."
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing

結果は

C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
10 data rows found.

Excelの接続の問題に役立つことを願っています。

最後のコメントとして、Excelで「数秒」かかりますが、Accessで「20〜25分程度」かかる場合、Accessを-で使用していることを強く疑います。 very非効率的な方法ですが、それは別の質問のトピックです(追求したい場合)。

編集

Excelブックにデータを挿入する場合は可能ですが、Excel ODBC接続のデフォルト設定は「読み取り専用」であるため、「オプション」をクリックする必要があることに注意してください。 > "ボタンをクリックして、そのチェックボックスをオフにします。

readonly

それが完了すると、次のコード...

Option Explicit
Dim con
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
con.Execute "INSERT INTO [Sheet1$] (ID, LastName, FirstName) VALUES (11, 'Dumpty', 'Humpty')"
con.Close
Set con = Nothing
Wscript.Echo "Done."

...確かに、提供されたデータをExcelシートに新しい行に追加します。

ただし、それでも、「スニファー」アプリをExcel ODBC DSNに向けると、「テーブル」を選択できないという問題は解決されません。

行1に列見出しのあるExcelシートを作成し、列全体を選択して、Excelの「定義名」を作成することもできます。次に、「スニファー」アプリがそれを選択可能な「テーブル」名として認識しているかどうかを確認します。

FWIW、私はExcelブックでmyTableという名前を=Sheet1!$A:$Cとして定義し、次に私の元のコード sort of SELECT * FROM [myTable]を使用しました:

C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
1048576 data rows found.

ご覧のように、最初の「レコード」を正しく取得しましたが、有効なデータの終わりを認識せず、シート内の最大100万行を読み取り続けました。

Excelを「ODBCデータベース」として使用することはあまり良い考えではないという他のコメントに同意するので、これにこれ以上の努力を払うつもりはありません。

以前に行ったAccessの使用の試みが満足のいくものではなかった理由を調べることを強くお勧めします。前に言ったように、Accessとのやり取りで本当に悪い仕事をしているように思えます。

13
Gord Thompson

最近、いくつかのデータで同様の問題が発生しました。データを範囲A1:XY12345として選択し、名前の定義ツールを使用して範囲に名前を付けるという方法で回避できました。 ODBC経由でExcelブックに接続すると、この名前付き範囲は「テーブル」として表示されますが、実際に(Excelごとに)テーブルとして定義した範囲は表示されません。

1
Alyssa Goldberg