我的工作表中有一个单元格(“ 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。我不知道为什么。任何帮助都非常感谢。
答案 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