2013-05-22 109 views
4

我有得到利用ADO工作表的內容的ADODB記錄,如下功能:ADO被截斷的Excel數據

Function WorksheetRecordset(workbookPath As String, sheetName As String) As adodb.Recordset 

Dim objconnection As New adodb.Connection 
Dim objrecordset As New adodb.Recordset 

On Error GoTo errHandler 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H1 

objconnection.CommandTimeout = 99999999 

objconnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    "Data Source=" & workbookPath & ";" & _ 
     "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";" 

objrecordset.Open "Select * FROM [" & sheetName & "$]", _ 
    objconnection, adOpenStatic, adLockOptimistic, adCmdText 

If objrecordset.EOF Then 
    Set WorksheetRecordset = Nothing 
    Exit Function 
End If 

objrecordset.MoveLast 
objrecordset.MoveFirst 

Set WorksheetRecordset = objrecordset 
Exit Function 

errHandler: 
Set WorksheetRecordset = Nothing 

End Function 

我在導入數數據的問題,其中的數字格式到1位小數,但他們實際上有2個小數位。這隻有在數據類型在列中混合時纔會發生。例如,這些值:

0.03 
0.05 
0.08 
0.13 

當我在這個表將它們設置爲1的小數位:

+-------+-----------+ 
| value | something | 
+-------+-----------+ 
| 0.0 | a   | 
| 0.1 | a   | 
| 0.1 | sda  | 
| 0.1 | sdf  | 
+-------+-----------+ 

然後記錄得到正確的2個小數位值。但是,當我把它們放在這張表中時:

+---------+-----------+ 
| value | something | 
+---------+-----------+ 
| asdfasd | asdfas | 
| 0.0  | a   | 
| 0.1  | a   | 
| 0.1  | sda  | 
| 0.1  | sdf  | 
+---------+-----------+ 

然後記錄集只獲得1位小數位值,它會選擇「0.0」而不是「0.03」。我認爲這是因爲第一行中的字符串導致ADO將列中的所有值視爲顯示的字符串。

有沒有辦法,我仍然可以拿起文本字符串,但也獲得正確的數字值的小數位數?

編輯:只是注意到一些奇怪的東西。當我在工作簿打開時運行這個時,記錄集會得到正確的小數位數。如果在工作簿關閉時運行它,它只會顯示小數點。

+0

您是從工作簿還是其他應用程序調用代碼? – Santosh

+1

如果這是Excel-VBA,爲什麼不考慮利用Excel對象模型並打開源工作簿?您可以將光標變爲沙漏並關閉屏幕更新,因此用戶不會「看到」打開然後關閉的工作簿。在所有退出路徑上重新啓用屏幕更新*,特別是錯誤退出路徑*,以避免支持用戶說「我的Excel只是凍結」。 –

+0

@Santosh,這是從另一個工作簿中調用。 – sigil

回答

1

試試下面爲您objRecordset功能和查詢(在MS查詢測試用Excel):

With objrecordset 
    .CursorLocation = adUseClient 
    .LockType = adLockOptimistic 
    .CursorType = adOpenStatic 
    .ActiveConnection = objconnection 
    .Open "Select format(`" & sheetName & "$`.value,'0.00') as [value], something FROM [" & sheetName & "$]" 
End With 

所以,這裏的JET SQL format Function迫使ADO的SQL語法分析輸出字符串格式化爲0.00

另外,我的CursorTLocation屬性設置爲adUseClient,所以你不會需要使用MoveLastMoveFirst

讓我們知道您的身體情況如何

菲利普

+0

這沒有奏效。它所做的只是在截斷值的末尾添加0:「0.00」,「0.10」等。此外,列的名稱從工作表更改爲工作表;它通常但不總是在相同的列索引處。所以我需要一種方法來獲取每列的實際值(而不是顯示值)。 – sigil

+0

請注意,如果我在工作簿打開時執行此操作,我會得到正確的值。但是我要在書被關閉時運行它。 – sigil

0

Unfortuately我曾經有過同樣的問題,其原因是,ACE驅動程序僅在一列看的第一個值來決定數據類型整個專欄。因此,您可以嘗試使用頂部的數值對數據進行排序。

在Excel中創建連接表的「黃金標準」方法是使用vLookup。即使它看起來有點「業餘」,我也會建議這樣做。

此外,它似乎將IMEX設置爲1基本上強制ACE返回文本表示,以便數值列中的字母數字值不返回爲空。