カスタム関数から複数の値を返す

したがって、各コントロールを検証するフォームをループするValidateForm関数があります。私は関数の外に渡される情報の異なるビットをキャプチャするためにValDataと呼ばれる集合を持っています。これは素晴らしい作品です。

しかし、関数が返ってからValDataの各項目にアクセスする方法はわかりません。私はValidateForm()。IsValidのように一度に1つを得ることができますが、各項目を取得するには、関数を再度実行する必要があります。私はこれを避けたい。

関数を一度実行する方法はありますか?返される各項目の値にアクセスしますか?

0
追加された 編集された
ビュー: 1
現在のコードを表示する
追加された 著者 Tim Williams,

2 答え

あなたの要件(あなたの質問ではっきりしない!;-))に応じて、あなたの関数からの戻り値としてCollectionを使うことを検討するかもしれません:

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

そのホープを望む!

2
追加された

あなたのコードを見ることなく、正確にあなたが何をしているのか言うのは難しいですが、ここで結果をクエリーするためにいくつかの方法の1つがあります。

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
0
追加された