(VBA) У меня есть цикл for, который ищет в массиве совпадения, и он работает для всех случаев, кроме 5/68.Зачем? - PullRequest
0 голосов
/ 26 июня 2018

В моем рабочем листе есть ячейка («I3»), которая связана со списком комбинированных списков с 68 возможными значениями, в зависимости от того, какое значение другого комбинированного списка было выбрано.Например, для краткости, чтобы продемонстрировать проблему, один из возможных размеров комбинированного списка I3 равен 11. Существует массив с именем plateMC, где в этом же сценарии его размер также равен 11. Значения первого столбца массиваи из выпадающего списка I3 начинаются с 1,8 и доходят до 2,3 с шагом 0,05.У меня есть цикл 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

Вместо того, чтобы устанавливать m равным значению массива, оно возвращается к 0 для всех чисел, перечисленных выше, которые не работают.Понятия не имею почему.Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 июня 2018

Вы сравниваете удвоения, когда синглов будет достаточно.Сравнение как Doubles приводит к увеличению количества битов для представления числа, и сравнение на эквивалентность может потерпеть неудачу из-за этой повышенной точности.Если вы создаете массив синглов и сравниваете их с «I3» как Single, используя ps = CSng(calc.Range("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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...