ADO obcina dane Excela
Mam funkcję, która pobiera zestaw rekordów ADODB z zawartości arkusza przy użyciu ADO, w następujący sposób:
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
Mam problem z importowaniem danych liczbowych, gdy liczby są sformatowane do 1 miejsca po przecinku, ale w rzeczywistości mają 2 miejsca po przecinku. Dzieje się tak tylko wtedy, gdy typ danych jest mieszany w kolumnie. Na przykład te wartości:
0.03
0.05
0.08
0.13
Kiedy ustawię je na 1 miejsce po przecinku w tej tabeli:
+-------+-----------+
| value | something |
+-------+-----------+
| 0.0 | a |
| 0.1 | a |
| 0.1 | sda |
| 0.1 | sdf |
+-------+-----------+
następnie zestaw rekordów otrzymuje poprawne 2 miejsca po przecinku. Ale kiedy umieściłem je w tej tabeli:
+---------+-----------+
| value | something |
+---------+-----------+
| asdfasd | asdfas |
| 0.0 | a |
| 0.1 | a |
| 0.1 | sda |
| 0.1 | sdf |
+---------+-----------+
wtedy zestaw rekordów otrzymuje tylko wartości 1 miejsca po przecinku, np. podnosi „0.0” zamiast „0.03”. Myślę, że to dlatego, że łańcuch w pierwszym wierszu powoduje, że ADO traktuje wszystkie wartości w kolumnach jako łańcuchy, tak jak jest wyświetlane.
Czy jest jakiś sposób, w jaki wciąż mogę odebrać ciąg tekstowy, ale także uzyskać prawidłową liczbę miejsc dziesiętnych w wartościach liczbowych?
EDYCJA: Właśnie zauważyłem coś dziwnego. Gdy uruchamiam to, gdy skoroszyt jest otwarty, zestaw rekordów otrzymuje poprawne miejsca dziesiętne. Jeśli uruchomię go, gdy skoroszyt jest zamknięty, otrzyma tylko wyświetlane cyfry dziesiętne.