2017-05-11 9 views
1

私は独学のExcel VBAとSQLユーザーです。私は複雑さを加える前にいくつかの簡単なクエリをテストしています。私はここで驚くほど明白な何かを見逃しているに違いありません。EXCEL SQL SELECTはThisWorkBook内のフィールド名を認識しません

私は、アクティブワークブック(ThisWorkBook)のテーブルでSQL SELECT文を実行するためにADO接続を使用しています。 Excelテーブルの名前は "tbl_QDB"で、ワークシート "MyQDB"にあります。テーブルはセルA1で始まります。したがって、テーブルHeaderRowRangeの上に空白またはポピュレートされたセルはありません。

ThisWorkBookへのADO接続をセットアップしましたが、これは問題なく動作しています。私はこの最も単純な基本的なSELECTクエリを実行することができます

Sub ConnectionOpen2() 

'### UNDER DEVELOPMENT 
Dim sconnect As String 
Const adUseClient = 3 
Const adUseServer = 2 
Const adLockOptimistic = 3 
Const adOpenKeyset = 1 
Const adOpenDynamic = 2 

'used to connect to this workbook for SQL runs 

On Error GoTo err_OpenConnection2 

Set cn2 = CreateObject("ADODB.Connection") 
Set rec2 = CreateObject("ADODB.Recordset") 
rec2.CursorLocation = adUseClient 
rec2.CursorType = adOpenStatic 
rec2.LockType = adLockOptimistic 

datasource = ThisWorkbook.FullName 

    sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
      "Data Source=" & datasource & ";" & _ 
      "Extended Properties=""Excel 12.0;HDR=YES;ReadOnly=False;Imex=0"";" 

    cn2.Open sconnect 

'etc, etc... 

End Sub 

:ここでは、コードです

SQLSTR="SELECT * FROM [MYQDB$]" 
rec2.open SQLSTR, cn2 

これは動作し、10個のレコードを生成し、すなわちrec2.recordcount = 10。

私はこれをしようとした場合ただし、エラー:

SQLSTR="SELECT QID_1 FROM [MYQDB$]" 

enter image description here

QID_1は、ワークシート "MyQDB" の表に有効なフィールドです。 QID_1を()または[]または「 」で囲んでもエラーは変わりません。フィールド名をメイクアップしたフィールドで置き換えることもできます。 DonaldDuckと私は同じエラーになります。

"*"を使用しても、テーブル内のフィールド名を使用しないと、SELECT文はなぜ機能しますか?これはとても基本的なように思えるので、シンプルだが重要な点を見逃しているに違いない。

誰かが間違いを指摘できるかどうか本当に感謝します!

+0

なぜ* Excel *内のExcelシートを*クエリ*しようとしていますか?シートを読み込んでセルを読み取るだけです。 –

+0

'QID_1'はフィールド名ではありません。 Excelはフィールドを持たず、* cells *を持ちます。セルアドレスは、例えば、「$ A $ 1」である。エラー自体は、クエリにパラメータ指定子が含まれていても、パラメータ値は渡されなかったことを意味します。ほとんどのExcelは、パラメータの予期しない 'QID_1'値を混乱させました –

+0

なぜ' QID_1'をフィールドと呼びますか? Excelには行と列があり、フィールドはありません。特定の範囲を*名前指定してSQLクエリのテーブルとして扱うことができます。名前付きセルはまだ1行1列の範囲です。テーブルはまだ名前付き範囲です。あなたの*クエリ*は特定のテーブルではなく、シート全体を対象としています。 –

答えて

3

フィールドが存在する場合、SQLは機能するはずです。 Select *を実行し、フィールドリストをダンプ:

For i = 0 To rec2.Fields.Count - 1 
    Debug.Print rec2.Fields(i).Name 
Next i 
+0

ご意見ありがとうございます。 – englandexpects

0

はあなたのコメントありがとうございました。 その提案@FunThomasは目を見張るものでした!結果はF1、F2、F3などであるため、フィールド名(または必要に応じて列名)は認識されませんでした。

これは、閉鎖された外部ブックの別のテーブルとこのテーブルを結合しようとした後、何も機能しなかった理由を説明します。 SQLのエラーメッセージは非常に鈍っている可能性があり、フィールド名を認識できないと言っていませんでした。

私はこの問題を修正しました。

  1. 私はヘッダーの上の行でこのテーブルを開始しました。これらのセルのうちの2つで、上記の が最後の接続時間とステータスを別の ワークブックテーブルに記録しました。その前に、これらの余分な行は、 というヘッダーの上にあるセルに入力され、 SQLで問題を引き起こしていました。 Excelテーブルにデータを格納しているにもかかわらず、 ExcelのSQL「エンジン」は、データが格納されているシート[MYQDB $]を参照します。 (シートと範囲を指定できますが、 実際のテーブル名を範囲として使用します)。

  2. テーブルのヘッダー範囲の上に空白の行があることは問題ありません。したがって、 は、表 headerrowrangeの上のデータを含むセルを削除しました。代わりに、私はテキストボックスを配置し、数式を使用して 最後の接続時間とステータスが だった別のシートを見て、テキストボックスのテキストを供給しました。

  3. これで、セルを使用していないテキストボックスでもExcel SQLに問題が発生することがわかりました。

  4. ここに質問を投稿する前に、ブックのコピーを作成し、テキストボックスとテーブルのヘッダー範囲の上の行を削除しました。私はまだエラーがあります。私はまだフィールド名(@ FunThomasの提案による)としてF1、F2、F3等を得ました。

  5. のみ、これらの行とテキストボックスを削除してからテーブルのサイズを変更した後(実際には、同じ範囲以前のようには)エクセルSQLが適切なフィールド名を認識しました。私はテーブルヘッダーレンジの上に空白の行を挿入することもできましたが(好奇心のためだけ)、SQLはまだ機能していました。

  6. Excelは古いテーブル定義をメモリに保持していますが、テーブルheaderrowrangeの上にあるすべてのデータを削除してテーブルのサイズを変更するだけで、それをリフレッシュしたようです。おそらく、私は将来的にあまり怠惰でなければならず、sqlのシート名と範囲(テーブルアドレス)を呼び出す必要があります。おそらく、headerrowrangeの上のセルのデータを無視するでしょうか?

@PanagiotisKanavos:私はもともと閉じExcelワークブックではThisWorkbookに1つ、別の、(それゆえ彼らは、フィールド名を持っているだけではなく、範囲、実際のエクセル表)2つのテーブルを比較しようとしていました。これを行うにはSQLが最適です。これらのテーブルの間で作業するために左結合を取得することに失敗した(そして、このQuestionは今、なぜそれがうまくいかないのかを明らかにしたかもしれません!)私は外部ワークブックのデータをThisWorkBookに持ち込み、そこで比較することにしました。次に、違いを見つけてレコードセット(したがってSQL)に格納してから、外部のワークブックにINSERT INTOする予定でした。

あなたの助けを借りてくれてありがとう!

+0

PowerQueryを使用して、複数のテーブルやファイルからデータを選択し、それらを結合して処理することができます。 SQLは最良の方法ですが、VBAでは使用しません。古いSQLデータ機能はPowerqueryによって優れています。 –

+0

私は組織がそのようなユーティリティの使用を制限したことを除いて、Power Queryを使用できることを望んでいます。標準のデスクトップ構成ではありません。このツールを他のユーザーに展開できるように、基本を守る必要があります。 – englandexpects

+0

これはユーティリティではありません。 Excel 2013および2016のビルトイン機能です。これは、以前のバージョンのデータ接続ツールに代わる標準です。それは2010年に無料のアドインとして入手できました。 –

関連する問題