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

Arrays (VBA)我有一个for循环,用于搜索数组中的匹配项,它适用于除5/68以外的所有情况。为什么?,arrays,vba,excel,loops,for-loop,Arrays,Vba,Excel,Loops,For Loop,我的工作表中有一个单元格I3,它链接到一个组合框列表,其中包含68个可能的值,具体取决于选择的另一个组合框的值。举个例子,为了让事情简单明了,但要说明问题所在,I3组合框的一个可能大小是11。有一个名为plateMC的数组,在同一场景中,它的大小也是11。数组的第一列和I3组合框的值从1.8开始,以0.05的增量增加到2.3。我有一个For循环,从1到11运行,并在数组中搜索与单元格I3匹配的内容。它适用于1.8、1.85、2、2.1、2.15、2.2和2.25,但不适用于1.9、2.05或2.

我的工作表中有一个单元格I3,它链接到一个组合框列表,其中包含68个可能的值,具体取决于选择的另一个组合框的值。举个例子,为了让事情简单明了,但要说明问题所在,I3组合框的一个可能大小是11。有一个名为plateMC的数组,在同一场景中,它的大小也是11。数组的第一列和I3组合框的值从1.8开始,以0.05的增量增加到2.3。我有一个For循环,从1到11运行,并在数组中搜索与单元格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

对于我上面列出的所有不起作用的数字,它将变为0,而不是将m设置为数组值。我不知道为什么。非常感谢您的帮助。

您正在比较双打,而单打就足够了。比较as Double会产生更多的位来表示数字,由于精度的提高,等价性比较可能会失败。如果您创建一个单值数组,并使用ps=CSngcalc.RangeI3将它们作为一个单值与I3进行比较,您应该“找到”所有值。当三个测试值为Doubles test1=>test3时,下面的测试代码不会弹出任何消息框。但是,当它们是单打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

我建议在调试模式下检查值,或者执行debug.print以在即时屏幕中获取值。执行诸如debug.print FORMATps、、0.00000000之类的操作。我想你会发现有一些数学上的错误,你可能需要使用ROUND函数来纠正。好的,我可以确认问题出在plateMC数组上。在前面的代码中,我用for循环填充了它,其中重复的代码是plateMCi,1=1.8+i-1*0.05。在“局部变量”窗口中,它表示数组的填充方式与实际情况完全相同。但这不起作用,所以我决定明确定义不起作用的条目3,1和6,1和11,1,然后问题就解决了。我不知道为什么会这样,我想用正确的方法解决它。但是,如果这是唯一有效的方法,那么我想这是正确的方法,哈哈。谢谢!这非常有效。你能解释一下为什么当我将数组调暗为双色时,等式默认为创建单色吗?我找不到确切的答案。通常,如果依赖=运算符,比较浮点数是否相等可能是一个问题。可能对你有用。我上面关于数组默认为Singles的评论是不正确的。如果将阵列暗显为双精度,则阵列将充满双精度。由于生成的值的双重表示“略有”不同,因此等价性的双对双比较完全失败。在这种情况下,显式使用single将从生成的值中移除足够的精度,从而使等价性比较以您希望的方式成功。