函数未返回期望值

时间:2019-07-03 08:38:03

标签: excel vba

我正在使用VBA函数,该函数读取另一个工作表的第11行并在该行中找到最小值。

但是,最小值的绝对值必须小于100。(该行同时显示百分比和常规值,我只需要最小值。)

这是我到目前为止的内容:(它只返回了零值)

public function up()
{
    Schema::table('users', function($table) {
        $table->foreign('department')
              ->references('name')
              ->on('teams')
              ->onUpdate('cascade')
              // ->onDelete('set null');
    });
}

sample data

1 个答案:

答案 0 :(得分:0)

以下各项的组合:

min = 0

和:

If (ActiveSheet.Cells(11, Colcount) > min) And Abs(ActiveSheet.Cells(11, Colcount) <= 100) Then

看起来它将发现数据的 maximum 值在0到100之间。如果最大数据值小于0,则看起来将返回0。

在比较的右侧部分存在一个更细微的错误:

Abs(ActiveSheet.Cells(11, Colcount) <= 100)

从问题叙述中我们知道,您希望此子句对于-100至100(含)之间的单元格值返回True,否则返回False。对于小于或等于100的单元格值,它实际上返回True,否则返回False-因此,例如,-198的单元格值会使此子句返回True。

此子句应该说的是:

Abs(ActiveSheet.Cells(11, Colcount)) <= 100

我们需要获取单元格的绝对值,然后将其与100进行比较。之前,我们将单元格的原始值与100(这将导致True或False)进行比较,然后获取True的绝对值或False(不做任何更改-True保持True,False保持False)。

要找到数据的最小值,则min必须从100开始,比较值必须为.Cells(11, Colcount) < min

将所有这些内容与bobajob和我的评论中的建议一起提供给我们:

Option Explicit

Function Loss(worksheet1 As Worksheet) As Double

Dim min As Double
Dim i As Integer
Dim myRight As Long, Colcount As Long

min = 100

With worksheet1
    myRight = .Cells(1, .Columns.Count).End(xlToLeft).Column

    On Error GoTo err_handler

    For Colcount = 1 To myRight
        If (.Cells(11, Colcount).Value < min) And (Abs(.Cells(11, Colcount).Value) <= 100) Then
            min = .Cells(11, Colcount).Value
        End If
    Next Colcount

    On Error GoTo 0
End With

Loss = min

Exit Function

err_handler:

Select Case Err.Number
' Type mismatch
Case 13:
    With worksheet1.Cells(11, Colcount)
        MsgBox "Error in column " & Colcount & "; with value " & .Value & "; of type " & TypeName(.Value)
    End With

    ' Stop running the macro
    Stop
' For all other errors, just stop
Case Else:
    ' Stop running the macro
    Stop
End Select

End Function

其他说明:

  • 我已添加Option Explicit 作为要求声明变量的第一行。这需要 在任何Subs或Function之前先移至模块顶部
  • 每次查看单元格值时,我都会指定Value属性。 尽管Value是Range对象的默认属性,但我更喜欢 指定要显式访问的属性
  • 如果要检查的工作表的第1行没有相同的列数 作为该工作表的第11行,则可能会得到错误的结果。这是 因为我们在第1行上计算myRight,但随后读取了数据 从第11行起
  • 我将函数的返回类型从Long更改为Double 匹配min的数据类型