1

我有一个具有以下值的数组(AlphaVector):

-0.2
-0.7
0
0.4
0.3
0.1

我想从上面的数组中选择正值并将其放在另一个名为 Alpha 的数组中,以便我可以从 Alpha 中选择最小的正值。我的目标是从上面的数组中获取值 0.1。这是我到目前为止的代码。Alpha 填充正常,因为 Msgbox 指示正确的值,但我得到的返回值是 0 而不是 0.1。

Function FindMin(AlphaVector)
Dim iCount As Long
Dim N As Integer, i As Integer
N = AlphaVector.Cells.Count
Dim Alpha() As Double
ReDim Alpha(N) As Double
For i = 1 To N
    If AlphaVector(i) > 0 Then
        Alpha(i) = AlphaVector(i)
    Else
        Alpha(i) = 100000000000#
    End If
    MsgBox ("Alpha(i)= " & Alpha(i))
    MsgBox ("AlphaVector(i)= " & AlphaVector(i))
Next i
FindMin = WorksheetFunction.Min(Alpha)
End Function

你能告诉我如何解决吗?另外,如果有更高效的写法,也许不介绍Alpha,请告诉我。谢谢。

4

4 回答 4

3

您为 array 使用了错误的索引Alpha。它是从零开始的,由于您使用 填充它i,从 1 开始,您保留Alpha(0)默认值,即 0。

WorksheetFunction.Min(Alpha)返回最小值,您现在知道它始终为 0。:-)

你需要重新设计你的函数来处理这个问题。很快就会有例子。

编辑 - 代码示例 - 更新为作为 UDF 工作

我在看到您的评论之前完成了这个示例,所以在我的代码AlphaVector中是一个数组。无论如何,最好显式声明任何变量并尽可能避免使用该Variant类型,如果您不声明变量则使用该类型。这就是我使用Option Explicit. 你也应该。:-)

可能有很多方法可以做你想做的事,但这是其中之一:

Option Explicit

Function FindMin(AlphaVector)
    Dim iNew As Integer, i As Integer
    Dim iCount As Integer
    Dim Alpha() As Variant

    iCount = AlphaVector.Cells.Count

    '***** Use size of AlphaVector
    ReDim Alpha(0 To iCount - 1)
    iNew = 0

    For i = 1 To iCount
        '***** Only save values greater than 0
        If AlphaVector(i) > 0 Then
            Alpha(iNew) = AlphaVector(i)
            '***** Keep track of how many values you save
            iNew = iNew + 1
        End If
    Next i

    '***** Remove any empty items in the Alpha array
    ReDim Preserve Alpha(0 To iNew - 1)

    '***** Reture result of the Min function
    FindMin = WorksheetFunction.Min(Alpha)
End Function
于 2012-11-14T17:16:01.927 回答
2

仅供参考,您可以使用数组函数在 Excel 中的单个单元格中执行此操作。如果您的示例数字在 A1:A6 中,请使用

 =MIN(IF(A1:A6<=0,"",A1:A6))

但请确保输入它Ctrl-Shift-Enter以使其成为数组公式。不需要 VBA。

于 2012-11-14T18:49:38.000 回答
1

这里的问题是如何设置Alpha变量数组的维度。在您的代码中,我假设您的模块没有Option Base 1声明。结果,Alpha具有维度Alpha(0 to 6)并且因为它是一个Double数组,所以第一个零元素默认为 0。简单的更改是将代码更改为:

ReDim Alpha(1 to N) As Double
于 2012-11-14T17:17:43.577 回答
0

您可以更改为以下内容,更简洁:


Function FindMinUpdated(AlphaVector As Range)

Dim cell As Range Dim lowValCell As Double

lowValCell = Abs(AlphaVector(1))

For Each cell In AlphaVector

    lowValCell = IIf(cell < lowValCell And cell > 0, cell, lowValCell)

Next cell

FindMinUpdated = lowValCell

End Function

于 2012-11-14T17:58:10.510 回答