私はExcel VBAを使用しています。誰も引数の長さの制限を克服する方法について知っていますApplication.Run()
? (または、同じ仕事を行うことができ、他の機能を提案してください。)私の制約の一部である私の状況に固有30個以上の引数を持つApplication.run
:
- は、私は、文字列関数である
- と呼ばれる関数を指定する必要があります標準モジュール内
- これは関数なので、戻り値が必要なので、
Call()
は機能しません。いずれの場合においても
Iは、関数宣言に依存するいくつかの他の機能を書かれているので、私は(例えば、アレイまたはParamArray
の変形に)と呼ばれる関数のパラメータリストを変更する必要はありません。
編集:私は(ただし、元の質問をオフすることができる)、ここで私のプロジェクトの簡易版を提供することができます以下のコメントのいくつかに応じて。事実、30 argの制約を除いて、全体の設計が確立され、円滑に実行されています。
最終的な目標は、=mySpreadSheetFn("calledFn", "para1=abc", "para2=2002", ...)
のように呼び出すことができる次のスプレッドシート機能を有効にすることです。
Function calledFn(Optional para1 As String = "P1", _ Optional para2 As Integer = 202, _ Optional para3 As Boolean = True)
とmySpreadSheetFn()
コールでParamArray
に指定されているデフォルトの引数はそれに応じて置換されます。これは、その宣言かもしれ機能calledFn()
を呼び出します。同様に、エンドユーザが使用できるcalledFn2()
などがあります。だから、がmySpreadSheetFn()
の中になければなりません。
そして、ここでの関数の定義は以下のとおりです。
Type paramInfo
Val As Variant
dataType As String 'can be Enum but let's forget it for this purpose
End Type
Function mySpreadSheetFunction(fnName As String, ParamArray otherParams())
Dim fnParams As Scripting.Dictionary
' getFnDefaultParams(fn): return the defaults and data types of fn's params
' as a Dictionary. Each item is of type paramInfo (see above)
Set fnParams = getFnParams(fnName)
' For each specified arg check whether it exists for the function.
' If so, replaces the default value with the input value.
' If not exist, then just ignore it
' The problem is really not with this part so just know
' we have all the parameters resolved after the for-loop
For i = LBound(otherParams) To UBound(otherParams)
Dim myKey As String
myKey = Split(otherParams(i), "=")(0)
If fnParams.Exists(myKey) Then
' parseParam() converts the input string into required data type
fnParams(myKey).Val = parseParam(Split(otherParams(i), "=", 2)(1), _
fnParams(myKey).DataType _
)
End If
Next
' Here is the issue since the call cannot go beyond 30 args
Dim lb As Integer: lb = LBound(fnParams)
Select Case UBound(fnParams) - LBound(fnParams) + 1
Case 1: Application.Run fnName, fnParams(lb).Val
Case 2: Application.Run fnName, fnParams(lb).Val, fnParams(lb + 1).Val
' Omitted, goes until Case 30
' What to do with Case 31??
End Select
' Some other operations for each call
End Function
' An example of function that can be called by the above mySpreadSheetFn()
Function calledFn(Optional para1 As String = "P1", _
Optional para2 As Integer = 202, _
Optional para3 As Boolean = True)
' needs to return value
calledFn = para1 & para2 * 1000
End Function
これは、ユーザインタフェースが必要とされる方法であるため、フロントエンドを変更するには、どんな部屋はほとんどありません。
どのような考えですか?
引数には30個以上の引数が必要ですか? – Rory
あなたは引数が何であるかの例を挙げることができますか?おそらく、セルに値を格納し、単一の範囲を渡すことができます。何か意味のある提案をするためにもっと情報が必要になるでしょう。 – sous2817
これは設計上の問題のように聞こえます。 – Comintern