Возврат нескольких значений из пользовательской функции - PullRequest
0 голосов
/ 12 ноября 2011

Итак, у меня есть функция ValidateForm, которая перебирает форму для проверки каждого элемента управления. У меня есть набор настроек под названием ValData для сбора различной информации, которая будет передана из функции. Это прекрасно работает.

Однако я не знаю, как получить доступ к каждому элементу в ValData после возврата функции. Я могу получить по одному, например: ValidateForm (). IsValid, но чтобы получить каждый элемент, мне нужно снова запустить функцию. Я хочу избежать этого.

Есть ли способ запустить функцию один раз, но получить доступ к значениям каждого возвращенного элемента?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

В зависимости от ваших требований (которые НЕ ясны в вашем вопросе! ;-)), вы можете рассмотреть возможность использования коллекции в качестве возврата из вашей функции:

Private Function MyResultsFunction() As Collection
    Dim output As Collection
    Set output = New Collection

    'Hydrate your collection with data by whatever means necessary:
    With output

        'Stupid example code:
        .Add "Item1"
        .Add "Item2"
        .Add "Item3"
        .Add "Item4"
    End With

    'Return a reference to the collection as the function output:
    Set MyResultsFunction = output

End Function

В качестве простого, запаздывающего теста из вышеперечисленного:

Private Sub Form_Load()

    'A variable to receive the results from your function:
    Dim Results As Collection

    'An iterator to loop through the results contained in the collection:
    Dim CurrentItem As Variant

    'For this example, a string to toss the results into to display in the
    'MsgBox:
    Dim output As String

    'Use the local Collection defined above to access the reference returned by
    'your function:
    Set Results = MyResultsFunction

    'Iterate through the collection and do something with the results
    'per your project requirements:
    For Each CurrentItem In Results

        'This is stupid example code:
        output = output & CurrentItem & vbCrLf
    Next

    'I am just displayng the results to show that it worked:
    MsgBox output

    'Clean up:
    Set Results = Nothing

End Sub

Надеюсь, что heps!

0 голосов
/ 12 ноября 2011

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

Объявите открытую переменную в верхней части вашего модуля, чтобы представить элементы из вашей функции ValData. После заполнения массива вы можете получить доступ к элементам через обычную функцию.

Очевидно, вы могли бы делать более сложные вещи, особенно если вы используете объект коллекции. Вы даже можете сохранить счетчик и создать функцию GetNext (). Я надеюсь, что это даст вам старт.

Public Results(1 To 2) As String

Sub CreateTestArray()
    Results(1) = "Foo"
    Results(2) = "Bar"
End Sub

Function GetResult(ByVal i As Long) As String
    If i <= UBound(Results) Then
        GetResult = Results(i)
    End If
End Function

Sub ProofOfConcept()
    MsgBox GetResult(2) ' will show "Bar"
End Sub
...