我正在为Excel 2003编写VBA宏。我正在将各种数据从sql数据库导入Excel工作表。
我尝试了两种方法:
QueryTables.Add(...)
我支持ADO,因为它似乎是“更好”或“更清洁”的解决方案。
一切顺利,直到我试图从数据库中获取ADO的数值。它返回1842,47078
而不是返回值0,01842
。 (只是为了表明我的意思)
奇怪的是:当我用QueryTables.Add(...)
尝试时,我得到正确的价值。
我完全不知道为什么会发生这种情况,在互联网上搜索解决方案但没有找到任何结果。它恰好发生在数值上。如果我从数据库中得到一个字符串,一切都很好。
任何人都可以帮我这个吗?
驱动程序是与ODBC连接的Firebird / InterBase(r)驱动程序。 这是我做事的一个小例子:
'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)...
。答案 0 :(得分:1)
尝试将NumberFormat应用于单元格
varSol = adoRecordset.Fields("Price")
Sheets(3).Cells(1, 1).NumberFormat = "###0,#######0"
Sheets(3).Cells(1, 1).Value = varSol
答案 1 :(得分:0)
我对firebird一无所知,但听起来有问题的列是Money或Currency类型(ADO称之为adCurrency)并且你没有告诉ADO这个,所以它没有适当地转换它。
查看adoRecordset.Fields(“Price”)。输入,我打赌你会看到它是adCurrency等。
答案 2 :(得分:0)
我真的不知道什么问题是什么,但我有一个解决方案。 如果我将我的SQL字符串改为
SQL_Import = "SELECT A.PRICE*1 FROM TABLE A WHERE A.KEY ='x1234' "
一切都按预期工作,我得到了正确的结果。
所以我的解决方案是乘以1或加零。