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 四舍五入小数的主要内容,如果未能解决你的问题,请参考以下文章