6

複数のシートを含むワークブックがあり、各シートには同じ名前付き範囲のセットがあります (つまり、ワークブックではなくシートにスコープが設定されています)。

いずれかのシートの名前付き範囲に基づいてクエリを実行したい。名前にスペースが含まれていないシートもあれば、名前にスペースが含まれているシートもあります。

スペースのないものでも簡単に実行できますが、スペースを使用してこれを行うための構文は私を逃れます (そして 1 時間のグーグル検索)。

名前付き範囲は「Ingredients」で、1 枚のシートは「NoSpaces」、もう 1 枚は「With Spaces」という名前です。

「NoSpaces」シートで正常に機能するコードは次のとおりです。

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dictNewRecipesToCheck(arrKeys(0)) & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;"""
strQuery = "Select * from [NoSpaces$Ingredients]"
Set objConn = New ADODB.Connection
Set objRecordSet = New ADODB.Recordset
objConn.Open sConnString
objRecordSet.Open strQuery, objConn

「スペースあり」シートについて、次のすべてを試しました。

strQuery = "Select * from [With Spaces$Ingredients]"
strQuery = "Select * from ['With Spaces'$Ingredients]"
strQuery = "Select * from ['With Spaces$'Ingredients]"
strQuery = "Select * from [With_Spaces$Ingredients]"

毎回、「Microsoft Access データベース エンジンはオブジェクトを見つけられませんでした ...」というエラーが表示されます。

前述したように、名前にスペースが含まれていないすべてのシートで問題なく機能します。

スペースのあるシートでこれを機能させるための助けがあれば、大歓迎です。

ありがとう!

以下のコメントに基づく更新:

エクセル2007

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;"""

@shahkalpesh によって提供されたスキーマ コードを実行すると、TABLE_NAME が両方の名前付き範囲の単なる「成分」としてリストされます (それぞれが別のシートにスコープされていても)。
このドライバーでは、[NoSpaces$Ingredients] でも機能しません。

sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"""

@shahkalpesh によって提供されたスキーマ コードを実行すると、TABLE_NAME が "NoSpaces$Ingredients" および "'With Spaces'$Ingredients" としてリストされます。このドライバーでは、[NoSpaces$Ingredients] は正常に機能します (ACE ドライバーでは機能しませんでした)。
ただし、スキーマによって報告された正確な名前を使用すると、['With Spaces'$Ingredients] は機能しません。

エクセル2013

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;"""

@shahkalpesh によって提供されたスキーマ コードを実行すると、TABLE_NAME が "NoSpaces$Ingredients" および "'With Spaces$'Ingredients" としてリストされます。このドライバーでは、[NoSpaces$Ingredients] は問題なく動作しますが、['With Spaces'$Ingredients] は動作しません。

最後に、 http://db.tt/3lEYm2g1を参照して、Excel 2007 で作成された、(少なくとも) 2 台の異なるマシンでこの問題が発生するサンプル シートを参照してください。

4

6 に答える 6

7

名前付き範囲の代わりに Excel 範囲を使用することは可能でしょうか? 私は次のように動作しました:

SELECT * FROM [Report 1$A4:P]

GetOleDbSchemaTable() メソッドからシート名を取得し、アポストロフィを削除しています。アポストロフィを含むシート名は、範囲では機能しません。

if (tableName.Contains(' '))
            tableName = Regex.Match(tableName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$";
于 2013-07-16T20:27:12.987 に答える
0

以下のクエリが機能します。名前付き範囲IngredientsがシートWith Spaceに存在することを確認してください。ブックも保存します。

strQuery = "Select * from [With Spaces$Ingrients]"

または、以下を使用できます

strQuery = "Select * from [With" & Chr(32) & "Spaces$Ingredients]"

于 2013-03-31T16:20:21.567 に答える
0

私はこれと同じ問題を抱えていて、名前付き範囲なしで解決できました。さらに、私の問題の 2 つの部分として、ワークシート名の末尾にスペースがないことを確認してください。試す...

strQuery = "Select * from ['With Spaces$']"
于 2015-06-17T19:36:04.397 に答える
0

スペースの後に名前付き範囲が続くシートの名前は、['My Sheet$'MyData] のように記述できます。

ワークブックに含まれるテーブルを一覧表示する方法は次のとおりです

1) ワークブック内のテーブルのリストを取得するコード

dim i as Integer

Set objRecordSet = objConn.OpenSchema(adSchemaTables)
Do While Not objRecordSet.EOF
    i = 1
    For i = 0 To objRecordSet.Fields.Count - 1
        Debug.Print objRecordSet.Fields(i).Name, objRecordSet.Fields(i).Value
    Next

    objRecordSet.MoveNext
Loop

編集:あなたのシナリオでは、それは

strQuery = "Select * from ['With Spaces$'Ingredients]"

EDIT2: 申し訳ありませんが、最初に間違ったコードを貼り付けました。TABLE_NAME上記のコードをリスト 1 で使用し、すぐに表示されるウィンドウでを探してください。シート名のプレフィックスが付いた名前付き範囲のリストは、TABLE_NAME(クエリできる) に対して表示されます。

また、名前付き範囲がワークシートにスコープされていることを確認してください。シート名と範囲名の大文字と小文字がクエリと一致していることを確認してください。

于 2013-03-31T16:11:09.703 に答える