VBA中调用MIN/MAX函数计算数组最值始终返回0的问题求解
问题原因
从Excel单元格区域直接赋值生成的Variant数组是1起始的二维数组,即使是单行、单列的小范围区域也不例外。Application.Min 计算时会自动跳过数组中的非数值类型元素:你手动修改单元格格式为「数值」的操作,只会修改单元格的显示格式,不会把单元格里存储的文本型数字转换为真正的数值类型,此时函数会判定传入数组里没有可计算的数值,最终返回默认结果0。
修复方法
- 先处理单元格底层值类型:选中目标单元格区域,点击「数据」选项卡下的「分列」按钮,直接点击弹窗里的「完成」,即可批量把文本格式存储的数字转换为真正的数值类型,仅修改单元格格式无法完成这个转换。
- 代码层面可以根据需求选两种写法:
- 不需要预存数组的场景下,直接对单元格区域调用函数,写法最简便,不会出现类型识别问题:
SmallestCapacity = Application.Min(ThisWorkbook.Worksheets(1).Range("C25:D25")) - 必须先把区域值读入数组再计算的场景下,遍历数组把所有文本型数值显式转换为数值类型后再调用Min函数:
Dim MachineCapacitySmallestArray() As Variant Dim rowIdx As Long, colIdx As Long MachineCapacitySmallestArray = ThisWorkbook.Worksheets(1).Range("C25:D25") ' 遍历二维数组做显式类型转换 For rowIdx = LBound(MachineCapacitySmallestArray, 1) To UBound(MachineCapacitySmallestArray, 1) For colIdx = LBound(MachineCapacitySmallestArray, 2) To UBound(MachineCapacitySmallestArray, 2) If IsNumeric(MachineCapacitySmallestArray(rowIdx, colIdx)) Then MachineCapacitySmallestArray(rowIdx, colIdx) = CDbl(MachineCapacitySmallestArray(rowIdx, colIdx)) End If Next Next SmallestCapacity = Application.Min(MachineCapacitySmallestArray)
- 不需要预存数组的场景下,直接对单元格区域调用函数,写法最简便,不会出现类型识别问题:
注意:如果需要计算最大值,把代码里的
Min替换为Max即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Eduards
相关产品推荐
相关产品推荐

