Могу ли я использовать функцию для возврата двух значений? - PullRequest
1 голос
/ 14 октября 2019

могу ли я использовать функцию, которая возвращает 2 значения типа Double и Boolean?

Function FindLoop(arr, val, bol, x) As Double
    Dim r As Double, c As Double
    For r = 1 To UBound(arr, 1)
        For c = 1 To UBound(arr, 2)
            If arr(r, c) = val Then
                FindLoop = c
                Exit Function
            End If
            If c = UBound(arr, 2) Then
                FindLoop = False
                FindLoop = x
                Exit Function
            End If
        Next c
    Next r
End Function

Ответы [ 3 ]

3 голосов
/ 14 октября 2019

Вы можете использовать параметр ByRef типа Double для своей функции и установить его значение перед возвратом значения Boolean:

Function FindLoop(ByVal arr, ByVal val, ByVal bol, ByVal x, ByRef result As Double) As Boolean
    Dim r As Double, c As Double
    For r = 1 To UBound(arr, 1)
        For c = 1 To UBound(arr, 2)
            If arr(r, c) = val Then
                result = c
                FindLoop = ' TODO: return a boolean value
                Exit Function
            End If
            If c = UBound(arr, 2) Then
                result = x
                FindLoop = False
                Exit Function
            End If
        Next c
    Next r
End Function

Использование:

Sub test()
    Dim result As Double
    Dim found As Boolean
    found = FindLoop(arr, val, bol, x, result)
    If found Then
        ' Returned True. Use the result value here.
    Else
        ' Returned False. Use or discard the result value.
    End If
End Sub
2 голосов
/ 14 октября 2019

ByRef работает, как показал @Ahmed Abdelhameed. Также есть возможность использовать пользовательский тип (Type/EndType), который я считаю более чистым решением.

В модуле:

Public Type MyType
   Value1 As Long
   Value2 As Boolean
End Type

Function MyFunction(ByVal Param1 As Long, ByVal Param2 As Boolean) As MyType

   Dim udt As MyType

   With udt
      .Value1 = Param1
      .Value2 = Param2
   End With

   MyFunction = udt

End Function

Использование:

Dim udt As MyType

udt = MyFunction(1, True)
Debug.Print udt.Value1, udt.Value2 ' Results in "1 True"
0 голосов
/ 14 октября 2019

Используйте тип вывода Variant:

Function FindLoop(arr, val, bol, x) As Variant

и затем обрабатывайте его соответствующим образом, например (с использованием функции тестирования в демонстрационных целях):

Function myf(val As String) As Variant
    If val = "a" Then
        myf = True
    Else
        myf = 1.2
    End If
End Function


Sub test()
    If TypeName(myf("a")) = "Boolean" Then
        MsgBox "return type is a boolean"
    Else
        MsgBox "return type is a double"
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...