在VBA中find最小的正值(大于0)

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

-0.2 -0.7 0 0.4 0.3 0.1 

我想从上面的数组中select正值,并把它放在另一个名为Alpha的数组中,这样我就可以从Alpha中select最小的正值。 我的目标是从上面的数组中获得0.1的值。 这是我到目前为止的代码。 阿尔法得到填充好,因为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使用错误的索引。 它是基于零的,并且由于您使用i填充它,所以从1开始,您将Alpha(0)保留为默认值,即0。

WorksheetFunction.Min(Alpha)返回最小的值,你现在知道的总是为0. 🙂

你需要重新devise你的function来处理这个问题。 示例将很快出现。

编辑 – 代码示例 – 更新为UDF

我在看到您的评论之前完成了这个示例,所以在我的代码中AlphaVector是一个数组。 无论如何,显式声明任何variables总是更好,如果可以的话,避免使用Varianttypes,如果不声明variables,则使用该types。 这就是为什么我使用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 

只是一个简单的方法,你可以在Excel中的一个单元格中使用数组函数来完成这个任务。 如果您的示例编号在A1:A6中使用

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

但请确保使用Ctrl-Shift-Enter将其设置为数组公式。 VBA不是必需的。

这里的问题是你如何设置你的Alphavariables数组的尺寸。 在你的代码中,我假设你的模块没有声明Option Base 1 。 因此, Alpha的尺寸为Alpha(0 to 6) ,因为它是一个Double数组,所以第一个零元素的默认值为0.简单的修改就是将代码改为:

 ReDim Alpha(1 to N) As Double 

你可以改变到下面,更清洁:

 Function FindMinUpdated(AlphaVector As Range) 

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

结束function