excel - 单元格绝对值最大值生成的宏
问题描述
数字数据流入单元格 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 中对此进行编码时遇到问题,希望能提供任何帮助。
解决方案
请试试这个功能。
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
当调用函数但被函数更改为找到最大值的行号时,请注意这是变量的第一行号。因此它的值在函数调用前后是不同的。
如果此数字低于阈值,您将不再调用宏。否则,您将调用由RowNum
and确定的宏Sign
。
推荐阅读
- python - 从列表和两个为元素提供动力的数字计算矩阵
- kubernetes - Kubernetes:如何更新 livebusybox 容器的“命令”
- python-3.x - 在 GCP 中使用 python 代码创建 VM 实例时出现问题
- python - 构建我的 SQLite 数据库的聪明方法
- php - 使用 MySQL 表获取 Moodle 中的当前用户角色
- django - 获取请求中的id参数
- r - R 编程 - 如何在 K 均值的主成分分析中找出 Dim1 和 Dim2 是什么
- python - 在 Python 3 中为每个组创建日期序列
- javascript - 如何在部署到 Vercel 的 Next.js 应用程序中正确设置环境变量?
- python - 标准化数据以进行绘图