2

これについて数時間頭を悩ませていて、すでにインターウェブのチャフを検索しているので、明らかな解決策を見逃していたら申し訳ありません...

私は2つの機能を持っています:

Public Function DictFromRanges(rKeys As Range, rValues As Range) As Scripting.Dictionary

    Debug.Assert (rKeys.Columns.Count = rValues.Columns.Count)

    Dim rRetDict As Scripting.Dictionary
    Set rRetDict = New Scripting.Dictionary

    ' loop through ranges adding values from rValues with keys from rKeys
    Dim iKey As Integer
    For iKey = 1 To rKeys.Columns.Count
        rRetDict(rKeys.Columns(iKey).Value) = rValues.Columns(iKey).Value
    Next iKey

    ' set return value
    Set DictFromRanges = rRetDict

End Function

Public Function MinTurnsToKill(dictAttack As Scripting.Dictionary, iHealth As Integer) As Integer

   MinTurnsToKill = iHealth

End Function

スプレッドシートのセルで次の操作を行うと:

=MinTurnsToKill(DictFromRanges(F2:L2,F3:L3),100)

DictFromRanges() は、デバッガーでシングルステップすると正常に動作するようです。

MinTurnsToKill() は私の頭を悩ませているものです - 明らかに空ですが、呼び出されていません (もともとコードが含まれていましたが、呼び出されているかどうかを確認するためだけにすべて取り出しました)。

何が起こっているのかをさらにテストするために、2 つのプロキシ関数を作成しました。

Public Function Proxy(rKeys As Range, rValues As Range) As Variant

    Dim dict As Scripting.Dictionary
    Set dict = DictFromRanges(rKeys, rValues)

    Proxy = MinTurnsToKill(dict, 42)

End Function

Public Function ProxyToo(rKeys As Range, rValues As Range) As Variant

    ProxyToo = MinTurnsToKill(DictFromRanges(rKeys, rValues), 42)

End Function

Excel スプレッドシートのセルから次のように呼び出すと、これらは両方とも正常に機能します (つまり、両方とも 42 を出力します)。

=Proxy(F2:L2,F4:L4)
=ProxyToo(F2:L2,F4:L4)

そのため、スプレッドシートの実際のセル内にある評価エンジンで使用されている場合、返された辞書を DictFromRanges() から MinTurnsToKill() に渡すことを Excel が拒否しているようです。

実際、スプレッドシートのセルで次の操作を行うと、 MinTurnsToKill() が存在することさえ認めることを拒否しているように見えます。

=MinTurnsToKill(DictFromRanges(F2:L2,F3:L3),100)

エクセルでうまくプレイする方法があるに違いないと思います。どなたか教えていただければ幸いです:)

乾杯、

アレックス

4

2 に答える 2

3

この問題は、両方の関数をユーザー定義関数(UDF)として使用する、つまりセルから直接呼び出すという事実から発生します。Excelはタイプの戻りを処理できないため、この結果を関数Scripting.Dictionaryに渡しません。MinTurnsToKill

幸いなことに、Excelは処理できます。これらの2行を変更するだけでVariant、全体Scripting.Dictionaryから「派生」しVariantたものが機能します。

Public Function DictFromRanges(...) As Variant
Public Function MinTurnsToKill(dictAttack As Variant, ...

それがあなたの問題を解決することを願っています。

ちなみに、実際のコードが表示されない場合は、 (または/私には)MinTurnsToKillのように見えます。ここではVBAはまったく必要ないのでしょうか?または、辞書を使用する代わりに、?!を使用できます。HLOOKUPINDEXMATCH.WorksheetFunction.Hlookup(100, [F2:L3],2,0)

于 2013-03-10T23:15:21.040 に答える
0

DictFromRangesがオブジェクトを返す間、Excelは各関数が「値」を返すことを期待していることを覚えておいてください(これは基本です)。そうです、VBA環境ではソリューションは正常に機能しますが、Excelに渡されると関数のルールが破られます。提案は非常に簡単です。両方の関数を組み合わせて、値を返す関数にします。

于 2013-03-10T08:26:51.973 に答える