MS ACCESS OpenRecordset 四舍五入小数

Posted

技术标签:

【中文标题】MS ACCESS OpenRecordset 四舍五入小数【英文标题】:MS ACCESS OpenRecordset rounding decimals 【发布时间】:2019-03-13 15:04:21 【问题描述】:

我有一个查询显示我的产品价格并与前几个月进行比较。 Access 中的查询以 4 位小数正确显示价格,但是当我使用下面的代码导出到 Excel 时,数字被四舍五入到小数点后 2 位。 我的代码有许多我省略的格式行。请注意,我没有在 Excel 中格式化价格。我想显示整个数字。 我认为 Recordset 函数以某种方式舍入了数字。 我很感激帮助。谢谢

            Dim xlApp As Object
            Dim xlBook As Object
            Dim xlSheet As Object
            Dim i As Integer

            Dim SQL As String
            Dim rs1 As DAO.Recordset

 SQL = "SELECT tblTempCurrentPastRawPrice.ID, tblTempCurrentPastRawPrice.[Raw Material]," & _
        "tblTempCurrentPastRawPrice.Lastbought, tblTempCurrentPastRawPrice.PreviousPrice," & _
        "tblTempCurrentPastRawPrice.Newdate, tblTempCurrentPastRawPrice.LastPrice," & _
        "tblTempCurrentPastRawPrice.ReportDate FROM tblTempCurrentPastRawPrice ORDER BY tblTempCurrentPastRawPrice.[Raw Material]"


        Set rs1 = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot)


 Set xlApp = CreateObject("Excel.Application")

            xlApp.Visible = False
            Set xlBook = xlApp.Workbooks.Add
            Set xlSheet = xlBook.Worksheets(1)

    With xlSheet

   i = 7    

            Do While Not rs1.EOF


                .Range("A" & i).Value = Nz(rs1![Raw Material], "")
                .Range("B" & i).Value = Nz(rs1!Lastbought, "")
                .Range("C" & i).Value = Nz(rs1!PreviousPrice, 0)
                .Range("D" & i).Value = Nz(rs1!Newdate, 0)
                .Range("E" & i).Value = Nz(rs1!LastPrice, 0)

                i = i + 1
                rs1.MoveNext

【问题讨论】:

如果您编辑 Excel 单元格,小数点是否仍然丢失? 是的。 excel文件带有2位小数。在 Access 中显示 0.3193 如果我在 excel 中更改格式,它将是 0.3200 您在导出之前或之后更改 Excel 中的格式吗? 【参考方案1】:

有趣,我可以重现这个。发生这种情况是因为列的类型为 Currency

显然,Excel 像往常一样想要更聪明而不是对你有好处,并假设货币总是带有两位小数并四舍五入。

要轻松重现,请使用以下代码:

With xlSheet
    i = 7
    .Range("F" & i).Value = CDbl(1.2345)    ' Result: 1.2345
    .Range("G" & i).Value = CCur(1.2345)    ' Result: 1.23 €
End With

请注意,Access 中的CCur(1.2345) 仍然是1.2345

要解决这个问题,请在写入 Excel 之前转换为 Double,然后在 Excel 中将 format 转换为货币(带有 2 位或 4 位小数,在这两种情况下,数字实际上都包含所有 4 位小数) :

        With .Range("C" & i)
            .Value = CDbl(Nz(rs1!PreviousPrice, 0))
            .NumberFormat = "#,##0.0000 $"
        End With

【讨论】:

以上是关于MS ACCESS OpenRecordset 四舍五入小数的主要内容,如果未能解决你的问题,请参考以下文章

填充集合VBA MS Access - 参考问题

MS Access VBA 中的 SQL 指令

设置 rst = CurrentDb.OpenRecordset(strSQL) 返回“无效的过程调用”

OpenRecordSet 的数据类型不匹配错误

Ms Access 比较两个记录集

ms access 2003 .mdb 无法查看表