これについて数時間頭を悩ませていて、すでにインターウェブのチャフを検索しているので、明らかな解決策を見逃していたら申し訳ありません...
私は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)
エクセルでうまくプレイする方法があるに違いないと思います。どなたか教えていただければ幸いです:)
乾杯、
アレックス