首页 > 解决方案 > 使用 Excel VBA 创建数字序列的奇数错误

问题描述

我正在尝试采用一系列数字范围(即:.214-.217)并创建列出该范围内每个数字的 excel 文件。这是为了在 ODK XLSform 外部 CSV 参考文件中使用。

我遇到的问题是,当某些数字结束一个范围时,它们不会写入 excel 文件。范围的其余部分被写入,当这些数字出现在范围的开头或中间时,它们被写入,但在它们结束时不被写入。到目前为止,我发现发生这种情况的数字是:.217、.010、.012

最小和最大数字被存储在单精度浮点变量数组中。当我更改为双精度 FP 变量时,写入了 .217,但没有写入 .010 和 .012。

这是我的代码:

Sub BuildODKRange()

Dim PNStr As String
Dim MinMax(1 To 7) As Double
Dim CurrentDim(1 To 4) As Double
Dim CountInt As Integer

For Each Cell In Sheets("Data").Range("A2", Range("A65536").End(xlUp))

    Cell.Activate
    PNStr = Cell.Value

    For CountInt = 1 To 7
        MinMax(CountInt) = ActiveCell.Offset(0, CountInt)
    Next CountInt

    CurrentDim(1) = MinMax(1)
    CurrentDim(2) = MinMax(3)
    CurrentDim(3) = MinMax(5)
    CurrentDim(4) = 0

    While CurrentDim(1) <= MinMax(2)
    Sheets("hss_parts_od").Range("A65536").End(xlUp).Offset(1, 0) = PNStr
    Sheets("hss_parts_od").Range("B65536").End(xlUp).Offset(1, 0) = CurrentDim(1)
    CurrentDim(1) = CurrentDim(1) + 0.001
    Wend

    While CurrentDim(2) <= MinMax(4)
    Sheets("hss_parts_id").Range("A65536").End(xlUp).Offset(1, 0) = PNStr
    Sheets("hss_parts_id").Range("B65536").End(xlUp).Offset(1, 0) = CurrentDim(2)
    CurrentDim(2) = CurrentDim(2) + 0.001
    Wend

    While CurrentDim(3) <= MinMax(6)
    Sheets("hss_parts_thk").Range("A65536").End(xlUp).Offset(1, 0) = PNStr
    Sheets("hss_parts_thk").Range("B65536").End(xlUp).Offset(1, 0) = CurrentDim(3)
    CurrentDim(3) = CurrentDim(3) + 0.001
    Wend

    While CurrentDim(4) <= MinMax(7)
    Sheets("hss_parts_conc").Range("A65536").End(xlUp).Offset(1, 0) = PNStr
    Sheets("hss_parts_conc").Range("B65536").End(xlUp).Offset(1, 0) = CurrentDim(4)
    CurrentDim(4) = CurrentDim(4) + 0.001
    Wend

Next Cell

End Sub

这是我第一次尝试在 VBA 中编码,所以如果我在这里犯了一个基本错误,我提前道歉。

这是用于生成维度列表的 excel 文件。宏已在此副本上运行,并且由它生成的数据位于 hss_part_XXXX 选项卡上。您可以在 hss_parts_conc 选项卡上看到错误行为,其中 PW002 和 PW104 的最后一个数字:Excel 文件

标签: excelvba

解决方案


这是由于浮点不精确造成的:0.001 不能精确地存储在浮点表示中,因此通过一遍又一遍地添加它,求和值的误差会增加。

您可以使用Currency数据类型而不是Double,这对于您在小数部分中使用最多四位数字时准确无误,这对于您的情况似乎没问题。


推荐阅读