Excel VBA ADO 截取小数(ADO 中可能存在错误?)
Excel VBA ADO Cutting Decimals (Possible Bug in ADO?)
有人可以帮我解决这个问题吗?
问题:
我在一个模块中有下面的代码,它通常可以完美地工作,但是当我 运行 它在 this sample file 上时,我注意到 "Upper Limit" (D 列)中的小数被截断了。
我找到的一个临时解决方案是我必须在示例文件中将上限从 1 修改为 1.0(因此在末尾添加“.0”)第 26 行,使其看起来像一个十进制数。在此之后,小数被正确导入 sheet。但是,这不是解决方案。
我正在使用:
Excel 2013 (15.0.5111.1000) 32 位(办公包为:MS Office Standard 2013)并启用以下库
如何重现:
- 将下面的代码放在一个模块中,运行它在示例文件中
- 注意 D 列。从第 6 行开始,所有小数点都被删除。你会
只看到整数。
- 现在,打开示例文件(以Notepad++为例),修改
第 26 行的上限值从“1”变为“1.0”,然后保存。
- 运行 下面的代码再次出现在修改后的示例文件中,注意
D 列(上限),从第 6 行开始所有小数
出现。
知道为什么会这样吗?
Sub ADODB_Import_CSV()
ThisWorkbook.Sheets(1).Activate
ThisWorkbook.Sheets(1).Cells.Clear
Dim Connection As New ADODB.Connection
Dim Recordset As New ADODB.Recordset
On Error Resume Next
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
On Error GoTo 0
ImportedFileFullPath = Application.GetOpenFilename
If ImportedFileFullPath = False Then Exit Sub
ImportedFileDirPath = Mid(ImportedFileFullPath, 1, InStrRev(ImportedFileFullPath, "\"))
ImportedFileName = Mid(ImportedFileFullPath, InStrRev(ImportedFileFullPath, "\") + 1, Len(ImportedFileFullPath))
Provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ImportedFileDirPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
strSQL = "SELECT Trim(TestCodeDescription)," & _
"Cdbl(NumbericMeasure) AS Measurements," & _
"Cdbl(LowerLimit) AS LowerLimit," & _
"Cdbl(UpperLimit) AS UpperLimit" & _
" " & _
"FROM [" & ImportedFileName & "]" & _
" " & _
"WHERE (IsNumeric(LowerLimit) AND IsNumeric(UpperLimit) AND IsNumeric(NumbericMeasure) AND LowerLimit<>UpperLimit AND IsDate(EventDateTime1))"
Connection.Open Provider
Recordset.Open strSQL, Connection
For i = 0 To Recordset.Fields.Count - 1
Cells(1, i + 1).Value = Recordset.Fields(i).Name
Next i
With ActiveSheet
.Range("A2").CopyFromRecordset Recordset
.Range("A1").AutoFilter
.Columns.AutoFit
End With
Recordset.Close: Set Recordset = Nothing: Connection.Close: Set Connection = Nothing
End Sub
谢谢大家,问题解决了。
所以结果证明解决方案是在与 ADO 处理的 CSV 文件相同的文件夹中创建一个 "schema.ini" 文件。
我用以下几行创建了 ini 文件,现在问题已经解决了。
[sample file for analysis.csv]
Format=CSVDelimited
Col1=SerialNumberCustomer Text
Col2=EventDateTime1 DateTime
Col3=EquipmentName Text
Col4=TestCodeDescription Text
Col5=NumbericMeasure Double
Col6=LowerLimit Double
Col7=UpperLimit Double
我遇到了同样的问题。 SQL 提供了小数但记录集返回的值没有小数。
解决方案:在我的 SQL 中,我使用了 CAST(fieldname as Double)
然后它工作正常。 Decimal(15,6)、Float 等数据类型不起作用。在我找到这个之前有点沮丧。
有人可以帮我解决这个问题吗?
问题: 我在一个模块中有下面的代码,它通常可以完美地工作,但是当我 运行 它在 this sample file 上时,我注意到 "Upper Limit" (D 列)中的小数被截断了。
我找到的一个临时解决方案是我必须在示例文件中将上限从 1 修改为 1.0(因此在末尾添加“.0”)第 26 行,使其看起来像一个十进制数。在此之后,小数被正确导入 sheet。但是,这不是解决方案。
我正在使用:
Excel 2013 (15.0.5111.1000) 32 位(办公包为:MS Office Standard 2013)并启用以下库
如何重现:
- 将下面的代码放在一个模块中,运行它在示例文件中
- 注意 D 列。从第 6 行开始,所有小数点都被删除。你会 只看到整数。
- 现在,打开示例文件(以Notepad++为例),修改
第 26 行的上限值从“1”变为“1.0”,然后保存。
- 运行 下面的代码再次出现在修改后的示例文件中,注意 D 列(上限),从第 6 行开始所有小数 出现。
知道为什么会这样吗?
Sub ADODB_Import_CSV()
ThisWorkbook.Sheets(1).Activate
ThisWorkbook.Sheets(1).Cells.Clear
Dim Connection As New ADODB.Connection
Dim Recordset As New ADODB.Recordset
On Error Resume Next
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
On Error GoTo 0
ImportedFileFullPath = Application.GetOpenFilename
If ImportedFileFullPath = False Then Exit Sub
ImportedFileDirPath = Mid(ImportedFileFullPath, 1, InStrRev(ImportedFileFullPath, "\"))
ImportedFileName = Mid(ImportedFileFullPath, InStrRev(ImportedFileFullPath, "\") + 1, Len(ImportedFileFullPath))
Provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ImportedFileDirPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"""
strSQL = "SELECT Trim(TestCodeDescription)," & _
"Cdbl(NumbericMeasure) AS Measurements," & _
"Cdbl(LowerLimit) AS LowerLimit," & _
"Cdbl(UpperLimit) AS UpperLimit" & _
" " & _
"FROM [" & ImportedFileName & "]" & _
" " & _
"WHERE (IsNumeric(LowerLimit) AND IsNumeric(UpperLimit) AND IsNumeric(NumbericMeasure) AND LowerLimit<>UpperLimit AND IsDate(EventDateTime1))"
Connection.Open Provider
Recordset.Open strSQL, Connection
For i = 0 To Recordset.Fields.Count - 1
Cells(1, i + 1).Value = Recordset.Fields(i).Name
Next i
With ActiveSheet
.Range("A2").CopyFromRecordset Recordset
.Range("A1").AutoFilter
.Columns.AutoFit
End With
Recordset.Close: Set Recordset = Nothing: Connection.Close: Set Connection = Nothing
End Sub
谢谢大家,问题解决了。
所以结果证明解决方案是在与 ADO 处理的 CSV 文件相同的文件夹中创建一个 "schema.ini" 文件。
我用以下几行创建了 ini 文件,现在问题已经解决了。
[sample file for analysis.csv]
Format=CSVDelimited
Col1=SerialNumberCustomer Text
Col2=EventDateTime1 DateTime
Col3=EquipmentName Text
Col4=TestCodeDescription Text
Col5=NumbericMeasure Double
Col6=LowerLimit Double
Col7=UpperLimit Double
我遇到了同样的问题。 SQL 提供了小数但记录集返回的值没有小数。
解决方案:在我的 SQL 中,我使用了 CAST(fieldname as Double)
然后它工作正常。 Decimal(15,6)、Float 等数据类型不起作用。在我找到这个之前有点沮丧。