使用Excel VBA创建数字序列的奇数错误

时间:2018-08-27 14:51:03

标签: 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 File

1 个答案:

答案 0 :(得分:0)

这种情况的发生是由于浮点数的不精确性:0.001无法精确地存储在浮点数表示中,因此,一遍又一遍地将其相加会增加求和值的误差。

您可以使用Currency数据类型来代替Double,这恰好适用于小数部分中最多使用四位数字的情况,对于您的情况来说似乎可以。