作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 VBA 中创建了一个用户定义的函数,并将其保存在 Personal.xlsb 文件中,以使其可用于所有书籍。这个函数的目的是接收一个范围和一个数字。对于范围内的所有数字,第一步是将其舍入到作为参数接收的指定数字的下一个倍数。进行四舍五入后,下一步是计算众数。功能如下:
Function ROUNDEDMODEV(rng As Variant, multiple As Variant)
' Array with the values from the selected range.
Dim cellRange() As Variant
' Copy the specified range values to array
cellRange = rng
' Looping through the array.
Dim r As Long
Dim c As Long
For r = 1 To UBound(cellRange, 1) ' First array dimension is rows.
For c = 1 To UBound(cellRange, 2) ' Second array dimension is columns.
On Error Resume Next
cellRange(r, c) = WorksheetFunction.MRound(cellRange(r, c), multiple)
Next c
Next r
ROUNDEDMODEV = WorksheetFunction.mode(cellRange)
End Function
=PERSONAL.XLSB!ROUNDEDMODEV(IF($B$2:$B$20="some text", $C$2:$Z$20),0.5)
最佳答案
考虑更改签名以使预期的数据类型更加明确:
Public Function ROUNDEDMODEV(ByVal rng As Range, ByVal multiple As Double) As Variant
Variant
可以很好地包装一个二维变体数组;考虑声明
cellRange
如下:
Dim cellRange As Variant
rng
参数是
Range
(你的是
Variant/Range
在运行时),它是一个对象,并且对象不像值那样工作 - 这个分配涉及一个名为 let coercion 的过程:
cellRange = rng
Excel.Range
的情况下类,默认成员是一个名为
[_Default]
的隐藏属性,这实际上调用了
Item
参数化时的属性...或
Value
否则属性(property)。因此,我们可以使该分配更明确地说明正在发生的事情,如下所示:
cellRange = rng.Value
For c = 1 To UBound(cellRange, 2) ' Second array dimension is columns.
On Error Resume Next
On Error GoTo 0
),所以只有第一次迭代会看到
On Error
声明有任何影响。考虑在“危险”语句之后恢复错误处理:
On Error Resume Next
cellRange(r, c) = WorksheetFunction.MRound(cellRange(r, c), multiple)
On Error GoTo 0
cellRange(r, c)
将保留
Variant/Empty
.
Variant
-返回函数使用
CVErr
产生工作表错误功能:
ROUNDEDMODEV = CVErr(xlErrValue) 'xlErrNA, etc.
Public Function ROUNDEDMODEV(ByVal rng As Range, ByVal multiple As Double) As Double
#VALUE!
错误可能意味着您的函数正在引发未处理的错误,并且从 VBA 代码(或即时 Pane )调用它会为您提供更多调试信息。
关于excel - Personal.xlsb 文件中的用户定义函数挂起 Excel。有没有办法避免这种情况并优化执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61924686/
我是一名优秀的程序员,十分优秀!