Excel VBA需求:按条件向数组添加元素并计算偏度
完善后的VBA自定义函数:计算非0值区域的偏度
嘿,我来帮你搞定这个自定义函数!你的核心思路没问题,但在数组操作、遍历逻辑和错误处理上需要调整,下面是完善后的代码,我会逐点解释改动的地方:
Function array_analysis(array_input As Range) As Double ' 声明动态数组存储非0值,计数器记录元素数量 Dim my_array() As Double Dim count As Integer Dim cell As Range Dim skew As Double ' 初始化计数器 count = 0 ' 遍历输入区域的每个单元格 For Each cell In array_input ' 跳过空单元格和0值单元格 If Not IsEmpty(cell.Value) And cell.Value <> 0 Then count = count + 1 ' 动态调整数组大小并保留已有元素 ReDim Preserve my_array(1 To count) ' 将非0值存入数组 my_array(count) = cell.Value End If Next cell ' 处理空数组情况:没有非0值时返回0 If count = 0 Then array_analysis = 0 Exit Function End If ' 错误处理:捕获偏度计算时的异常(比如元素不足3个等情况) On Error Resume Next skew = Application.WorksheetFunction.Skew(my_array) ' 如果计算出错,返回0;否则返回计算结果 If Err.Number <> 0 Then array_analysis = 0 Else array_analysis = skew End If On Error GoTo 0 ' 恢复默认错误处理 End Function
关键改动说明:
- 动态数组处理:原代码没有正确初始化和扩展数组,这里用
ReDim Preserve来动态添加元素,确保所有非0值都能被存入数组。 - 正确遍历单元格:用
For Each cell In array_input直接遍历区域内的每个单元格,避免原代码中array_input(i)的索引错误。 - 空值与0值判断:增加了
IsEmpty判断,避免空单元格被误判为0值。 - 空数组判断:如果计数器
count为0(没有找到任何非0值),直接返回0并退出函数。 - 错误捕获机制:
WorksheetFunction.Skew需要至少3个数值才能计算偏度,而且如果数组中有非数值类型会报错,这里用错误处理捕获异常,确保出错时返回0。
这样修改后,函数就能满足你的需求:提取区域内非0值计算偏度,空数组或出错时返回0。
内容的提问来源于stack exchange,提问作者JoeJackson1234
相关产品推荐
相关产品推荐

