Excel 从用户定义函数获取返回值时出错

Excel 从用户定义函数获取返回值时出错,excel,excel-2007,vba,Excel,Excel 2007,Vba,我的用户定义函数总是返回“公式中使用的值的数据类型错误”我正在将单元格范围传递给函数。我已经搜索了很多线程,并且非常确定我的代码应该可以工作: Function SortAndEvaluate(ByRef Probs() As Variant, ByRef ResidualProbs() As Variant, ByRef Costs() As Variant) Dim Temp As Double Dim i As Integer Dim NoExcanges As I

我的用户定义函数总是返回“公式中使用的值的数据类型错误”我正在将单元格范围传递给函数。我已经搜索了很多线程,并且非常确定我的代码应该可以工作:

Function SortAndEvaluate(ByRef Probs() As Variant, ByRef ResidualProbs() As Variant, ByRef Costs() As Variant)
    Dim Temp As Double
    Dim i As Integer
    Dim NoExcanges As Integer


    'Exchange values in probs in descending order

    Do
        NoExchanges = True
        ' Loop through each element
        For i = 0 To UBound(Probs) - 1

            'If element is greater than the last exchange, else do nothing

            If Probs(i) > Probs(i + 1) Then
                NoExchanges = False
                ' Exchange probability values
                Temp = Probs(i)
                Probs(i) = Probs(i + 1)
                Probs(i + 1) = Temp
                ' Exchange residual probability values
                Temp = ResidualProbs(i)
                ResidualProbs(i) = ResidualProbs(i + 1)
                ResidualProbs(i + 1) = Temp
                ' Exchange cost values
                Temp = Costs(i)
                Costs(i) = Costs(i + 1)
                Costs(i + 1) = Temp
            End If
        Next i
    Loop While Not (NoExchanges)

    Temp = 0
    For i = 1 To UBound(Probs)
        If i = 1 Then
            Temp = Temp + Probs(i) * Costs(i)
        Else
            Temp = Temp + Probs(i) * ResidualProbs(i - 1) * Costs(i)
        End If
    Next i

    SortAndEvaluate = Temp
End Function

有人能给我一些反馈吗?

您没有使用Option Explicit,并且您的代码中也有一个打印错误,其中您将noexchanges设置为整数

当您稍后写入NoExchanges=True时,这会隐式地使引用为NoExchanges-NoExchanges的新类型的布尔值变暗

您可能还希望显式地取消函数的返回类型:


函数SortAndEvaluateByRef Probs作为变量,ByRef ResidualProbs作为变量,ByRef Costs作为变量作为Double

原因是Excel VBA不允许用户定义的函数更改另一个单元格的值。UDF允许做的唯一一件事是将值返回到从中调用它的单元格中,但有一些小的异常

函数中不允许使用Probsi=Probsi+1行

相似

您可以使用Sub进行此操作,但您必须通过另一种方式传递单元格进行排序,可能使用选择

Option Explicit

Function SortAndEvaluate(ByRef Probs As Range, ByRef ResidualProbs As Range, ByRef Costs As Range)

    Dim NumberOfProbs As Long
    Dim NumberOfProbsRows As Long
    Dim NumberOfProbsColumns As Long
    Dim RangeAddressProbs As String

    ' Dim for ResidualProbs and Costs
    ' ...

    NumberOfProbs = Probs.Cells.Count
    NumberOfProbsRows = Probs.Rows.Count
    NumberOfProbsColumns = Probs.Columns.Count
    RangeAddressProbs = Probs.Address

    ' also for ResidualProbs and Costs
    ' ...

    ' Might want some validation, e.g.
    If NumberOfProbsColumns <> 1 Then Exit Function
    If NumberOfResidualProbsColumns <> 1 Then Exit Function

    ' Get Values from range as an array
    Dim ValuesProbs As Variant
    Dim ValuesResidualProbs As Variant
    Dim ValuesCosts As Variant

    ValuesProbs = Probs
    ValuesResidualProbs = ResidualProbs
    ValuesCosts = Costs

    ' Do your logic stuff using the Values... arrays
    ' ...

    ' This example return value shows how to reference the Values... arrays (note you need to index the column too)
    SortAndEvaluate = ValuesProbs(NumberOfProbsRows, 1)

End Function

如果您还可以提供一些示例数据传递给您的函数,这将使理解/调试更容易!开头几句话:1。使用选项2。您将NoExcHanges设置为整数,但将NoExcHanges设置为布尔值3。函数应该返回什么数据类型?+1表示选项显式!嗨,谢谢你的回复。变量Probs={0,13;0016;0004}的样本数据,剩余Probs={0,02;0004;0,00},成本={1;2;3;4}。我给出的值实际上在单独的列中,我将范围传递给函数。返回数据类型为浮点数。你能详细说明一下选项=显式部分吗?这将转到哪里?将文本选项Explicit写入。从MSDN开始,当文件中出现Explicit选项时,必须使用Dim或ReDim语句显式声明所有变量。如果试图使用未声明的变量名,则在编译时会发生错误。使用Option Explicit可避免错误键入现有变量的名称,或避免在变量范围不明确的代码中出现混淆。如果不使用Option Explicit语句,则所有未声明的变量都是对象类型。我已更正NoExchanges错误,指定了返回数据类型和声明的选项Explicit-到目前为止未成功。能否提供输入数据范围的示例以及用于调用函数的确切公式?我在任何空字段中调用函数,如下所示=SortAndEvaluateG33:G35;H33:H35;I33:I35。我在上面的一个注释中提供了示例数据。但我实际上并没有试图更改我在函数参数中引用的单元格值-我只想在函数内部对它们进行排序-而不是实际的Excel表,这样我就可以将结果返回到目标单元格。我不能复制这些值,重新排列它们,然后将结果返回到未使用的单元格中吗?我想这就是我在做的——如果我错了,请纠正我。虽然我对编程并不陌生,但对于VBA,我是一个完全的初学者。这要容易得多。您的问题是因为Probsi=Probsi+1试图更改作为引用传递的单元格的值。谢谢Justin。我现在终于得到了一个输出,而不是我在开始时得到的错误消息,但是结果总是零。为了测试为什么结果总是零,我省略了所有的逻辑部分,只是试着让我的函数输出Probs列中的第一个值,请参见附件代码。结果仍然是零。”ValuesProbs=Probs'这真的是我将值从范围传递到新数组的方式吗?编辑:问题解决了,有点输入错误!谢谢你的帮助!!