@bitkoljas

Как правильно выполнять нахождение наименьшего значения из переданных в VBA?

Несколько часов не могу понять в чём проблема
Если я вставляю этот скрипт в Excel и начинаю передавать в него значения 15 значений (положительные, отрицательные и 0) весь код работает исправно за исключением нахождения наименьшего значения из переданных, почему то скрипт работает исправно только с положительными значениями, или только с отрицательными, при передаче к отрицательным положительного или 0 всё ломается, как можно поправить проблему и найти наименьшее значение из переданных?
Код:

Sub Methods()
Dim Number, Minimum, Room, Product, Data, X As Double
Dim Flag As Boolean

Flag = True

Minimum = 0
Room = 0
Product = 0

Number = InputBox("Введите количество значений в последовательности")
For X = 1 To Number Step 1
    Data = InputBox("Введите значение №" & X)
    If Data > Minimum Then
        Minimum = Data
        Room = X
    End If

    If X = 1 Then
        Minimum = Data
        Room = X
    End If
    
    If Data < 0 Then
        If Flag = True Then
            Product = Data
            Flag = False
        Else
            Product = Product * Data
        End If
    End If
    
Next X
MsgBox "Наименьшее число: " & Minimum & Chr(10) & "Его номер: " & Room & Chr(10) & "Произведение всех отрицательных значений: " & Product
End Sub


Пробовал делать так, но работает через раз
Код:

If Data < Minimum Then
        Minimum = Data
        Room = X
Else
        If Data = 0 Then
            If Not Minimum = 0 Then
                If Minimum > 0 Then
                    Minimum = Data
                    Room = X
                End If
            End If
        Else
            If Data < Minimum Then
                Minimum = Data
                Room = X
            End If
        End If
End If


Помогите разобраться
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
Krasnoarmeec
@Krasnoarmeec
Ошибок несколько:
1.
Dim Number, Minimum, Room, Product, Data, X As Double
вовсе не означает, что все переменные имеют тип Double. В VBA каждой переменной надо задавать отдельный тип:
Dim Number As Integer, Minimum As Double, Data As Double, Room As Integer, Product As Double, X As Double

Так, инициализация, которую привели Вы, инициализирует как Double только последнюю переменную. Все остальные инициализируются как Variant. Таким образом, Data у Вас получается текстовой переменной поскольку извлекается из InputBox. Это приводит к тому что "-1" < "-2" (1 < 2).

2. Из If Data > Minimum Then Вы находите не минимум, а максимум.

3. Имена, такие как"Data", "Minimum"... лучше не использовать - можете нарваться на функцию с таким же именем. В VBA Вам повезло, в других языках может и не повезти.

Работающий код:

If X = 1 Then
        Minimum = Data
        Room = X
    End If
    
    If Data < Minimum Then
        Minimum = Data
        Room = X
    End If
    
    If Data < 0 Then
        If Product = 0 Then
            Product = Data
        Else
            Product = Product * Data
        End If
    End If
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы