(VBA)我有一个for循环,用于在数组中搜索匹配项,它适用于除5/68以外的所有情况。为什么?

时间:2018-06-25 21:23:21

标签: arrays vba excel-vba loops for-loop

我的工作表中有一个单元格(“ I3”)链接到具有68个可能值的组合框列表,具体取决于选择的是另一个组合框的值。例如,为简单起见,但演示了问题,I3组合框的一个可能大小为11。有一个名为plateMC的数组,在这种情况下,其大小也为11。该数组第一列的值I3组合框的起始于1.8,然后以0.05的增量升至2.3。我有一个从1到11的For循环,并在数组中搜索与单元格I3的匹配项。它适用于1.8、1.85、2、2.1、2.15、2.2和2.25,但不适用于1.9、2.05或2.3。我不知道为什么。数据类型是相同的,问题似乎出在PlateMC阵列上,但我不知道在哪里或如何。这是代码。 (calc是工作表,n是11)

ps = CDbl(calc.Range("I3"))
For i = 1 To n
    If ps = plateMC(i, 1) Then m = plateMC(i, 2)
Next i

不是将m设置为等于数组的值,而是将上面列出的所有无效数字都设为0。我不知道为什么。任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

您正在比较单打就足够的双打。与Doubles进行比较会产生更多的比特来表示数字,并且由于精度的提高,比较等效项可能会失败。如果您创建一个Singles数组,并使用Single作为ps = CSng(calc.Range("I3"))将它们与“ I3”进行比较,则应“查找”所有值。当三个测试值为Doubles时,下面的测试代码不会弹出任何消息框(test1 => test3)。但是,当它们是Singles(test4 => test6)时,您将看到三个消息框弹出窗口。

        Sub ArrayTest()

'Create a Collection to simulate plateMC array
            Dim vals As Collection
            Set vals = New Collection
            Dim n As Integer
            n = 11

            Dim i As Integer
            For i = 1 To n
                vals.Add 1.8 + (i - 1) * 0.05
            Next i

    'Test As Double compared to Singles
            Dim test1, test2, test3 As Double
            test1 = CDbl(1.9)
            test2 = CDbl(2.05)
            test3 = CDbl(2.3)
            For i = 1 To n
                If test1 = vals.Item(i) Then
                    MsgBox CStr(test1) + " as Double Found!"
                End If
                If test2 = vals.Item(i) Then
                    MsgBox CStr(test2) + "as Double Found!"
                End If
                If test3 = vals.Item(i) Then
                    MsgBox CStr(test3) + "as Double Found!"
                End If
            Next i

    'Test As Single compared to Singles

            Dim test4, test5, test6 As Single
            test4 = CSng(1.9)
            test5 = CSng(2.05)
            test6 = CSng(2.3)
            For i = 1 To n
                If test4 = vals.Item(i) Then
                    MsgBox CStr(test4) + " as Single Found!"
                End If
                If test5 = vals.Item(i) Then
                    MsgBox CStr(test5) + " as Single Found!"
                End If
                If test6 = vals.Item(i) Then
                    MsgBox CStr(test6) + " as Single Found!"
                End If
            Next i

        End Sub