Как правильно сравнить десятичные символы в VBA Excel? - PullRequest
2 голосов
/ 12 июня 2019

У меня проблемы с моим кодом, потому что даже если (Me.scrFoilMarkup.Max / BigNum) = i (например, 1.8 = 1.8), логическое значение все равно возвращает False.Кроме того, код заканчивается в этой точке - это означает, что программа обнаружила, что i больше Me.scrFoilMarkup.Max / BigNum при 1,8 = 1,8.Причина для BigNum, который в моем случае равен 100 000, заключается в том, что на полосе прокрутки пользовательской формы возникают проблемы с хранением десятичных чисел, поэтому я преобразую ее в целое число, чтобы предотвратить эту проблему.

В случае, если это может быть какой-либо помощи, i объявляется как Double тип

i = Me.scrFoilMarkup.Min / BigNum
j=0
Do While i <= Me.scrFoilMarkup.Max / BigNum
        ThisWorkbook.Worksheets("Simulation-Chart").Cells(2 + j, 1) = i
        i = i + ((Me.scrFoilMarkup.Max - Me.scrFoilMarkup.Min) / BigNum) / 10
        j= j + 1
Loop

Предполагая Me.scrFoilMarkup.Min / BigNum = 1,3 и Me.scrFoilMarkup.Max / BigNum = 1,8, что яДля этого нужно знать, что i действительно равно Me.scrFoilMarkup.Max / BigNum, тогда в моей электронной таблице должно быть напечатано значение i, как показано ниже, для использования в качестве значений моей диаграммы.

enter image description here

Другой код при инициализации пользовательской формы:

Me.scrFoilMarkup.Min = frmSettings.tbxFoilMarkupLow.Value * BigNum
Me.scrFoilMarkup.Max = frmSettings.tbxFoilMarkupHigh.Value * BigNum
Me.scrFoilMarkup.SmallChange = ((frmSettings.tbxFoilMarkupHigh.Value - frmSettings.tbxFoilMarkupLow.Value) / 40) * BigNum
Me.scrFoilMarkup.LargeChange = ((frmSettings.tbxFoilMarkupHigh.Value - frmSettings.tbxFoilMarkupLow.Value) / 8) * BigNum

enter image description here

Исходные параметрыФорма:

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Вы должны использовать CDbl()

MyDouble = CDbl(Me.scrFoilMarkup.Min / BigNum) ' Convert result to a Double.

Или используйте Round

MyDouble = Round((Me.scrFoilMarkup.Min / BigNum),2)

тест

Sub Test()
    sMax = 180000
    sMin = 130000
    BigNum = 100000
    i = sMin / BigNum
    j = 0
    sVar = sMax / BigNum
        Do While Round(i, 2) <= Round(sVar, 2)
            Debug.Print i
                i = i + ((sMax - sMin) / BigNum) / 10
                j = j + 1
        Loop
End Sub

Результат

enter image description here

0 голосов
/ 12 июня 2019

Попробуйте сравнить переменную и формулу с теми же типами данных и форматом

Dim i As Variant, BigNum As Long

BigNum = 100000

i = Format(Me.scrFoilMarkup.Min / BigNum, "#.0")

Do While i <= Format(Me.scrFoilMarkup.Min / BigNum, "#.0")
    i = Format(i + ((Me.scrFoilMarkup.Max - Me.scrFoilMarkup.Min) / BigNum) / 10, "#.0")
Loop

Редактировать
Чтобы обойти десятичную проблему OP

Dim i As Variant, Mx As Variant, Mn As Variant
Dim BigNum As Long

BigNum = 100000

Mn = Me.scrFoilMarkup.Min
Mx = Me.scrFoilMarkup.Max

i = Mn / BigNum

Do While i <= Mn / BigNum
    i = i + ((Mx - Mn) / BigNum) / 10
Loop
...