Получение странных возвращаемых значений из функции при использовании VBA с Excel - PullRequest
0 голосов
/ 12 мая 2018

Я новичок и в Stack Overflow, и в VBA и надеюсь, что не повторю ранее заданный вопрос.

Проблема в том, что мне нужна функция в VBA, которая отправляет обратно 1, еслиусловие выполнено и ноль, если это не так, и я не могу заставить это работать с кодом ниже.

Sub Calculate(Total, X, Y, Z)  'doesn't work as expected

    valid_vlaue = CInt(Validity(Total, X, Y, Z))
    MsgBox valid_value


    If valid_value = 1 Then
        MsgBox "Yes, Proceed"
    ElseIf valid_value = 0 Then
        MsgBox "No, abort"
    End If


End Sub


Function Validity(Total, X, Y, Z) As Integer

    available_space = X * Y * Z
    Total = CInt(Total)
    available_space = CInt(available_space)

    'My_check = VarType(Total)
    'MsgBox My_check

    If Total <= available_space Then
        MsgBox "There is Room"
        Validity = 1
        Check = VarType(Validity)
        MsgBox Check
        Exit Function

    ElseIf Total > available_space Then
        MsgBox "There is not enough Room"
        Validity = 0
        Exit Function
    End If

End Function

Это не работает, как ожидалось, и ничего не возвращается и ложное утверждениевсегда выполняется.

Однако, когда я написал тестовую функцию, как видно ниже, все работает, как ожидалось.

Sub Test1()   'Works as expected

    Check = Test22(1)
    MsgBox Check
        If Check = 1 Then
        MsgBox "Proceed"
    ElseIf Check <> 1 Then
        MsgBox "Abort"
    End If

End Sub



Function Test22(tmp) As Integer

    If tmp = 1 Then
        Test22 = 1
        Exit Function
    ElseIf tmp <> 1 Then
        Test22 = 0
        Exit Function
    End If

End Function

Может кто-нибудь объяснить мне, что я делаю неправильно.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Поскольку валидность дает вам результат "нет", то вы можете сделать это с логическим типом (True-False)

Более того, вы можете уменьшить свой код (и ошибки!) До этого:

Option Explicit

Sub Calculate(Total As Variant, X As Variant, Y As Variant, Z As Variant)
    If Validity(Total, X, Y, Z)) Then ‘since Validity returns a boolean, you can simply check it
        MsgBox "Yes, Proceed"
    Else
        MsgBox "No, abort"
    End If
End Sub


Function Validity(Total As Variant, X As Variant, Y As Variant, Z As Variant) As Boolean
    Validity = CInt(Total) < CInt(X*Y*Z)
End Function

Наконец, поскольку функция Validity состоит только из одной строки, вы можете избавиться от нее:

Sub Calculate(Total As Variant, X As Variant, Y As Variant, Z As Variant)
    If CInt(Total) < CInt(X*Y*Z) Then ‘just make the check here!
        MsgBox "Yes, Proceed"
    Else
        MsgBox "No, abort"
    End If
End Sub
0 голосов
/ 13 мая 2018

Большое спасибо за помощь!Подобрал много полезной информации!

Суть проблемы оказалась в том, что я неправильно написала "valid_value" в верхней части.Несмотря на тщательную проверку кода перед публикацией вопроса, я почему-то пропустил это.

Я обязательно позабочусь и о советах, которые я получил здесь.

С наилучшими пожеланиями

Манге

0 голосов
/ 12 мая 2018

Я не прошел через это с тонкой зубной щёткой, но

Примечания:

  1. Поставьте Option Explicit наверху - форсируйте объявления и проверяйте орфографию, а также передавайте ли ожидаемые типы, например, valid_value или valid_vlaue
  2. Используйте Long, а не Integer, чтобы избежать переполнения.
  3. Добавьте ключевое слово ByVal в подписи. В настоящее время неявно ByRef.
  4. В явном виде укажите, Private или Public.
  5. Используйте значимые имена переменных, где это возможно, и объявляйте константы, если они постоянны. Я не реализовал это.
  6. Избегайте неявного объявления всего как вариантов. Относится к пункту 1.
  7. Удалите ненужные преобразования типов. Пройдите изначально как ожидалось Если я неправильно понял цель вашего кода, это проверить, является ли конечный результат списка чисел <или> указанной суммой.

Код:

Option Explicit

Public Sub test()
    Calculate 12, 6, 3, 3
End Sub

Public Sub Calculate(ByVal Total As Long, ByVal X As Long, ByVal Y As Long, ByVal Z As Long) 'doesn't work as expected
    Dim valid_value As Long

    valid_value = Validity(Total, X, Y, Z)
    MsgBox valid_value

    If valid_value = 1 Then
        MsgBox "Yes, Proceed"
    ElseIf valid_value = 0 Then
        MsgBox "No, abort"
    End If

End Sub

Public Function Validity(ByVal Total As Long, ByVal X As Long, ByVal Y As Long, ByVal Z As Long) As Long

    Dim available_space As Long
    available_space = X * Y * Z

    'My_check = VarType(Total)
    'MsgBox My_check

    Dim Check As Variant
    If Total <= available_space Then
        MsgBox "There is Room"
        Validity = 1
        Check = VarType(Validity)
        MsgBox Check
        Exit Function

    ElseIf Total > available_space Then
        MsgBox "There is not enough Room"
        Validity = 0
        Exit Function
    End If

End Function

Тестовый прогон:

Test run

...