在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总是更好,如果可以的话,避免使用Variant
types,如果不声明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不是必需的。
这里的问题是你如何设置你的Alpha
variables数组的尺寸。 在你的代码中,我假设你的模块没有声明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