2

为此已经把我的头从桌子上敲了几个小时,并且已经在互联网上搜索了我们的chuff,所以如果我错过了一个明显的解决方案,请道歉......

我有 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)

因此,看起来 excel 只是拒绝将返回的字典从 DictFromRanges() 传递到 MinTurnsToKill() 如果它们用于位于电子表格实际单元格内的评估引擎中。

事实上,当我在电子表格单元格中执行以下操作时,它几乎就像拒绝承认 MinTurnsToKill() 甚至存在:

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

我认为必须有一种方法可以让 excel 发挥得很好,如果有人能告诉我怎么做,我将非常感激:)

干杯,

亚历克斯

4

2 回答 2

3

问题源于您将这两个函数都用作用户定义函数 (UDF),即直接从单元格中调用它们。Excel 无法处理类型的返回Scripting.Dictionary- 因此也不会将此结果传递给您的MinTurnsToKill函数。

幸运的是,Excel 可以处理Variant-如果您简单地更改这两行,那么从整个事情Scripting.Dictionary“派生”出来的内容将起作用:Variant

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

希望能解决您的问题。

附带说明:在没有看到真正的代码的情况下MinTurnsToKill,它看起来非常像HLOOKUP(或INDEX/MATCH对我来说。也许这里根本不需要 VBA?或者不使用字典,你可以使用.WorksheetFunction.Hlookup(100, [F2:L3],2,0)?!

于 2013-03-10T23:15:21.040 回答
0

请记住,当您的 DictFromRanges 返回对象时,Excel 期望每个函数返回“值”(这是基本的)。没错,在 VBA 环境中,您的解决方案工作正常,但在传递给 Excel 时会破坏函数规则。建议很简单——将两个函数组合成一个返回值的函数。

于 2013-03-10T08:26:51.973 回答