2013-03-31 13 views
5

複数のシートを含むブックがあり、各シートには名前付き範囲の同じセットが含まれています(ブックには範囲がありません)。Excelの名前にスペースが含まれているシート上の名前付き範囲を照会できません

いずれかのシートの名前付き範囲に基づいてクエリを実行したいとします。いくつかのシートは空白のない名前を持ち、他のシートはスペースを含む名前を持っています。

私はスペースのないものに対してもこれを簡単に行うことができますが、スペースでこれを行うための構文は私を逃げ出します(そして1時間のgoogle-ing)。

名前付き範囲は、「食材」であり、1枚が「NoSpaces」と命名され、他の「スペースで」

ここで「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データベースエンジンは、オブジェクトを見つけることができませんでした...』エラー:すべてのシート 『スペースで』のために、次の試してみました」VEの。

私が述べたように、それは名前にスペースを持たないすべてのシートでうまく動作します。

空白のシートでこれを行うには、何か助けてください。

ありがとうございます!それぞれがあるにもかかわらず

Excel 2007の

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

@shahkalpeshが提供するスキーマのコードを実行すると、それは両方の名前付き範囲のためだけに、「食材」としてTABLE_NAMEを示しています(下記コメントに基づいて

UPDATES異なるシートにスコープされます)。
このドライバでは、[NoSpaces $ Ingredients]も機能しません。

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

@shahkalpeshが提供するスキーマのコードを実行すると、それは「$食材 『スペースで』「」NoSpaces $食材」としてTABLE_NAMEを示しています。このドライバでは、[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が提供するスキーマのコードを実行すると、それは "食材 'スペース$で' "" NoSpaces $食材" としてTABLE_NAMEを示しています。このドライバでは、[NoSpaces $ Ingredients]は正常に動作しますが、['With Spaces' $ Ingredients]は機能しません。

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

+0

Excel 2013を使用して、通常の範囲(名前付き範囲ではない)を導入し、コロン(「:」)を使用して問題を解決しました。例えば。 '[Report 1 $ A15]'は動作しませんが、[Report 1 $ A15:A15]は動作します。 – ZygD

答えて

6

名前の範囲の代わりにExcelの範囲を使用できますか?私は仕事に以下を得た:

SELECT * FROM [Report 1$A4:P] 

私はGetOleDbSchemaTableメソッド()メソッドからシート名を取得し、アポストロフィを削除しています。アポストロフィを持つシート名は、範囲で私のために動作しません。

if (tableName.Contains(' ')) 
      tableName = Regex.Match(tableName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$"; 
+0

ありがとうございます。私はOPと同じ問題を抱えていたし、あなたが範囲を選択している場合に周囲の引用符を削除することを確認することができます作品。 – Rivka

0

名前付き範囲に続くスペースをシートの名前は、[「マイシート$」のMyData]

ここ

はワークブック

1)に含まれるテーブルのリストを表示するために得る方法であるように書くことができます。あなたのシナリオでは、それは

strQuery = "Select * from ['With Spaces$'Ingredients]" 
次のようになります。ワークブック

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 

EDIT内のテーブルのリストを取得するためのコード

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

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

+0

それは私が正しいと思われるものです。しかし、私はそのSQLを使用すると、同じエラーをスローします。前の$と同じです。私はこれが実際にドライバのバグだと思っています。シートの名前を "WithSpaces"に変更し、 "WithSpaces $ 'Ingredients"から "Select *"を使用すると、うまく動作します。 "With Spaces"に名前を変更し、['$ Spaces' Ingredients]で「*」を使用して、エラーをスローします。 – user2229491

+0

@ user2229491:変更された回答を確認し、それが役に立たなかった場合はコメントを追加してください。ありがとう。 – shahkalpesh

+0

上記のコード(またはadox.catalog.tablesを使用)を使用すると、 'With Spaces $' Ingredientsの名前が付けられます。しかし、クエリでそれを使用しても、エラーがスローされます。また、実際のシート名やコードでスペースを取り除くことができ、うまく動作するので、スコープやミスタイピングなどの問題ではないと確信しています。それを戻して、それはエラーを投げます。 – user2229491

0

以下のクエリが機能します。名前の範囲成分がシートのスペースにあることを確かめてください。また、ブックを保存します。

strQuery = "から[スペース$食材を使っ] *を選択し、" また

あなたは&のChr "[WITH SELECT * FROM" =

strQueryの下に(32)を使用することができます& "Spaces $ Ingredients" "

+0

私が最初に試したことは...私の元の投稿からの質問のリストを見てください。 Chr(32)は残念なことに違いはありません。 – user2229491

+0

@ user2229491私の最後で働いています。どのバージョンのExcelを使用していますか? – Santosh

+0

私はexcel 2013 proを使用しています – user2229491

0

パーティーに別の後半入り口...

私はここ応答のいずれかが、シート全体のために働くことを得ることができなかったので、私は全体のシートの名前付き範囲を作った(すべて選択細胞およびそれらに名前を与える - 私はPOListそれらを呼ばれる)ので、それに言及しない:

UPDATE [POList] SET..... etc 

だから、何の単一引用符、ノーバッククォートなし$記号ではなく、さらにシート名。

言われているように、問題のブックには1つのシートしかありません(名前にはスペースがあります)。

これはすべての人の状況では動作しませんエクセル2002(!)と、次の接続コードを明らかにこれ

Dim cn As ADODB.Connection 
Set cn = New ADODB.Connection 
With cn 
    .Provider = "Microsoft.Jet.OLEDB.4.0" 
    .ConnectionString = "Data Source=C:\Purchase Req No. List.xls; Extended Properties=Excel 8.0;" 
    .Open 
End With 

を使用して動作し、kludgey回避策を少しですが、多分誰かがそれが役に立つでしょう。 ..

0

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

strQuery = "Select * from ['With Spaces$']" 
関連する問題