2016-12-05 2 views
0

に列の別名を使用して値を取得し、私はVBScriptのエクセルADO接続:コードは次のSQLクエリ

objTempRecordset.Fields.Item(0).Value

を使用してExcelからのカウントを取得することができますしかし、私は、SQLの列名の別名を使用します。 すなわち

sSQL = "Select Count(*) AS RecCount FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R001" & Chr(39) 

と私が使用して結果を取得したいが:

objTempRecordset.Fields.Item("RecCount").Value

私もobjTempRecordset.Fields.Item("_Count(*)_").Valueが、

は、誰かが私には、列名の別名を使用する方法を教えてくださいすることができていない運を試してみましたこの場合?

注:Excelは2列 IDを有している。例えば、 "R001"、 "R002" タイプなどの値で:

:例えば、 "A"、 "B"、 "C"

サンプルコードなどの値と

sSQL = "Select Count(*) FROM [NELimits$] A WHERE A.Type = 'A' AND A.ID = " &Chr(39) & "R003" & Chr(39) 
Sqlquery = sSQL 
sFilePath = "C:\Temp\DataSheet.xlsx" 

Dim objTempConnection : Set objTempConnection = CreateObject("ADODB.Connection") 
Dim objTempRecordSet : Set objTempRecordSet = CreateObject("ADODB.Recordset") 

Dim strPath 
'Define constants for objTempRecordset 
Const adOpenStatic=3 
Const adLockOptimistic=3 
Const adLockPessimistic=2 
Const adCmdText = &H001 

'Open connection 
objTempConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& sFilePath &";Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 

objTempRecordset.ActiveConnection = objTempConnection 
objTempRecordset.CursorType = adOpenStatic 
objTempRecordset.LockType = adLockOptimistic 
objTempRecordset.Open Sqlquery 

If objTempRecordset.EOF Or objTempRecordset.BOF Then 
    msgbox "no record" 
End If 

msgbox "Record Count: "&objTempRecordset.RecordCount 

msgbox "Value:" & objTempRecordset.Fields.Item(0).Value 

+0

はちょうどその ** objTempRecordset.Fields.Item(0).nameの** 戻り** Expr1000 ** と ** objTempRecordset.Fields.Item( "Expr1000")に気づいた。バリュー** 戻り値 しかし、** Expr1000 **の意味とその割り当て方法についてはわかりません。 異なるExcelシート、データなどで変更されるかどうかわからないため、別名 – Yogesh

+0

に基づいてデータを取得できるように、列のエイリアスを定義する方法が必要解決: ... "SELECT column_name ** As [エイリアス名] ** FROM ... "SQLで問題を解決しました。 この投稿に感謝します:http://stackoverflow.com/questions/37466225/expr1000-error-when-performing-a-sum-on-a-sql-query-in-excel – Yogesh

+0

あなたは本当に 'objTempRecordset.Fields .Item( "RecCount")。Value'は、最初のSQLクエリ(コードブロック内の2番目のクエリではない)を使用した場合に必要なように機能しませんでしたか?最初に、列エイリアス* RecCount *を割り当てましたが、ACE SQLエンジンがジェネリック* Expr1000 *として割り当てる秒ではありません。 – Parfait

答えて

1
スペースで(ワークブックを照会して、ここで使用される)ACEのSQLエンジンは、元のフィールド名、列の別名、またはテーブル名、特殊文字(英数字以外)で

、またはreserved wordsに包まする必要があります角かっこまたはを適切にエスケープするにはバックスティックを使用します。

スペース

sSQL = "Select Count(*) AS [Rec Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

特殊文字(例えば、ハイフンおよびポンド/ハッシュタグ記号)

sSQL = "Select Count(*) AS [Rec-Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec-Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

sSQL = "Select Count(*) AS [Rec#] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Rec#` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

予約語(例えば、カウント)

sSQL = "Select Count(*) AS [Count] FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 
sSQL = "Select Count(*) AS `Count` FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

そうでない場合は、任意のフィールド名または列の別名は、クエリ内の正当なものであると次の形式でレコードセットで読むことができます:

objTempRecordset.Fields.Item(0).Value    ' BY INDEX IN ITEM ' 
objTempRecordset.Fields.Item("Rec Count").Value  ' BY NAME IN ITEM ' 
objTempRecordset.Fields("Rec Count").Value   ' BY NAME IN FIELD COLLECTION ' 
objTempRecordset![Rec Count].Value     ' BY NAME (EXCLAMATION POINT QUALIFIER) ' 

さらに、欠落している列の別名は、ACEに特別な方法で処理されます。

クエリ式の不足のエイリアス(例:、重複フィールド2つの欠落エイリアス上記について

sSQL = "Select ID, ID FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

にエイリアスを欠落

sSQL = "Select Count(*) FROM [NELimits$] A" _ 
      & " WHERE A.Type = 'A' AND A.ID = 'R003'" 

)機能集約カウント、ACEエンジンは、通常、(MSアクセス内部ます。Expr1から始まる列の別名を作成します - ACEエンジンへの通常のインターフェイス)またはExpr1000(ODBC接続の場合)、およびその他の名前のない式または名前のない重複フィールド参照の場合は増分します。

+0

恐ろしい!詳細な回答をありがとう@パルフェット – Yogesh

+0

ああ!それを知らなかった。完了! – Yogesh

関連する問題