2011-10-19 6 views
1

私はExcel 2003用のVBAマクロを作成しています.SQLデータベースからExcelシートにさまざまなデータをインポートしています。 は、私はそれを行うには、2つの方法を試してみました:ADOADOが間違った順序を返します

1. QueryTables.Add(...)2.より良い」または「クリーナー」ソリューションであるように見えたので、私は、ADOの賛成だった 。私はデータベースからADOで数値を取得しようとするまでうまくいっていました。値1842,47078を返すのではなく、0,01842を返しました。(ちょっと私の意味を示してください) 奇妙なことです: QueryTables.Add(...)私は正しい値を取得します

私はまったくこのようなことが起こらない理由を知りませんでしたが、解決策をインターネットで検索しましたが、何も見つかりませんでした。データベースの文字列はすべて正常です。

誰でも私にこれを手伝ってもらえますか?

ドライバはFirebird/InterBase(r)ドライバでODBCに接続しています。ここ は、私は物事を行う方法を少し例を次に示します。

'ADO solution = wrong value 
    With adoConnection 
     .Provider = "MSDASQL" 
     sConnection = "ODBC;DSN=ABC;Driver=Firebird/InterBase(r) driver;Dbname=blaName.gdb;" 
     ConnectionString = sConnection 
     .Open 
    End With 
    SQL_Import = "SELECT A.PRICE AS ""Price"" FROM TABLE A WHERE A.KEY ='x1234' " 
    adoRecordset.ActiveConnection = adoConnection 
    adoRecordset.Open SQL_Import 
    varSol = adoRecordset.Fields("Price") 
    Sheets(3).Cells(1, 1).Value = varSol 
    adoRecordset.Close 
    adoRecordset.ActiveConnection = Nothing 
    adoConnection.Close 
    'QueryTables solution = right value 
    Set QueryTbl = Sheets(3).QueryTables.Add(Connection:=sConnection, Destination:=Sheets(3).Cells(1, 2)) 
    With QueryTbl 
     .CommandText = SQL_Import 
     .AdjustColumnWidth = True 
     .Refresh BackgroundQuery:=False 
     .Delete 
    End With 

私は誰も私を助けることができると思います。

更新: 私はそれを何とかしていますが、何が間違っているのか分かりません。 "SELECT Price as numeric(15、2)..."というクエリを使用すると正しい結果が得られます。 これは奇妙なことですが、私はコンピュータ上でC#ですべてを試してみましたが、問題なく動作しました。したがって、エラーはExcelやVBAのいずれかによって発生しているようです。

+0

レコードセットが返された後にブレークして、正しい値がレコードセットに返されているかどうかを調べます。そうでなければ、接続の設定方法に問題がある可能性があります。値がレコードセット内で正しく表示されている場合は、レコードセットからデータを渡すときにエラーが発生する可能性があります。私はファイヤーバードの接続に精通していないので、私はあまり助けにはならない。 – Fink

+0

最初のWith With End WithブロックでConnectionStringにドットがないので、実際にそのプロパティを設定していない可能性があります。それがあなたが見ているものに関連しているかどうかはわかりません。 –

+0

実際のコードの.ConnectionStringです。私はこの例を書いたときにちょうど間違っていました。私はマクロを停止し、レコードセットをチェックしました。値は、レコードセットに戻るときに既に間違っています。だから実際には接続に問題があるようです。おそらくプロバイダーですか? – MiVoth

答えて

0

Firebirdについてわかりませんが、問題の列がMoneyまたはCurrencyタイプ(ADOがadCurrencyと呼んでいるもの)にあり、ADOにこれを伝えていないと思われるため、適切に変換していません。

私はあなたがそれがadCurrencyなどであることがわかると思います。

+0

adoRecordset.Fields( "Price")。タイプは 'adNumeric'です。 – MiVoth

1

は、セルに

varSol = adoRecordset.Fields("Price") 
Sheets(3).Cells(1, 1).NumberFormat = "###0,#######0" 
Sheets(3).Cells(1, 1).Value = varSol 
0

をするNumberFormatを適用してください、私はこの問題は、/だったですが、私は解決策を持っているもの本当にを知りません。 私は

SQL_Import = "SELECT A.PRICE*1 FROM TABLE A WHERE A.KEY ='x1234' " 
に私のSQL文字列を変更した場合は期待と私は正しい結果を得るようすべての作品。

私の解決策に1を乗じたり、ゼロを追加したりしています。

関連する問題