Meerdere waarden retourneren van een aangepaste functie

Dus, ik heb een ValidateForm-functie die door een formulier loopt om elk besturingselement te valideren. Ik heb een verzameling opgezet met de naam ValData om verschillende stukjes informatie vast te leggen die uit de functie moeten worden gehaald. Dit werkt geweldig.

Ik weet echter niet hoe ik toegang moet krijgen tot elk item in ValData nadat de functie is geretourneerd. Ik kan er een tegelijk krijgen, zoals: ValidateForm (). IsValid, maar om elk item te krijgen, moet ik de functie opnieuw uitvoeren. Ik wil dit vermijden.

Is er een manier om de functie één keer uit te voeren, maar toegang te krijgen tot de waarden van elk geretourneerd artikel?

0
Toon uw huidige code
toegevoegd de auteur Tim Williams, de bron

2 antwoord

Afhankelijk van je vereisten (die NIET duidelijk zijn in je vraag! ;-)), kun je overwegen om een ​​collectie te gebruiken als de terugkeer van je functie:

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

Als een eenvoudige, achterhaalde test van het bovenstaande:

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

Hoop dat heps!

2
toegevoegd

Zonder uw code te zien, is het moeilijk om te zeggen wat u precies wilt doen, maar dit is een van de vele manieren waarop u resultaten kunt opslaan om later te kunnen zoeken.

Verklaar een publieke variabele boven aan uw module om de items uit uw ValData-functie weer te geven. Nadat u de array hebt gevuld, hebt u toegang tot de items via een normale functie.

Je zou natuurlijk meer geavanceerde dingen kunnen doen, vooral als je een collectievoorwerp gebruikt. U kunt zelfs een teller opslaan en een GetNext() -functie maken. Ik hoop dat dit je een voorsprong geeft.

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
0
toegevoegd