首页 > 解决方案 > 单元格绝对值最大值生成的宏

问题描述

数字数据流入单元格 B8、B10、B12、B14、B16 和 B18(见下文)。

B23单元格是上述单元格任意时刻绝对值的最大值,所以B23中的公式为:=MAX(ABS($B$8),ABS($B$10),ABS($B$12),ABS( $B$14),ABS($B$16),ABS($B$18))

单元格 B5 是一个用户定义的常数,在我们的例子中是 13.00,是触发其中一个宏的阈值。

所以,在下面的例子中,B23 = 8.00,并且因为 8.00 < 13.00 没有调用宏。

然而,如果 B5 是 7.50,那么由于 B23 (8.00) >= 7.50,并且 B14 是一个正值,那么将调用 Macro_7。如果 B14 是 -8.00,那么将调用 Macro_8。

当用户按下分配有宏 START 的 START 按钮时,该过程将开始。一旦调用了宏,该过程就会结束,直到用户重新启动它。

我在 VBA 中对此进行编码时遇到问题,希望能提供任何帮助。

在此处输入图像描述

标签: excelvba

解决方案


请试试这个功能。

Function AbsoluteMaximum(RowNum As Long, _
                     Sign As Long) As Double

    Dim AbsMax  As Double                   ' variables range
    Dim Tmp     As Double                   ' temporary value
    Dim R       As Long                     ' row number
    Dim i       As Integer                  ' loop counter: iterations
    
    R = RowNum
    RowNum = 0                              ' return 0 in case of failure
    For i = 1 To 6                          ' number of cells
        Tmp = Cells(R, "B").Value
        If Abs(Tmp) > AbsMax Then
            AbsMax = Abs(Tmp)
            Sign = Sgn(Tmp)
            RowNum = R
        End If
        R = R + 2
    Next i
    AbsoluteMaximum = AbsMax
End Function

它返回 3 个值:绝对最大值、找到它的行号及其符号。该Sgn()函数返回 1 表示正数,-1 表示负数,0 表示零。

这就是您可以从 VBA 调用函数的方式。

Sub Test_AbsMax()
    Dim RowNum      As Long
    Dim Sign        As Long
    Dim AbsMax      As Double
    
    RowNum = 8                      ' start row: change to suit
    AbsMax = AbsoluteMaximum(RowNum, Sign)
    MsgBox "Absolute Max = " & AbsMax & vbCr & _
           "Sign = " & Sign & vbCr & _
           "in row number " & RowNum
End Sub

您可以将Sign 变量与类似的代码一起 使用Clm = Iif(Sign < 0, 3, 1),指定列 A 或 C 以链接到按钮。

RowNum当调用函数但被函数更改为找到最大值的行号时,请注意这是变量的第一行号。因此它的值在函数调用前后是不同的。

如果此数字低于阈值,您将不再调用宏。否则,您将调用由RowNumand确定的宏Sign


推荐阅读