1

VBA の関数について初歩的な質問があります。基本的に、スカラーと行列の 2 つの出力を返す関数を作成したいと思います。ユーザーは、これらの結果を VBA の個別の変数に保存し、Excel スプレッドシートに表示できる必要があります。

私のアプローチ:

  • 明らかに2つの異なる関数を使用できますが、これはエレガントではなく、冗長な計算が含まれます

  • 2 つのプロパティを持つクラスを作成し、関数をそのクラスのインスタンスとして定義し、スカラーとマトリックスをそれらのプロパティとして格納しました。問題は、この場合、自分の結果を Excel で簡単に表示する方法がわからないことです。

    • ただし、最初の関数のそれぞれの (スカラーまたは行列) 出力を読み取るだけの 2 つの追加関数を作成できますが、これも冗長な計算になります。

ここで本当に基本的なものが欠けているのではないかと思います.いくつかのガイドラインを提供していただければ幸いです...助けてくれてありがとう:)

4

3 に答える 3

1

を使用できますByRef。最適なプランではないかもしれませんが。

Sub Example(ByRef A As String, ByRef B As String)
A = A & "Hello"
B = B & "World!"
End Sub

Sub test()
Dim A As String
Dim B As String

    A = "Test"
    B = "Test"

    Example A, B

    Debug.Print A & " " & B

End Sub

編集

ワークシートで UDF を使用できるようにしようとしている場合は、私を完全に無視できます。

ワークシートからこれを呼び出している場合 (ソリューションが何であれ)、関数に対して常に複数 (2) の呼び出しがあると思います。関数が頻繁に変更されないと仮定すると、関数の結果をキャッシュできる場合があります。呼び出しは停止しませんが、余分な計算は停止します。

Private Cache As Object

Public Function MonsterFunction(ByVal A As Integer, ByVal B As Integer, Optional ByVal Add As Boolean = False) As Variant
Dim Key As String
Dim Result As Integer

Key = CStr(A) & IIf(Add, "+", "-") & CStr(B)

If Cache Is Nothing Then
    Set Cache = CreateObject("Scripting.Dictionary")
End If

If Cache.Exists(Key) Then
    MonsterFunction = Cache(Key)
Else
    If Add Then
        Result = A + B
    Else
        Result = A - B
    End If

    Cache.Add Key, Result
    MonsterFunction = Result
End If

End Function
于 2013-08-16T20:56:46.943 に答える
1

最も簡単な方法は?おそらく:

Function TwoOutputs() As Variant()

    Dim matrix(1 To 2, 1 To 3) As Variant

    matrix(1, 1) = "Did"
    matrix(1, 2) = "it"
    matrix(1, 3) = "work?"

    matrix(2, 1) = "Yes"
    matrix(2, 2) = "it"
    matrix(2, 3) = "did!"

    TwoOutputs = Array("scalar", matrix)

End Function

次に、必要な属性にアクセスするには、次のことができます。

  • VBA 内 (0 はスカラーを返し、2 は行列を返します):

    Sub tst()
    
        Dim FunctionResult() As Variant
        Dim i As Long
        Dim j As Long
    
        FunctionResult = TwoOutputs
    
        MsgBox "Scalar: " & FunctionResult(0)
    
        For i = LBound(FunctionResult(1), 1) To UBound(FunctionResult(1), 1)
            For j = LBound(FunctionResult(1), 2) To UBound(FunctionResult(1), 2)
                MsgBox "Matrix loc(" & i & ", " & j & "): " & FunctionResult(1)(i, j)
            Next j
        Next i
    
    End Sub
    
于 2013-08-16T20:34:34.213 に答える
1

これら 2 つのプロパティを持つクラスを作成し、このクラスの新しいインスタンスを戻り値として返すことができます。その場合、呼び出しコードは両方のプロパティを読み取る必要があります。

于 2013-08-16T20:26:02.660 に答える